操作系统(6)----线程相关

简介: 操作系统(6)----线程相关

1.线程与进程的关系

可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务 (如QQ视频、文字聊天、传文件)

引入线程后,进程只作为除CPU之外的系统资源的分配单元 (如打印机、内存地址空间等都是分配给进程的)。


现在来总结一下引入线程机制后发生了哪些变化

1.传统进程机制中,进程是资源分配、调度的基本单位。引入线程后,进程是资源分配的基本单位,线程是调度的基本单位

2.传统进程机制中,只能进程间并发。引入线程后,各线程间也能并发,提升了并发度

3.传统的进程间并发,需要切换进程的运行环境,系统开销很大。线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小引入线程后,并发所带来的系统开销减小

2.线程的属性

(1)线程是处理机调度的单位

(2)多CPU计算机中,各个线程可占用不同的CPU

(3)每个线程都有一个线程ID、线程控制块 (TCB)

(4)线程也有就绪、阻塞、运行三种基本状态


(5)线程几乎不拥有系统资源


(6)同一进程的不同线程间共享进程的资源


(7)由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预


(8)同一进程中的线程切换,不会引起进程切换


(9)不同进程中的线程切换,会引起进程切换


(10)切换同进程内的线程,系统开销很小


(11)切换进程,系统开销较大

3.线程的实现方式
用户级线程

早期的操作系统 (如: 早期Unix)只支持进程不支持线程。当时的“线程”是由线程库实现的

从代码角度看,线程其实就是一段代码逻辑。上述三段代码逻辑上可以看作三个"线程",下述while循环就可以看作一个"线程库",线程库完成了对线程的管理调度工作。

很多编程语言提供了强大的线程库,可以实现线程的创建、销毁、调度等功能。那么线程的管理工作由谁完成呢?从上面的例子可以看出,线程的管理是由应用程序完成的,不需要操作系统的介入。线程的切换工作也不需要CPU参与,直接在用户态下就能完成线程的切换工作。


注:操作系统是不知道用户级线程的存在的,他只知道这是一个进程,而进程才被分为多个线程。


所以这样的线程被称为用户级线程,只有用户才知道线程的存在,操作系统是不知道的。

用户级线程的优点和缺点:

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

我们之前提到过,在引入线程后,线程是CPU调度的基本单位,但是在用户级线程中,CPU调度的基本单位还是进程

内核级线程

内核级线程(Kernel-LevelThread,KLT,又称“内核支持的线程”)是操作系统支持的线程,即操作系统视角也可以看得到的线程

那么这种实现方式线程的管理工作由谁来完成呢?由于此线程是在操作系统层面实现的线程,所以管理工作由操作系统完成。并且线程的切换需要从用户态转变为内核态。

内核级线程的优点和缺点

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

线程模型

如何将两种方式结合起来,只要在支持内核级线程的系统中,再引入线程库,就可以实现将若干个用户级线程映射到某一个内核级线程

一对一模型:

一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对一模型:

多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行,因为只有内核级线程才是处理机的分配单位,如果一个进程只对应一个内核级线程的话,在同一时间内这个进程只能被分配一个CPU的核心,若一个进程对应多个内核级线程,那么在多核CPU的环境下,这些内核级线程肯定是可以并行执行的。

多对多模型:

n用户及线程映射到m个内核级线程(n>= m)。每个用户进程对应m个内核级线程。克服了多对一模型并发度不高的缺点 (一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

总结一下:

用户级线程是"代码逻辑"的载体,而内核级线程是"运行机会"的载体,内核级线程才是处理机分配的单位。例如:多核CPU环境下,上面这个进程最多能被分配两个核。一段“代码逻辑”只有获得了“运行机会”才能被CPU执行。

内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞。

4.线程的状态和转换

线程的状态我们只关注最基本的状态:就绪,运行,阻塞

5.线程的组织与控制

要管理线程,需要给线程建立对应的数据结构,即线程控制块(TCB)。

与进程控制块(PCB)类似,当某个线程要下CPU时,某些必要的寄存器信息要保存到PCB中,当要重新上CPU时,再根据线程控制块,取出相应寄存器的值重新放到寄存器中

多个进程的PCB组织起来,就可以形成线程表

线程的组织方式有很多,可以一个进程的所有线程组成线程表,或者是所有进程的线程组成线程表,或者根据线程状态不同,组成线程表。不同的系统可以采取不同的策略。

目录
相关文章
|
3月前
|
UED 开发者 Python
探索操作系统的心脏:理解进程与线程
【8月更文挑战第31天】在数字世界的海洋中,操作系统犹如一艘巨轮,其稳定航行依赖于精密的进程与线程机制。本文将揭开这一机制的神秘面纱,通过深入浅出的语言和直观的代码示例,引领读者从理论到实践,体验进程与线程的魅力。我们将从基础概念出发,逐步深入到它们之间的联系与区别,最后探讨如何在编程实践中高效运用这些知识。无论你是初学者还是有经验的开发者,这篇文章都将为你的技术之旅增添新的航标。
|
4天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
6天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
16 2
|
8天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
2月前
|
存储 消息中间件 资源调度
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
该文章总结了操作系统基础知识中的十个关键知识点,涵盖了进程与线程的概念及区别、进程间通信方式、线程同步机制、死锁现象及其预防方法、进程状态等内容,并通过具体实例帮助理解这些概念。
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
|
27天前
|
算法 安全 调度
深入理解操作系统:进程与线程的管理
【10月更文挑战第9天】在数字世界的心脏跳动着的,不是别的,正是操作系统。它如同一位无形的指挥家,协调着硬件与软件的和谐合作。本文将揭开操作系统中进程与线程管理的神秘面纱,通过浅显易懂的语言和生动的比喻,带你走进这一复杂而又精妙的世界。我们将从进程的诞生讲起,探索线程的微妙关系,直至深入内核,理解调度算法的智慧。让我们一起跟随代码的脚步,解锁操作系统的更多秘密。
34 1
|
12天前
|
Linux 调度
探索操作系统核心:进程与线程管理
【10月更文挑战第24天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是计算机硬件与软件之间的桥梁,更是管理和调度资源的大管家。本文将深入探讨操作系统的两大基石——进程与线程,揭示它们如何协同工作以确保系统运行得井井有条。通过深入浅出的解释和直观的代码示例,我们将一起解锁操作系统的管理奥秘,理解其对计算任务高效执行的影响。
|
2月前
|
资源调度 算法 调度
深入浅出操作系统之进程与线程管理
【9月更文挑战第29天】在数字世界的庞大舞台上,操作系统扮演着不可或缺的角色,它如同一位精通多门艺术的导演,精心指挥着每一个进程和线程的演出。本文将通过浅显的语言,带你走进操作系统的内心世界,探索进程和线程的管理奥秘,让你对这位幕后英雄有更深的了解。
|
29天前
|
算法 调度 UED
探索操作系统中的多线程编程
【8月更文挑战第78天】在数字世界的复杂迷宫中,操作系统扮演着至关重要的角色。本文旨在揭开操作系统中多线程编程的神秘面纱,引导读者理解其概念、实现及应用。通过深入浅出的方式,我们将探讨如何在程序设计中运用多线程,以及这一技术如何优化软件性能和提升用户体验。文章将结合具体代码示例,展示多线程在实际应用中的魔力。无论你是编程新手还是资深开发者,这篇文章都将为你提供新的视角和思考路径。
|
2月前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
下一篇
无影云桌面