线程(Thread)的基本概念

目录

背景

进程的两个基本属性

程序并发执行所需付出的时空开销

线程——作为调度和分派的基本单位

线程与进程的比较

线程的状态与线程控制块

线程运行的三个状态

线程控制块TCB

多线程OS中的进程属性 

线程的类型

用户态线程

内核态线程

扩展

协程 (coroutine)

纤程 (Fiber)


背景

如果说,在OS中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。为什么?

进程的两个基本属性

首先让我们来回顾进程的两个基本属性:
① 进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须拥有一定的资源,包括用于存放程序正文、数据的磁盘和内存地址空间,以及它在运行时所需要的I/O设备、已打开的文件、信号量等;

进程同时又是一个可独立调度和分派的基本单位,一个进程要能独立运行,它还必须是一个可独立调度和分派的基本单位。每个进程在系统中有唯一的PCB,系统可根据其PCB感知进程的存在,也可以根据其PCB中的信息,对进程进行调度,还可将断点信息保存在其PCB中。反之,再利用进程PCB中的信息来恢复进程运行的现场。正是由于进程有这两个基本属性,才使进程成为一个能独立运行的基本单位,从而也就构成了进程并发执行的基础。

程序并发执行所需付出的时空开销

为使程序能并发执行,系统必须进行以下的一系列操作:
(1) 创建进程,系统在创建一个进程时,必须为它分配其所必需的、除处理机以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB;
(2) 撤消进程,系统在撤消进程时,又必须先对其所占有的资源执行回收操作,然后再撤消PCB;
(3) 进程切换,对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中进程的CPU环境,因而须花费不少的处理机时间

线程——作为调度和分派的基本单位

如何能使多个程序更好地并发执行,同时又尽量减少系统的开销,已成为近年来设计操作系统时所追求的重要目标。有不少研究操作系统的学者们想到,要设法将进程的上述两个属性分开,由OS分开处理,亦即并不把作为调度和分派的基本单位也同时作为拥有资源的单位,以做到“轻装上阵”;而对于拥有资源的基本单位,又不对之施以频繁的切换。正是在这种思想的指导下,形成了线程的概念。

线程与进程的比较

1.调度的基本单位
进程:在传统的OS中,进程作为独立调度和分配的基本单位,
线程:而在引入进程的操作系统中。线程变成了资源调度和分派的基本单位,可以把线程理解成 “轻量级进程”。

2.并发性
进程与进程:进程和进程可以实现并发。
进程内的各线程:也可以实现并发,从而进一步提升了并发性

3.拥有的资源
进程: 进程可以拥有资源,并作为系统中拥有资源的一个基本单位。
线程: 线程只拥有少量的,能保证独立运行的资源,还允许多个线程共享资源。

4.独立性
同一进程内的不同线程: 独立性低, 因为同一进程内的不同线程是为了提高并发性和相互之间的合作而创建的,他们共享进程内的地址空间和资源。
不同进程内的不同线程: 独立性高,为了防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其他资源,除了共享全局变量以外,不允许其他进程访问。

5.系统开销
进程:开销大。在创造或撤销进程时,系统都要为之分配和回收PCB,分配或回收其他资源(如I/O设备)
线程:开销小。不需要涉及PCB的分配,系统开销明显小于进程。并且切换线程的代价也远低于进程的切换。

6.支持多处理机系统
单线程进程: 在多处理机系统中,进程只能运行在1个处理机上。
多线程进程: 在多处理机系统中,进程可以在多个处理机上并发运行,无疑加速了进程了完成。

线程的状态与线程控制块

线程运行的三个状态

与传统的进程一样,在各线程之间也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应地,线程在运行时也具有下述三种基本状态:
(1) 执行状态,表示线程已获得处理机而正在运行;
(2) 就绪状态,指线程已具备了各种执行条件,只须再获得CPU便可立即执行;
(3) 阻塞状态,指线程在执行中因某事件受阻而处于暂停状态,例如,当一个线程执行从键盘读入数据的系统调用时,该线程就被阻塞。

线程控制块TCB

如同每个进程有一个进程控制块一样,系统也为每个线程配置了一个线程控制块TCB,将所有用于控制和管理线程的信息记录在线程控制块中。

多线程OS中的进程属性 

通常在多线程OS中的进程都包含了多个线程,并为它们提供资源。OS支持在一个进程中的多个线程能并发执行,但此时的进程就不再作为一个执行的实体。多线程OS中的进程有以下属性:
(1) 进程是一个可拥有资源的基本单位。
(2) 多个线程可并发执行。
(3) 进程已不是可执行的实体。

线程的类型

用户态线程

用函数库来实现线程。这个线程库,是位于用户空间的。
• 对操作系统来说,用户级线程具有不可见性,也称透明性。
• 应用程序可以自己定制线程调度算法。
• 同一个进程的这些线程只能占用一个核,所以做不到并行加速。

内核态线程

• 内核里就需要有用来记录系统里所有线程的线程表。当需要创建一个新线程的时候,就需要进行一个系统调用,然后由操作系统进行线程表的更新。
• 可以像调度多个进程一样,把这些线程放在好几个 CPU 核心上,做到实际上的并行。(假如线程 A 阻塞了,与他同属一个进程的线程不会被阻塞)
• 操作系统从用户态到内核态的转变是有开销的,所以内核级线程切换的代价要比用户级线程大。
• 线程表是存放在操作系统固定的表格空间或者堆栈空间里,所以内核级线程的数量是有限的,扩展性比不上用户级线程。

扩展

协程 (coroutine)

一种用户态的轻量级线程,它不依赖操作系统的线程或进程调度,而是由应用程序自己来调度协
程的执行。协程之间的切换代价非常小,可以实现高效的并发和异步编程。协程的实现方式有多种,常见的有对称协程和非对称协程。协程的使用场景主要是在需要高效的异步编程、高并发处理和任务调度的应用程序中,例如网络通信、爬虫、游戏等领域。


纤程 (Fiber)

纤程是一种最轻量化的线程(lightweight threads)。它是一种用户态线程(userthread),让应用程式可以独立决定自己的线程要如何运作。它可以在一个线程内并发执行多个协程,从而提高程序的并发性能。Java 纤程的实现方式通常是利用协程调度器来管理多个协程的执行,而协程之间的切换则由协程调度器负责。

猜你喜欢

转载自blog.csdn.net/m0_62436868/article/details/131473960