2.1.1前趋图
1.前趋图:用于描述程序执行先后顺序 P1->P2,是指一个有向无循环图。
程序的顺序执行:按照某种先后次序顺序执行,仅当前一程序执行完后,才运行后一段程序。
特征
顺序性:①指处理机严格地按照程序所规定的顺序执行,每一操作必须在下一个操作之前结束
封闭性:①程序在封闭的环境下运行,运行时独占全机资源
②资源的状态(初始状态除外)只有本程序才能改变它
③一旦程序开始执行,其执行结果不受外界因素的影响
可再现性:①只要程序执行时的环境和初始条件相同,当程序重复执行时,不论如何都可获得相同的结果
输入操作I->计算操作C->打印操作P
程序的并发执行:对于不存在前趋关系的程序之间才有可能并发执行。
特征
间断性、失去封闭性、不可再现性
2.2.1进程的定义和特征
1、定义:程序的一次执行,顺序执行时所发生的活动,是具有独立功能的程序在一个数据集合上的运行过程,是系统资源分配和调度的独立单位。
2、实体:即进程,由程序段、相关的数据段和PCB组成,所谓创建和撤销进程实际是对其中的PCB的创建和撤销。(PCB:进程控制块Process Control Block)
3、特征:
①动态性,是进程的基本特征 //程序是静态的
②并发性,指多个进程实体同存于内存中,且能在一段时间内同时运行
③独立性,指进程实体是一个独立运行,独立获得资源和独立接受调度的基本单位
④异步性,按照各自独立,不可预知的速度向前推进,其产生的结果不可再现。
2.2.2进程的基本状态及转换
1.三种基本状态(进程在其生命周期内可能有多种状态)
(1)就绪状态 Ready :指进程已处于准备好运行的状态,即进程已分配到除cpu以外的所有必要资源后,只要获得cpu,便可立即执行。其中按一定的策略(优先级策略)排成一个队列就叫就绪队列
(2)执行状态 Running :指进程已获得CPU,其程序正在执行的状态
(3)阻塞状态 block :进程执行收到阻塞(阻塞原因:I/O请求、申请缓冲区失败等) 通常系统将处于阻塞状态的进程也排成一个队列成为阻塞队列
2.三种基本状态的转换
3.创建状态和终止状态
为了满足进程控制块对数据及操作的完整性要求以及增强管理的灵活性,引入创建状态和终止状态。
(1) 创建状态
进程申请一个空白PCB,填入信息,此时创建状态尚未完成,进程不能被调度运行,进程所处的状态就叫创建状态
(2) 终止状态
- 挂起操作和进程状态的转换
- 挂起操作时,进程处于静止状态、暂停执行(执行状态下挂起),暂不接受调度(就绪状态下挂起)。是基于系统和用户的需求。
- 与挂起操作相对应的是激活状态。进程的激活active:先将进程从外存调入内存,检查进程现行状态,静止–>活动
五种状态转换图
2.2.3挂起操作和进程状态的转换
1.挂起操作的引入
(1)被动引入
①终端用户的需要
②负荷调节的需要
③操作系统的需要
以上是优先级的需要
④ 父进程请求(挂起就绪状态的进程)
2.挂起原语操作后进程状态的转换(挂起原语Suspend,激活原语Active,原语操作命令必须全执行完)
(1)活动就绪→静止就绪
①Readya + suspend →readys 此时就是静止就绪
(2)活动阻塞→静止阻塞
①Blockeda + suspend →Blockeds 此时就是活动阻塞
②当处于该状态的进程在其所期待的时间出现后,从静止阻塞变为静止就绪readys
(3)静止就绪→活动就绪
①Readys + Active → Readya
(4)静止阻塞→活动阻塞
①Blockeds + Active → Blockeda
2.2.4.进程管理中的数据结构
(1)操作系统中用于管理控制的数据结构
①在计算机系统中,对每个资源和进程设置一个数据结构称之为资源信息或进程表信息
②分为内存表,设备表,文件表,进程表(进程控制块PCB)
(2)PCB的作用
为了便于系统描述和管理进程的进行,在OS核心为每个进程专门定义了一个数据结构——PCB
作用是使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的过程
①作为独立运行基本单位的标志(PCB已成为进程存在于系统中的唯一标志)
②能实现间断性运行方式
③提供进程管理所需要的信息
④提供进程调度所需要的信息
⑤实现与其他进程的同步与通信
(3)进程块中的信息
①进程标识符(用于唯一标识一个进程)
1)外部标识符
2)内部标识符
②处理机状态
1)通用寄存器
2)指令计数器
3)程序状态字PSW
4)用户栈指针
处理机状态信息都必须保存于相应的PCB中
③进程调度信息
1)进程当前状态
2)进程优先级
3)进程调度所需其他信息
4)事件(阻塞原因)
④ 进程控制信息(管理协调)
1)程序和数据地址
2)进程同步和通信机制
3)资源清单
4)链接指针(本进程PCB所在队列中下一个进程PCB的首地址)
(4)进程控制块的组织方式
①线性方式(将该表的首址存放在内存的一个专用区域中,适合进程数目不多的系统)即将系统中所有的PCB都组织在一张线性表中,查表
②链式方式(适用广泛,具有相同状态进程的PCB链接字链接成一个队列)
1)处于阻塞状态进程的PCB根据其阻塞原因的不同,排列成多个阻塞队列
(阻塞队列原因是挂在阻塞资源上)
③ 索引方式
1)即系统根据所有状态的不同,建立几张索引表,并把各索引表在内存的首地址记录在内存的一些专用单元中
2)每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址
3)索引表是队列的一种形式
2.3.1.操作系统内核
进程控制一般是由OS内核中的原语来实现
原语:由若干条机器指令构成,用以完成特定功能的一段程序
操作系统内核:通常将一些与硬件紧密相关的模块,常用设备的驱动程序以及运行频率较高的模块,将他们常驻内存,即被称为OS的内核
目的:
1.一方面便于对这些软件进行保护,防止遭受其他应用程序的破坏
2.另一方面可以提高OS的运行效率
为了防止OS本身以及关键数据被破坏,通常将处理机的执行状态分为系统态(管态)和用户态(目态),一般情况应用程序只在用户态运行,防止应用程序对OS的破坏
OS内核包含以下两大功能:
- 支撑功能
1)中断处理
2)时钟管理
3)原语操作(是一个不可分割的基本单位,在系统态下执行,常驻内存) - 资源管理功能
1)进程管理
2)存储器管理
3)设备管理
2.3.2进程的创建
OS调用进程原语Creat 创建一个新进程
①申请空白PCB,并获得唯一数字标识符,从PCB集合中索取一个空白PCB
②为新进程分配其所需要的物理和逻辑资源,如内存,文件,I/O设备和CPU空间等
③初始化进程控制块
④如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列
进程的终止
1.引进进程终止的事件
引起原因:
① 正常结束,表示进程的任务已经完成,准备退出运行,terminal指令
②异常结束,进程在运行时发生了某种异常事件,使程序无法继续运行
1)越界错
2)保护错
3)非法指令
4)特权指令错
5)运行超时
6)算数运算错
7)I/O故障
③外界干预 进程应外界请求而终止运行
1)操作员或操作系统干预
2)父进程请求
2.3.3进程的终止过程
系统中发生了要求终止进程的某事件,OS便调用进程终止原语
PCB从所在队列(链表)中移出
2.3.4进程的阻塞与唤醒
引起进程阻塞或被唤醒的事件:
1.向系统请求共享资源失败
2.等待某种操作的完成
3.新数据尚未到达
4.等待新任务的到达
进程阻塞的过程:
进入block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,,并将PCB插入阻塞队列
进程的唤醒过程:
Wakeup的执行过程是首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
***阻塞是进程自身的一种主动行为***
***阻塞原语和唤醒原语是一对作用刚好相反的原语,在使用他们时,必须成对使用***
2.3.5进程的挂起与激活
进程的挂起OS利用挂起原语suspend将指定进程或阻塞状态的进程挂起
进程的激活是系统激活,OS将利用激活原语active将指定进程激活
2.4.1进程同步的基本概念
是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(时序)共享系统资源,并相互合作,使程序的执行具有可再现性。
两种制约关系:
在多道程序环境下,对于同处于一个系统中的多个进程,由于他们共享系统中的资源或为了完成某一任务而相互合作。
间接相互制约:由于共享系统资源,多个进程互斥访问。
直接相互制约:就是同步,一些进程像“前趋图”一样相互合作。
临界资源:
共享的外设,内存表格,硬件等都属于临界资源
临界区:
每个进程中访问临界资源的那段代码称为临界区。
(如果某一临界资源正在被某一进程访问,则本进程不能进去临界区)
①进程进入临界区前,对临界资源进行检查是否正被访问—进入区
②若未被访问,进入临界区对该资源访问,并设置“正被访问”的标志—临界区
③临界区后面代码,将临界区“正被访问”的标志恢复为“未被访问”的标志—退出区
④除进入区(entry)、临界区(critical)、退出区(exit)代码,其余代码—剩余区
同步机制应遵循的原则(临界区调用原则):
1、为实现进程互斥地进入自己的临界区
2、空闲让进、忙则等待、有限等待、让权等待
2.4.2硬件同步机制:
进程互斥的软件实现方法 (了解即可)
1.单标志法
算法思想:每个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
代码实现
解释
turn的初值为0,即刚开始只允许0号进程进入临界区。
若P1先上处理机运行,则会一直卡在⑤。直到P1的时间片用完,发生调度,切换 P0上处理机运行。代码①不会卡住P0,P0可以正常访问临界区,在 P0访问临界区期间即时切换回P1,P1依然会卡在⑤。只有P0在退出区将turn改为1后,P1才能进入临界区。
因此,该算法可以实现“同一时刻最多只允许一个进程访问临界区”
turn表示当前允许进入临界区的进程号,而只有当前允许进入临界区的进程在访问了临界区之后,才会修改turn的值。
也就是说,对于临界区的访问,一定是按P0→P1→P0→P1→…这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。
因此,单标志法存在的主要问题是:违背“空闲让进”原则。
2.双标志先检查法
算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0] =ture”意味着0号进程 P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[li]设为true,之后开始访问临界区。
若按照①⑤②⑥③⑦…(①flag【1】为假,跳出循环,刚好调度切换到⑤flag【0】为假,在调度切换到②在调度切换到⑥....)的顺序执行,P0和P1将会同时访问临界区。因此,双标志先检查法的主要问题是:违反“忙则等待”原则。
原因在于,进入区的“检查”和“上锁”(即①②和⑤⑥)两个处理不是一气呵成的。①⑤“检查”后,“上锁”前可能发生进程切换。
3.双标志后检查法
4.Peterson算法
算法思想:双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。Gary L.Peterson想到了一种方法,如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”,主动让对方先使用临界区。
Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。
Peterson算法相较于之前三种软件解决方案来说,是最好的,但依然不够好。
进程互斥的硬件实现方法
1.中断屏蔽方法
优点:简单、高效
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
2.TestAndSet指令
3.Swap指令
2.4.3信号量机制
是一种进程同步工具,广泛应用于单处理机和多处理机系统以及计算机网络
1.整形信号量
(1)应用于多处理机系统
(2)只进行三种操作:赋初值,P、V操作。
(3)PV操作是两个原子操作,执行时不可中断
(4)P:申请占用(处于忙等状态,占用CPU)
V:释放
(5)没有队列,没有遵循让权等待。
2.记录型信号量
(1)需要一个用于表示资源数目的整型变量value
(2)增加一个进程链表指针list
(3)采用了记录型的数据结构
(4)会调用block原语进行自我阻塞,遵循了“让权等待”
(5)S-value的绝对值表示该信号量链表中已阻塞进程的数目
(6)会调用wakeup原语,将S->list链表中第一个等待进程唤醒
3.AND型信号量
(1)是指一个进程同时需要多种资源,且每种占用一个时的信号量操作
(2)A/B两进程处于僵持状态,若外力作用就进入死锁状态。
(3)当进程同时要求共享的资源越多时,发生进程死锁的概率越大。
(4)AND同步机制基本思想:将进程在整个运行过程中所有需要的资源,一次性全部分配给进程,待进程使用完后一起释放。(要么全部分配,要么一个不要)
(5)当无法满足时,进程请求进入第一个无法运行的队列
4.信号量集
PV操作仅能对信号量施以加1和减1操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当需要N个单位时,则要进行N次P操作,所以,当申请的某类临界资源低于某一下限值时,不予以分配。
当进程申请某类临界资源时,在每次分配之前,都必须测试资源的数量,判断是否大于可分配的下限值,决定是否予以分配。
P(S, D,D)在次信号量集中,只有一个信号量S,但允许他每次申请D个资源,当现有资源数少于D时,不分配。
总结:①整型信号量:表示资源数目的整型量(S),仅原子操作wait(S)和signal(S)可访问,执行时不可中断。(分别被称为P、V操作)
②记录型信号量:在代表资源数目的整型变量value基础,增加一个进程链表指针list,用于链接所有等待进程。不存在“忙等”的进程同步机制。
③AND型信号量:将进程运行所需所有资源,一次性全部分配给进程,待进程使用完后再一起释放。
④信号量集:AND型信号量基础上,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放。
2.4.4信号量的应用:
1.利用信号量实现进程互斥(互斥操作):
(1)实质:利用信号量协调进程之间的竞争关系。
(2)为资源设置互斥信号量mutex,初始值1,是全局变量
(3)先P后V,PV处于同一进程
注意: 对不同的临界资源(如摄像头,打印机)需要设置不同的互斥信号量。
P、V操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。
2.利用信号量实现前趋关系(同步操作):
(1)前趋关系看前趋图好理解
(2)在进程P1和进程P2之间共享一个公共信号量S,赋初值0,全局变量,可设置若干。
(3)先V后P,PV不处于同一进程。
下面通过一个例子来解释,要求:进程2的代码4必须在进程1的代码2之后执行。
进程P1中有句代码S1,P2中有句代码S2 …P… P6中有句代码S6。这些代码要求按如下前驱图所示的顺序来执行:
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作),因此,
1.要为每一对前驱关系各设置一个同步变量
2.在“前操作”之后对相应的同步变量执行V操作
3.在“后操作”之前对相应的同步变量执行Р操作
2.4.5管程机制:
1、管程机制:
①共享资源的数据结构
②对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成的一个操作系统的资源管理模块。
“一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。”
2、管程的组成:
①管程的名称
②局部于管程的共享数据结构说明
③对该数据结构进行操作的一组过程
④对局部于管程的共享数据设置初始值的语句
管程被请求和释放资源的进程所调用。
2.5经典进程同步问题(使用信号量方法解决)
生产者——消费者问题(P–C问题)
A.记录型信号量解决PC问题
PC之间共享有界缓冲池,不再是环形缓冲区,公共缓冲池中有N个缓冲区。利用互斥信号量mutex实现进程对缓冲池的互斥作用。
1.生产者——empty信号量,表示缓冲区数量
2.消费者——full信号量,表示满缓冲区数量
3.用于实现互斥的P(mutex)和V(mutex)必须成对出现
4.对资源信号量empty和full的PV操作一样要成对出现
5.以上信号量分别处于不同程序中
6.先协调合作(同步)信号量,再协调竞争关系
- 生产者、消费者共享一个初始为空、大小为n的缓冲区。
- 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
- 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
- 缓冲区是临界资源,各进程必须互斥地访问。
如何实现
能够改变相邻P,V的顺序
B.AND信号量解决PC问题
a)用SP(empty,mutex)代替P(empty)和P(mutex)
b)用SV(mutex,full)代替V(mutex)和V(full)
c)用SP(full,mutex)代替P(full)和P(mutex)
d)用SV(mutex,empty)代替V(mutex)和V(empty)
e)P操作的顺序不能换(仔细看代码描述)
f)V操作的顺序可以换(不影响正确性,但速度变慢)
多生产者——多消费者
问题描述
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。
如何实现
问题:可不可以不使用问题信号量?
结论:即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象
原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区…
如果盘子(缓冲区)数量为2,可能会出现两个进程同时访问缓冲区的情况,有可能导致两个进程写入缓冲区的数据相互覆盖的情况。
总结
在生产者-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体问题具体分析。
建议:在考试中如果来不及仔细分析,可以加上互斥信号量,保证各进程一定会互斥地访问缓冲区。但需要注意的是,实现互斥的P操作一定要在实现同步的P操作之后,否则可能引起“死锁”。
哲学家进餐问题
不是很难,就没记
读者——写者问题(建议看着代码理解吧)
就是要允许多个进程同时读一个共享对象,读进程必须和其他进程互斥的访 问。
1.记录型信号量解决读写问题
(1)设置一个互斥信号量wmutex,再设置一个整型变量readcount表示 在读进程数目,初始值1
①“写—写”文件时是互斥资源(wmutex互斥信号量,初始值1)
②“读—读”文件时是共享资源
(2)只要有一个reader进程,就不允许writer去写
(3)Rmutex:修复readcount的互斥信号量
因为不加pv,那么第一个读者执行if满足后执行P(rw),切换第二个读者就会也满足if然后阻塞到P(rw),加上pv后,实现一气呵成并发操作实现一气呵成并发操作,第一个进程执行P(mutex)后,count为1,V(mutex)后,第二个进程即可执行P(mutex),由于count=1,所以 不会阻塞到P(rw),也执行count++,V(mutex),实现了多个读者读文件
2.6进程通信
1.进程通信是指进程之间的信息交换(交换信号量)
称为低级进程通信,低级的原因在于:
(1)效力低
(2)通信对用户不透明
2.高级进程通信,用于传送大量数据
(1)使用方便
(2)高效地传送大量数据
3.高级通信机制分为四大类:
(1)共享存储器系统
①相互通信的进程共享某些数据结构或共享存储区
1)基于共享数据结构的通信方式
a.通信效率低,属于低级通信
2)基于共享存储区的通信方式
a.在内存中共享一块存储区 b.属于高级通信
(2)管道通信系统(pipe)(半双工通信)
①管道是用于连接一个读进程和一个写进程的一个共享文件,又名 pipe文件
②向管道写进程时以字符流的形式将大量数据送入管道
③从管道读进程时按照写入管道的顺序依次读出数据
④首创于Unix,有效地传送大量数据
⑤管道机制提供三方面的协调能力
1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
2.各进程要互斥地访问管道。
3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取后,管道变空,此时读进程的read()系统调用将被阻塞。
4.如果没写满,就不允许读。如果没读空,就不允许写。
5.数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
1)互斥
2)同步(管道长度有限,顺序读取)
3)确定对方存在时再传送数据
⑥实质:共享文件通信机制
(3)消息传递系统(message passing system)
①不必借助任何共享区域和数据结构,而是以格式化的信息为单位, 利用操作系统提供的一组通信命令传递信息。
②隐藏了通信实现细节,降低了通信程序设计的复杂性和错误率
③当前应用最为广泛的一类进程通信机制
④在计算机网络中,消息称为报文。属于高级通信机制
1)直接通信方式,利用原语
2)间接通信方式,利用原语+信箱
3)非对称寻址和对称寻址
a.发送者命令接受者
b.接受者接受来自任何进程的消息
(4)客户机—服务器系统(略)
套接字、远程过程调用、远程方法调用。
2.6.2 消息传递通信的实现方式(有部分顺便整理到上面里了,便于理解)
2.6.3 直接消息传递系统实例
1. 消息缓冲队列通信机制中的数据结构:
a)消息缓冲区,主要利用的数据结构是消息缓冲区
b)PCB中采用了消息缓冲队列通信机制时。在PCB中增加消息队列首指针,以及互斥信号量mutex和资源信号量sm
2.7线程的基本概念
有的进程需要同时做很多事,例如用QQ来进行聊天,发送文件等,而传统的进程只能串行执行一系列程序。因此,引入“线程”,来增加并发度。
线程:“轻级进程”,作为调度和分派的基本单位,是程序执行流的最小单位。
/在引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。
优点:
(1)进一步提高进程并发性
(2)减少系统开销,提高进程间的通信
进程与线程间的异同:
①调度性:线程是作为调度和分派的基本单位,进程只作为资源拥有的基本单位。
②线程上下文切换比进程上下文切换快得多。
③并发性:进程间可并发执行,线程(无论在同一进程与否)间也可并发执行。
④拥有资源:进程拥有系统资源,线程本身并不拥有系统资源,仅有一点必不可少、保证独立运行的资源。多个线程可共享本进程所拥有的资源。
⑤独立性:同一进程中的不同线程之间的独立比不同进程之间的独立性低得多(进程与线程的最大差别)
⑥系统消耗:进程的创建或撤销的系统消耗“明显大于”线程的创建或撤销的系统消耗。
2.8.1线程的分类
1.用户级线程
- 用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)
- 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
- 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)
- 可以这样理解,“用户级线程”就是“从用户视角看能看到的线程”。
2.内核级线程
- 内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
- 可以这样理解,“内核级线程”就是“从操作系统内核视角看能看到的线程”。
***操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。***
多线程模型
1.多对一模型
多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
一对一模型
一对一模型:一个用户级线程映射到一个内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对多模型
多对多模型:n用户级线程映射到m个内核级线程(n >=m)。每个用户进程对应m个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点