操作系统学习笔记:进程与线程

进程的定义、组成、组织方式和特征

定义

在讲进程的定义之前,我们首先来了解程序是是什么。程序,通俗来讲就是一个指令序列。

我们都知道,在多道批处理操作系统出现之前,计算机只支持单道程序处理,也就是说在计算机当中,同一时间段内只能有一道程序运行,CPU、内存、I/O设备与其他计算机资源都只会为这一道程序服务:

在这里插入图片描述

换个角度来说,内存中同一时间段只会存在一个程序。此时内存的分配如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQNvEqYx-1637127286569)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924163510552.png)]

程序的代码(一系列指令序列)被放在程序段中,程序运行过程处理的数据被放在数据段中(如变量)。这些程序运行时的信息只需要存放在内存的某些固定位置即可,比如程序段可以存放在内存的低地址部分,数据段可以被放在高地址部分。CPU在运行时只需要去对应地址范围即可取到数据。

之后,人们引入了多道程序技术,在这一阶段,计算机当中可以有多道程序并发地执行。显而易见地,内存当中也会有多道程序在运行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvkStAsn-1637127286570)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924182506675.png)]

这个时候各个程序的代码、运算数据存放的位置不尽相同,计算机资源如I/O设备等的分配也不尽相同。操作系统为了更好的管理程序的运行,实现并发,就需要记录程序的基本信息如位置、数据等,也需要记录计算机资源的被分配情况,因此引入了进程进程实体的概念

操作系统会为每一个运行的程序配置一个数据结构,称为进程控制块(PCB)。PCB用来描述程序的各种信息(如进程代码存放位置)。PCB、程序段、数据段三个部分构成了进程实体

进程实体也成为进程映像

一般来说,我们可以把进程实体简称为进程。所谓创建进程,其实就是创建进程实体中的PCB,撤销进程,其实就是撤销进程实体种的PCB。从上面可以看出,PCB占据着及其重要的位置,所以我们可以说:PCB是进程存在的唯一标志

当然,从不同的角度,进程可以有不同的定义。比较传统典型的定义有:

  • 进程是程序的一次执行过程
  • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  • 进程是具有独立功能的程序在数据集合运行的过程,它是系统进行资源分配和调度的一个独立单位

可以发现的是,上述定义都是在强调进程的动态性,这也是进程与程序的本质区别:动态与静态的区别。

在引入进程实体的概念后,还可以把进程定义为:进程是进程实体的运行过程,是系统进行资源分配调度的一个独立单位。

组成

由于上面简称的关系,我们可以说进程(进程实体)“由程序段、数据段、PCB三部分组成”。那么问题来了,进程中的这三个部分,此时需要存放哪些信息呢?

程序段存放的信息与之前相差不大,即代码(指令序列)本身。

数据段存放的信息为程序运行时使用、产生的运算数据,如全局变量、局部变量、宏定义的常量等等。

PCB由于用于操作系统来管理进程,因此其内部包含操作系统对其进行管理所需的各种信息。

关于PCB的内容组成,可以看下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXbbHH0W-1637127286571)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924183230405.png)]

关于PID,是指当进程被创建时,操作系统为该进程分配的唯一的、不重复的ID,其用于区分不同的进程;而UIO,则是表明该进程的所属用户。关于进程的状态和优先级,会在后面做介绍。资源分配清单这里不做过多介绍。关于处理机的相关信息,主要保存各种寄存器的值,这方面主要涉及进程切换相关知识,简单点来说把当前的运行情况记录下来,方便进程切换之后还能保证回到之前的运行状态。

其实PCB的组成并不需要严格记忆下来(各教材对于PCB组成的描写可能不一致),我们只需要知道进程的管理者(操作系统)所需的数据都在PCB中即可,后续依靠题目信息进行判断;

关于程序段与数据段,就是程序本身运行所需要的数据

由此,我们可以得到下图,也就是进程的组成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rs9LFkmM-1637127286572)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924184533516.png)]

组织方式

如果进程的组成讨论的是一个进程内部有哪些构成的问题,那么进程的组织讨论的就是多个进程之间的组织方式问题。

关于进程的组织方式,主要分为链接方式索引方式两种:

  • 链接方式:操作系统会按照进程的状态将PCB分为多个队列,并且操作系统会持有各个对象的指针
  • 索引方式:操作系统会根据进程状态的不同,建立几张索引表,并且操作系统会持有各个索引表的指针

关于进程的组织方式,可以看下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dk2bRmng-1637127286573)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924185324171.png)]

可以看到的是两种方式,操作系统都会持有一系列的指针,每种指针都指向某种队列或者某种表。

关于链接方式,所持有的指针大致分为执行指针、就绪队列指针和阻塞队列指针三种:

  • 执行指针:指向当前处于运行态(执行态)的进程(的PCB)
  • 就绪队列指针:指向当前处于就绪态的进程的队列,通常来说,优先级高的进程会放在对头
  • 阻塞队列指针:指向当前处于阻塞态的进程的队列,很多操作系统还会根据阻塞原因不同,再分为多个阻塞队列。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0oNzVWY-1637127286574)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924191034539.png)]

索引方式跟链接方式很类似,分为执行指针、就绪表指针和阻塞表指针三种:

  • 执行指针:指向当前处于运行态(执行态)的进程(的PCB)
  • 就绪表指针:指向就绪索引表,表内的各个表项指向处于就绪态的进程(的PCB)
  • 阻塞表指针:指向阻塞索引表,表内的各个表项指向处于阻塞态的进程(的PCB)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nn9YHMf-1637127286575)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924191559146.png)]

上面所说的情况都是指单核处理机的环境下

特征

我们都知道,进程和程序是两个截然不同的概念,所以相比于程序,进程拥有这些的特征:动态性、并发性、独立性、异步性和结构性。

各个特征的具体内容如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbi4xZtG-1637127286576)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924191728902.png)]

需要再次强调的是:动态性是进程的最基本的特征。另外,进程是资源分配、接收调度的基本单位也经常在考试中出现。

小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQkAEN3n-1637127286578)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924193624757.png)]

进程的状态与转换

进程状态的类别

根据上面的学习我们知道进程是程序的一次执行。在这个执行过程中,有的进程正在被CPU处理,有的进程在等待CPU服务,由此可见:进程的状态是会变化的。为了方便操作系统对进程的管理,其需要将进程的状态进行合理的划分。

进程有三种基本状态:运行态(Running)、就绪态(Ready)和阻塞态(Waiting/Blocked,又称等待态),其具体内容如下图所示:

在这里插入图片描述

需要注意的是,运行态线程的数目可以根据题目所给信息进行判断,例如单核处理机环境下,每一时刻最多只有一个线程处于运行态。对于处于就绪态的线程,其已经拥有了除处理机之外所有需要的资源,一旦获得处理机(进入CPU)即可立即进入运行态开始运行。对于处于等待态的进程,其等待的原因可能是等待操作系统分配计算机、等待读磁盘操作的结果,这也是系统将其变为变为阻塞态的原因,必须先将该进程需要的资源分配到位,才能在后续环节得到CPU的服务(毕竟CPU可是很宝贵的资源)。

除了上面所说的三种基本状态,进程有没有其他状态呢?当然有:创建态和终止态。

进程的创建和撤销不是一蹴而就的,相应的,这两个阶段也应该有对应的状态来表示。

对于创建态,操作系统主要完成进程的初始化工作,比如分配内存空间(存放程序段、数据段)、创建和初始化PCB等等。在这些初始化的工作做完之后,进程才能开始正式运行。

如果进程运行结束,或者由于bug(比如数组越界)导致进程无法执行下去,这个时候就需要撤销进程。操作系统首先需要将分配给进程的计算机资源回收(比如打印机),然后对内存中该进程所耗空间进行回收,删除PCB。这就是终止态。

如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yh3lsQzM-1637127286579)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924215220672.png)]

有的书上进程的状态模型还有七状态模型,这里不做讨论

进程状态间的切换

进程有状态之间的切换,那进程到底是怎么切换的?

通过下图我们能清楚认识到进程状态的转换过程(简洁明了.jpg)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LiyOWZ98-1637127286580)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924220944433.png)]

需要注意的是:

  • 运行态->阻塞态是一种进程自身做出的主动行为,而阻塞态->就绪态不是进程自身能控制的,是一种被动行为
  • 进程不能由阻塞态直接转换为运行态(不能虎口夺食),也不能由就绪态直接转换为阻塞态(阻塞态是进程主动请求的,就绪态的时候进程还没活呢)
小结

下面是对这一小节的总结:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJ88HMXq-1637127286581)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210924221147888.png)]

其中绿框部分是考试中常考的考点。

进程控制

基本概念

进程控制主要是对系统中的所有进程实施有效的管理,它具有创建型进程、撤销已有进程、实现进程状态转换等功能。

简单点来说,进程控制就是要实现进程状态转换(比如运行->阻塞)

那如何实现进程控制呢?这里先回顾一下之间学过的进程组织问题。操作系统会把各个进程的PCB挂在对应的队列当中,对之前的模型进行细化,得到下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CqA72vDg-1637127286582)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211001104443678.png)]

这其中。PCB的状态标志位将随着所处队列的改变而改变。假如发生了这么一件事:进程从阻塞队列移动到就绪队列,而PCB的状态标志位因为外部中断,其值并没有随之变化,那操作系统将无法对该进程实施正确的调度。为了防止这种问题的发生,操作系统通常使用原语实现对进程的控制

所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断(原子操作)。其主要通过关中断指令开中断指令实现。当执行了关中断指令后,操作系统将不会受理外部中断信号,直到完成需要执行的指令,运行开中断指令,操作系统才会受理外部中断信号。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PfL0KSmi-1637127286582)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211001111427798.png)]

像上面说到的进程移动加PCB状态改变的操作,就可以放在原语中实现。

可以看到的是,关中断和开中断指令权限非常大,所以其必然是只允许在核心态下执行的命令,原语也必然是运行在核心态。

其实原语在之前的操作系统内核笔记中也有提到过

进程控制相关原语

其实原语要做的无非就是下面三件事:

  • 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
    • 所有的进程控制原语一定都会修改进程状态标志
    • 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
    • 某进程开始运行前必然要恢复期运行环境
  • 将PCB插入合适的队列
  • 分配/回收资源

操作系统为进程分配了一系列原语,这里了解一下关于进程各个状态相关的原语的作用。

创建

创建原语主要用于(作用/工作):

  • 申请空白PCB

  • 为新进程分配所需资源

  • 初始化PCB和将PCB插入就绪队列

当然,除了了解进程相关原语,这里我们也了解以下关于某种原语对应的触发事件。

引起进程创建的事件主要有:

  • 用户登录:分时系统中,用户登录成功,系统会建立为其建立一个新的进程
  • 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
  • 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
  • 应用请求:由用户进程主动请求创建一个子进程

创建原语实现了一个进程从无到创建态,再到就绪态的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BO7gHfr9-1637127286583)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211002180118079.png)]

撤销

撤销原语主要用于以下工作:

  • 从PCB集合中找到终止进程的PCB
  • 若进程正在执行,立即剥夺CPU,将CPU分配给其他进程
  • 终止其所有子进程
  • 将该进程拥有的所有资源归还给父进程或操作系统
  • 删除PCB

引起进程终止的事件主要有以下三种:

  • 正常结束
  • 异常结束
  • 外界干预

撤销原语实现了一个进程从就绪态/阻塞态/运行态到终止态,终止态到无的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W55VDulX-1637127286585)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211002180914696.png)]

阻塞与唤醒

当然,有创建和撤销,那必然有阻塞唤醒

阻塞原语的作用主要是:

  • 找到要阻塞的进程对应的PCB

  • 保护进程运行现场,将PCB状态信息设置为“阻塞态",暂时停止进程运行

  • 将PCB插入相应事件的等待队列

引起进程阻塞的事件有:

  • 需要等待系统分配某种资源
  • 需要等待相互合作的其他进程完成工作

阻塞原语实现了进程从运行态到阻塞态的转换

而进程唤醒原语的主要工作是:

  • 在事件等待队列中找到PCB
  • 将PCB从等待队列移除,设置进程为就绪态
  • 将PCB插入就绪队列,等待被调度

引起进程唤醒的事件有:等待的事件发生

唤醒原语实现了进程从阻塞态到就绪态的过程

需要注意的是,对于阻塞和唤醒,因何事阻塞,就应由何事唤醒。所以这两个种类的原语一般成对使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Z94k2GS-1637127286586)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211002180352431.png)]

切换

了解完了创建与撤销、阻塞与唤醒,还有一个很重要的内容还需要我们去学习——进程切换原语

进程切换原语的工作同样有许多种:

  • 将运行环境信息存入PCB
  • PCB移入相应队列
  • 选择另一个进程执行,并更新其PCB
  • 根据PCB恢复新进程所需的运行环境

对于进程切换,通常有以下事件会触发相关原语:

  • 当前进程时间片到
  • 有更高优先级的进程到达
  • 当前进程主动阻塞
  • 当前进程终止

进程切换相关原语会让进程从运行态转变到阻塞态/就绪态,会让就绪态进程转变到运行态

小结

下面是这一小节的整体导图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGv8Nydt-1637127286586)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211002182310675.png)]

关于原语,其实需要学习的地方有很多,这里我们只需要理解各原语可以实现怎样的状态转换、做了哪些事即可,其余不需要过多深入。

进程通信

首先,我们来了解一下什么是进程通信。顾名思义,进程通信就是指进程之间的信息交换

根据之前的学习我们都知道,进程是分配系统资源的基本单位(包含内存地址空间),也就是说,各进程拥有的内存地址空间相互独立。进程与进程之间并不能直接通信。

比如进程1和进程2同时在CPU中运行,内存中各自占有独立的空间,那么为了保证安全,进程1是无法直接访问进程2的地址空间的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNtBmSfm-1637127286587)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003170031697.png)]

可是进程之前的信息交换又是必需的,所以操作系统提供了一些方法。

对于进程通信,操作系统提供了共享存储、消息传递、管道通信三种:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iqtUVbz-1637127286589)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003173147309.png)]

共享存储

首先是共享存储。由于两个进程不能直接通信,操作系统会为它们分配一个“共享空间”,两个进程的通信就可以靠这个“共享空间”完成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9hoRNPY-1637127286590)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003173537868.png)]

需要注意的是,两个进程对于他们的“共享空间”的访问应该是互斥的,也就是说进程1访问共享空间时,进程2无法访问

互斥访问通过操作系统提供的工具(P、V操作)实现

共享存储又两种方式:基于数据结构的共享、基于存储区的共享

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCURkeZ9-1637127286591)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003202144511.png)]

  • 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
  • 基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速
    度更快,是一种高级通信方式
管道通信

管道是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟个大小固定的缓冲区,其大小一般和内存页是一样的。像Linux系统当中一个管道对应的缓冲区大小就是4KB。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96pZVdMn-1637127286591)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003203119788.png)]

需要注意的是:

  • 管道只能采用半双工通信某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
  • 各个进程需要互斥地访问
  • 数据以字符流的形式写入管道,当管道写满时,写进程write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程read()系统调用将被阻塞
  • 如果管道没有写满,就不允许读,如果没有读空,就不允许写
  • 数据一旦被读出,就从管道中被拋弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况
消息传递

消息传递是指:进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

消息包含消息头和消息体。消息头主要包括:发送进程ID、接受进程ID、消息类型、消息长度等格式化的信息(计算机网络中发送的“报文”其实就是一种格式化的消息)

消息的传递主要有两种方式:直接通信方式和间接通信方式。

对于直接通信方式:消息直接挂到接收进程的消息缓冲队列上

每一个队列都会分配一个消息缓冲队列,当进程2想要对进程1发送消息时,首先创建好消息体,然后通过原语对进程1发送消息,该消息体就会被挂到进程1的消息缓冲队列的队尾,进程1会通过原语接收消息缓冲队列上的消息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvSFJsyE-1637127286592)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003221951402.png)]

间接通信方式,也称“信箱通信方式”,在这种通信模式下,进程要先发送消息到中间实体(信箱)中,雷瑟计网中的电子邮件系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CTvGuNPg-1637127286593)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003230120299.png)]

其中过程给直接通信方式类似,也是通过原语进行消息的接收与发送。

小结

知识点导图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QnVNMvkm-1637127286594)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211003230404945.png)]

线程概念和多线程模型

什么是线程,为什么要引入线程

在引入进程之后,我们能做到在一台计算机上同时运行QQ、网抑云等等程序。但是假如QQ提供的功能,比如视频、文字聊天、传送文件等要同时进行的时候,计算机该怎么办呢,难道是顺序处理吗?这显然不符合现代用户的预期。

进程是程序的一次执行。也就是说,如果继续按照传统的操作系统实现,这些功能显然不可能是由一个程序顺序处理就能实现的。

有的进程可能“同时”需要做很多事,而传统的进程却只能串行地执行一系列程序。为了提升并发度,线程便出现了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nro25i8r-1637127286595)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117120301661.png)]

需要注意的是:在没有引入线程之前,进程是程序执行流的最小单位,引入线程之后,线程成为了程序执行流的最小单位,也就是说CPU服务(最小执行单元)的最小单位从进程变成了线程。

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

引入线程机制后,有什么变化

带来的变化主要有三个方面。

资源分配、调度:

  • 传统进程机制中,进程是资源分配、调度的基本单位

  • 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位

并发性:

  • 传统进程机制中,只能进程间并发

  • 引入线程后,各线程间也能并发,提升了并发度

系统开销:

  • 传统的进程间并发,需要切换进程的运行环境,系统开销很大

  • 线程间并发,如果是同-进程内的线程切换,则不需要切换进程环境,系统开销小

  • 引入线程后,并发所带来的系统开销减小

线程有哪些重要的属性

线程拥有如下属性:

  • 线程是处理机调度的单位
  • 多CPU计算机中,各个线程可占用不同的CPU
  • 每个线程都有一个线程ID、线程控制块(TCB)
  • 线程也有就绪、阻塞、运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程间共享进程的资源
  • 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程切换,不会引起进程切换
  • 不同进程中的线程切换,会引起进程切换
  • 切换同进程内的线程,系统开销很小
  • 切换进程,系统开销较大
线程的实现方式

线程有两种实现方式:用户级线程和内核级线程。

用户级线程

用户级线程是有应用程序通过线程库实现的,所有的线程管理工作都有应用程序负责(包括线程切换)。

在用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。

需要注意的是:对于用户级线程,在用户看来,是有多个线程存在的,但是在操作系统内核看来,并不会意识到这些线程的存在

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c98aHCMr-1637127286595)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117125824132.png)]

优缺点:

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

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

内核级线程

内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aoN6NfSD-1637127286596)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117130211554.png)]
优缺点:

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

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

组合实现

在有的操作系统中只支持内核级线程,有的能同时支持这两种线程的实现。由此诞生了二者组合使用的方式:将n个用户级线程映射到m个内核级线程中(n>=m)。

操作系统只”看得见”内核级线程,因此只有内核级线程才是处理机分配的单位

例如:下面这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。但即使该进程在一一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBlTJuSi-1637127286597)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117130627951.png)]

多线程模型

在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型。

多对一模型

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

此时处理机分配的单位是内核级线程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hSIA2QCW-1637127286598)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117131835636.png)]

多对一模型的优缺点其实就是用户级线程的优缺点。

一对一模型

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

这种情况其实就变成了存粹的内核级线程。优缺点与内核级线程的优缺点一致。
在这里插入图片描述

多对多模型

n用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLspoIqT-1637127286599)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117132224187.png)]

对于这个模型,可以这个理解:用户级线程是“代码逻辑”的载体,内核级线程是“运行机会”的载体,一段“代码逻辑”只有获得了“运行机会”才能被CPU执行。

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

小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ju5O08h0-1637127286600)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20211117133117841.png)]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值