线程
标签: 操作系统
学习人数: 7279

1. 线程的基本概念

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

回顾进程的两个基本属性①进程是一个可拥有资源的独立单位;②进程同时又是一个可独立调度和分派的基本单位,一个进程要能独立运行,它还必须是一个可独立调度和分派的基本单位。

为了使多个程序更好地并发执行,并尽量减少操作系统的开销,不少操作系统研究者考虑将进程的两个基本属性分离开来,分别交由不同的实体来实现。为此,操作系统设计者引入了线程,让线程去完成第二个基本属性的任务(作为调度和分派的基本单位),而进程只完成第一个基本属性的任务。

 

2. 线程与进程的比较

线程除了拥有自己的少量资源外,还允许多个线程共享该进程所拥有的资源,这首先表现在:属于同一进程的所有线程都具有相同的地址空间,意味着,线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的资源。

 

3.线程的状态与属性

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

1)线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态。

2)不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统把它们创建成不同的线程。

3)同一进程中的各个线程共享该进程所拥有的资源。

4)线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。

5)一个线程被创建后,便开始了它的生命周期,直至终止。

 

4.线程的实现

线程已在许多系统中实现,但各系统的实现方式并不完全相同。

(1)内核支持线程KST(Kernel Supported Threads)

是指依赖于内核,由操作系统内核完成创建和撤销工作的线程。在支持内核级线程的操作系统中,内核维护进程和线程的上下文信息并完成线程切换工作。在多处理器系统中,内核能够同时调度同一进程中的多个线程并行执行;如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其它进程中的线程;内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小;内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。

(2)用户级线程 ULT(User Level Threads)

用户级线程是在用户空间中实现的。 对线程的创建、撤消、同步与通信等功能,都无需内核的支持,即用户级线程是与内 核无关的。在一个系统中的用户级线程的数目可以达到数百个至数千个。由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道 用户级线程的存在。

线程切换不需要转换到内核空间。调度算法可以是进程专用的。用户级线程的实现与 OS 平台无关,因为对于线程管理的代码是属于用户程序的一部分,所有的应用程序都可以对之进行共享。

(3)有些OS把用户级线程和内核支持线程两种方式进行组合,提供了组合方式 ULT/KST线程。 在组合方式线程系统中,内核支持多个内核支持线程的建立、调度和管理,同时,也允许用户应用程序建立、调度和管理用户级线程。

(1)多对一模型:多对一模型将多个用户级线程映射到一个内核级线程上。此模式中,用户级线程对操作系统不可见。

优点:线程管理开销小,效率高;

缺点:一个线程如果在访问内核时发生阻塞,则整个进程都会被阻塞;此外,在任一时刻,只有一个线程能够访问内核,多个线程不能同时在多个处理机上运行。

(2)一对一模型:即将每个用户级线程映射到一个内核支持线程。

优点:当一个线程阻塞时,允许调度另一个线程运行,所以它提供了比对一模型更好的并发功能。此外,在多处理机系统中,它允许多个线程并行地运行在多处理机系统上。

缺点:每创建一个用户线程,相应地就需要创建一个内核线程,开销较大,因此需要限制整个系统的线程数。

(3)多对多模型:即将许多用户线程映射到同样数量或更少数量的内核线程上。

优点:该模型结合上述两种模型的优点,它可以像一对一模型那样,使一个进程的多个线程并行地运行在多处理机系统上,也可像多对一模型那样,减少线程管理开销和提高效率。



课后作业

课后习题

 

1. 一个进程是( )。
A.由协处理器执行的一个程序         B. 一个独立的程序+数据集
C. PCB结构与程序和数据的组合       D. —个独立的程序

【答案】C

【解析】进程映像是PCB、程序段和数据的组合,其中PCB是进程存在的唯一标志。

 

2. 下列关于线程的叙述中,正确的是(    )。
A.线程包含CPU现场,可以独立执行程序
B.每个线程有自己独立的地址空间
C.进程只能包含一个线程
D.线程之间的通信必须使用系统调用函数

【答案】A

【解析】线程是处理机调度的基本单位,当然可以独立执行程序,A对;线程没有自己独立的地址空间,它共享其所属进程的空间,B 错;进程可以创建多个线程,C 错;与进程之间线程的通信可以直接通过它们共享的存储空间,D错。

 

3. 操作系统是根据( )来对并发执行的进程进行控制和管理的。
A.进程的基本状态         B.进程控制块
C.多道程序设计           D.进程的优先权

【答案】B

【解析】在进程的整个生命周期中,系统总是通过其PCB对进程进行控制。也就是说,系统是根据进程的PCB而非任何其他因素来感知到进程存在的,PCB是进程存在的唯一标志。同时PCB常驻内存。A 和 D 选项的内容都包含在进程PCB中。

 

4. 并发进程失去封闭性,是指( )。
A.多个相对独立的进程以各自的速度向前推进
B.并发进程的执行结果与速度无关
C.并发进程执行时,在不同时刻发生的错误
D.并发进程共享变量,其执行结果与速度有关

【答案】D

【解析】程序封闭性是指进程执行的结果只取决于进程本身,不受外界影响。也就是说,进程在执行过程中不管是不停顿地执行,还是走走停停,进程的执行速度都不会改变它的执行结果。失去封闭性后,不同速度下的执行结果不同。

 

5. 下面说法正确的是( )。
A.不论是系统支持的线程还是用户级线程,其切换都需要内核的支持
B.线程是资源分配的单位,进程是调度和分派的单位
C.不管系统中是否有线程,进程都是拥有资源的独立单位
D.在引入线程的系统中,进程仍是资源调度和分派的基本单位

【答案】C

【解析】引入线程后,进程仍然是资源分配的单位。线程是处理器调度和分派的单位,线程本身不具有资源,它可以共享所属进程的全部资源,C对,B、D 明显是错的。至于A ,可以这样来理解:假如有一个内核进程,它映射到用户级后有多个线程,那么这些线程之间的切换不需要在内核级切换进程,也就不需要内核的支持。

 

6. 若一个进程实体由PCB、共享正文段、数据堆段和数据栈段组成,请指出下列C 语言程序中的内容及相关数据结构各位于哪一段中。
Ⅰ.全局赋值变量( )    Ⅱ.未赋值的局部变量( )
Ⅲ.函数调用实参传递值()    Ⅳ.用malloc()要求动态分配的存储区()
Ⅴ.常量值(如1995,“string”)( )     Ⅵ.进程的优先级( )

A. PCB    B.正文段    C.堆段    D.栈段

【答案】B、D、D、C、B、A

【解析】C语言编写的程序在使用内存时一般分为三个段,它们一般是正文段(即代码和赋值数据段)、数据堆段和数据栈段。二进制代码和常量存放在正文段,动态分配的存储区在数据堆段,临时使用的变量在数据栈段。由此,我们可以确定全局赋值变量在正文段赋值数据段,未赋值的局部变量和实参传递在栈段,动态内存分配在堆段,常量在正文段,进程的优先级只能在PCB内。

 

7. 系统动态DLL库中的系统线程,被不同的进程所调用,它们是( )的线程。
A.不同    B.相同    C.可能不同,也可能相同    D.不能被调用

【答案】D

【解析】进程实体主要是代码、数据和PCBo因此,要清楚了解PCB内所含的数据结构内容,主要 有四大类:进程标志信息、进程控制信息、进程资源信息、CPU现场信息。由上述可知,全局变量与PCB无关,它只与用户代码有关。

 

8. 【2010统考真题】下列选项中,导致创建新进程的操作是( )。
Ⅰ.用户登录成功    Ⅱ.设备分配    Ⅲ.启动程序执行

A.仅Ⅰ和Ⅱ    B.仅Ⅱ和Ⅲ    C.仅Ⅰ和Ⅲ    D. Ⅰ、Ⅱ、Ⅲ

【答案】C

【解析】用户登录成功就需要为这个用户创建进程来解释用户的各种命令操作;设备分 配由内核自动完成,不需要创建新进程;启动程序执行的目的是创建一个新进程来执行程序。

 

9. 【2012统考真题】下列关于进程和线程的叙述中,正确的是( )。
A.不管系统是否支持线程,进程都是资源分配的基本单位
B.线程是资源分配的基本单位,进程是调度的基本单位
C.系统级线程和用户级线程的切换都需要内核的支持
D.同一进程中的各个线程拥有各自不同的地址空间

【答案】A

【解析】在引入线程后,进程依然是资源分配的基本单位,线程是调度的基本单位,同一进程中的各个线程共享进程的地址空间。在用户级线程中,有关线程管理的所有工作都由应用程序完成,无须内核的干预,内核意识不到线程的存在。

 

10. 【2014统考真题】在支持多线程的系统中,进程P创建的若干线程不能共享的是( )。
A.进程P的代码段
B. 进程P中打开的文件
C. 进程P的全局变量
D. 进程P中某线程的栈指针

【答案】D

【解析】进程中的线程共享进程内的全部资源,但进程中某线程的栈指针对其他线程是透明的,不能与其他线程共享。

 

11. 【2010统考真题】下列选项中,降低进程优先级的合理时机是(  )。
A.进程时间片用完
B.进程刚完成I/O操作,进入就绪队列
C.进程长期处于就绪队列
D.进程从就绪状态转为运行状态

【答案】A

【解析】A 中进程时间片用完,可降低其优先级以让其他进程被调度进入执行状态。B 中进程刚完成I/O ,进入就绪队列等待被处理机调度,为了让其尽快处理I/O结果,因此应提高优先级。C 中进程长期处于就绪队列,为不至于产生饥饿现象,也应适当提高优先级。D 中进程的优先级不应该在此时降低,而应在时间片用完后再降低。

 

12. 【2014统考真题】一个进程的读磁盘操作完成后,操作系统针对该进程必做的是(  )。
A.修改进程状态为就绪态
B.降低进程优先级
C.给进程分配用户内存空间
D.增加进程时间片大小

【答案】A

【解析】进程申请读磁盘操作的时候,因为要等待I/O操作完成,会把自身阻塞,此时进 程就变为了阻塞状态,当 I/O操作完成后,进程得到了想要的资源,就会从阻塞态转换到就绪态(这是操作系统的行为)。而降低进程优先级、分配用户内存空间和增加进程的时间片大小都不一定会发生,选A。

 

13. 【2014统考真题】下列关于管道(Pipe)通信的叙述中,正确的是(  )。
A.一个管道可实现双向数据传输
B.管道的容量仅受磁盘容量大小限制
C.进程对管道进行读操作和写操作都可能被阻塞
D.一个管道只能有一个读进程或一个写进程对其操作

【答案】C

【解析】管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户、单独构成的一种文件系统,并且只存在于内存中。它类似于通信中半双工信道的进程通信机制,一个管道可以实现双向的数据传输,而同一时刻只能最多有一个方向的传输,不能两个方向同时进行。管道的容量大小通常为内存上的一页,它的大小并不受磁盘容量大小的限制。当管道满时,进程在写管道会被阻塞,而当管道空时,进程在读管道会被阻塞,因此选C。

 

14. 【2015统考真题】下列选项中,会导致进程从执行态变为就绪态的事件是(  )。
A.执行P(wait)操作
B.申请内存失败
C.启动I/O设备
D.被高优先级进程抢占

【答案】D

【解析】P(wait)操作表示进程请求某一资源,A、B 和 C 都因为请求某一资源会进入阻塞态,而 D 只是被剥夺了处理机资源,进入就绪态,一旦得到处理机即可运行。

 

15. 【2018统考真题】下列选项中,可能导致当前进程P阻塞的事件是(  )。

Ⅰ.进程P申请临界资源

Ⅱ.进程P从磁盘读数据

Ⅲ.系统将CPU分配给高优先级的进程
A.仅Ⅰ                        B.仅Ⅱ
C.仅Ⅰ、Ⅱ                    D.Ⅰ、Ⅱ、Ⅲ

【答案】C

【解析】进程等待某资源为可用(不包括处理机)或等待输入/输出完成均会进入阻塞态,因此I、II正确;Ⅲ中情况发生时,进程进入就绪态,因此Ⅲ错误,答案选C。

 

16. 【2019统考真题】下列选项中,可能导致当前进程P阻塞的事件是(  )。

Ⅰ.I/O结束

Ⅱ.某进程退出临界区

Ⅲ.当前进程的时间片用完
A.仅Ⅰ                        B.仅Ⅲ
C.仅Ⅰ、Ⅱ                    D.Ⅰ、Ⅱ、Ⅲ

【答案】C

【解析】当被阻塞进程等待的某资源(不包括处理机)可用时,进程将会被唤醒。I/O 结束后,等待该I/O结束而被阻塞的有关进程会被唤醒,Ⅰ正确;某进程退出临界区后,之前因需要进入该临界 区而被阻塞的有关进程会被唤醒,Ⅱ正确;当前进程的时间片用完后进入就绪队列等待重新调度,优先级最高的进程获得处理机资源从就绪态变成执行态,Ⅲ错误。

 

17. 【2019统考真题】下列关于线程的描述中,错误的是(  )。
A.内核级线程的调度由操作系统完成
B.操作系统为每个用户级线程建立一个线程控制块
C.用户级线程间的切换比内核级线程间的切换效率高
D.用户级线程可以在不支持内核级线程的操作系统上实现

【答案】B

【解析】应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口,内核为进程及其内部的每个线程维护上下文信息,调度也是在内核中由操作系统完成的,A 正确。在多线程模型中,用户级线程和内核级线程的连接方式分为多对一、一对一、多对多, “操作系统为每个用户线程建立一个线程控制块”属于一对一模型,B 错误。用户级线程的切换可以在用户空间完成,内核级线程的切换需要操作系统帮助进行调度,因此用户级线程的切换效率更高,C 正确。用户级线程的管理工作可以只在用户空间中进行,因此可以在不支持内核级线程的操作系统上实现,D 正确。

 

18. 回答下列问题:

1) 若系统中没有运行进程,是否一定没有就绪进程?为什么?

2) 若系统中既没有运行进程,又没有就绪进程,系统中是否就没有进程?为什么?

3) 在采用优先级进程调度时,运行进程是否一定是系统中优先级最高的进程?

【解答】

1) 是。若系统中未运行进程,则系统很快会选择一个就绪进程运行。只有就绪队列中无进程时,CPU才可能处于空闲状态。

2) 不一定。因为系统中的所有进程可能都处于等待态,可能处于死锁状态,也有可能因为等待的事件未发生而进入循环等待态。

3) 不一定。因为高优先级的进程有可能正处在等待队列中,进程调度会从就绪队列中选择一个进程占用CPU,这个被选中的进程可能优先级较低。

 

19.现代操作系统一般都提供多进程(或称多任务)运行环境,回答以下问题:

1) 为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构?

2) 为支持进程状态的变迁,系统至少应提供哪些进程控制原语?

3) 执行每个进程控制原语时,进程状态发生什么变化?相应的数据结构发生什么变化?

【解答】

1) 为支持多进程的并发执行,系统为每个进程建立了一个数据结构:进程控制块(PCB) ,用于进程的管理和控制。PCB中记录了有关进程的一些描述信息和控制信息,包括进程标识符、进程当前的状态、优先级、进程放弃CPU时的现场信息,以及指示组成进程的程序和数据在存储器中存放位置的信息、资源使用信息、进程各种队列的连接指针和反映进程之间的隶属关系的信息等。

2) 在进程的整个生命周期中,会经历多种状态。进程控制的主要职能是对系统中所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程的状态转换等功能。在操作系统内核中,有一组程序专门用于完成对进程的控制,这些原语至少需要包括创建新进程原语、阻塞进程原语、唤醒进程原语、终止进程原语等操作。系统服务对用户开放,即用户可以通过相应的接口来使用它们。

3) 进程创建原语:从PCB集合中申请一个空白的PCB,将调用者参数(如进程外部标识符、初始CPU状态、进程优先数、初始内存及申请资源清单等)添入该PCB,设置记账数据。置新进程为“就绪”态。终止进程原语:用于终止完成的进程,回收其所占资源。包括消去其资源描述块,消去进程的PCB。

阻塞原语:将进程从运行态变为阻塞态。进程被插入等待事件的队列,同时修改PCB中相应的表项,如进程状态和等待队列指针等。

唤醒原语:将进程从阻塞态变为就绪态。进程从阻塞队列中移出,插入就绪队列,等待调度,同时修改PCB中相应的表项,如进程状态等。

 

20 .某分时系统中的进程可能出现如下图所示的状态变化,请回答下列问题:

1)根据图示,该该系统应釆用什么进程调度策略?
2)把图中的每一个状态变化可能的原因填在表中。

【解答】

1) 根据题意,该系统采用的是时间片轮转法调度进程策略。

2)

 


登录后发布评论

1 条评论
jhfjy
2021年4月4日 16:19

加油