注:博主斥巨资买到了2021版本慕课版的pdf 如果需要的话可以来私聊我哦~
操作系统第二章知识点目录:
一、前言:前驱图与程序执行
1.1前驱图(看箭头就行,名字高级,底层简单)
1.2程序顺序执行
1.3程序并发执行
二、进程?进程!(程序的执行过程,是系统进行资源分配和调度的一个独立单位)
2.1进程的描述
2.1.1进程的定义与特征(动并独异结)
2.1.2进程的基本状态与转换
1.进程的三个基本状态(创建,终止可不是基本状态)
2.进程状态的转换
2.1.3挂起操作与进程状态的转换
2.1.4进程的组成(PCB是重点)(PCB的作用+PCB的信息组成+组成方式)
1.PCB的作用
2.PCB的信息
3.进程的组织方式(线性,链接,索引)
2.2进程控制(创建+终止+阻塞激活+挂起与激活)
2.2.1什么是进程控制?
2.2.2创建新进程(让一个进程从无到有,从创建态到就绪态)
1.进程的层次结构:(OS有,Windows没有)
2.引起进程创建的事件+进程的创建原语(重要)
2.2.3进程的终止(引起事件+终止原语)
2.2.4进程的阻塞与唤醒
2.2.5进程的挂起和激活
2.3进程通信(没有写客户机-服务器系统)
2.3.1什么是进程通信?
2.3.2为什么进程通信需要操作系统支持?
2.3.3进程的三种通信方式(共享存储系统+消息传递系统+管道通信系统)
1.共享存储系统(基于数据结构+基于存储区)
2.消息传递系统(直接通信方式+间接通信方式)
2.3.4实现方式(详情见课本P58,59)
三、线程?线程!(调度和分派的基本单位,也是独立运行的基本单位)
3.1什么是线程?为什么要引入线程?
3.2进程和线程的一些差别
3.3线程的属性(俩个基本属性在3.1介绍了)
3.4线程的实现方式(知识点较多)
3.4.1内核支持线程(操作系统内核视角可以看到的线程)
3.4.2用户级线程(好好理解图片例子)
3.4.3多线程模型(还是有些不懂,问问尹老师)
3.5线程的状态与转换
3.6线程的组织和控制
在单道批处理系统和早期未配置OS的计算机系统中,程序的执行方式是顺序执行,即在内存中仅装入一道程序,由它独占系统的所有资源;在多道程序系统中,由于内存中可以同时装入多个程序,它们可以共享系统资源、并发执行,这显然可以克服上述缺点
所谓前趋图(precedence graph),是指一个有向无环图(directed acyclic graph,DAG),
它用于描述进程之间执行的先后顺序。图中的每个节点均可用于表示一个进程或一段程序,甚
至是一条语句,节点间的有向边则表示两个节点之间所存在的偏序(partial order)或前趋关系(precedence relation)
定义:一个程序由若干个程序段组成,每个程序段负责完成特定的功能,且它们都需要
按照某种先后次序被顺序运行,仅当前一程序段运行完成后
特征:
- 顺序性
- 封装性
- 可再现性
例子:
S1: a ∶=x+2; S2: b ∶=y+4; S3: c ∶=a+b; S4: d ∶=c+b;
S1与S2就是并发执行
特征:
- 间断性
- 失去封闭性
- 不可再现性
通俗点讲:进程是动态的,是程序的一次执行过程(同一个程序多次执行会对应多个进程)
和程序相比较,进程是动态的,程序是静态的,程序就是存放在磁盘中的可执行文件而已
定义:进程是程序的执行过程,是系统进行资源分配和调度的一个独立单位
调度:一个程序被调度,也就是说明操作系统决定让这个进程在CPU上运行
小羊注:PCB是进程存在的唯一标志!
进程的特征(动态,并发,独立,异步,结构):
- 动态性:进程的实质是程序的执行过程,因此,动态性就是进程最基本的特征
- 并发性:多个进程共存于内存中,且能在一段时间内同时执行
- 独立性:进程是一个能够独立运行、独立获得资源、独立接受调度的基本单位
(独立性是课本上没有的)
- 异步性:各自独立的、不可预知的速度向前推进(使得执行结果不确定)
- 结构性:每个进程都会配置PCB。从结构上看,进程=程序段+数据集+PCB
答:程序不被创建进程并运行的话,可以认为就只是普通的可执行文件或者是源代码文件
(1)就绪(ready)状态:已经具备运行条件,但是没有空闲CPU,而暂时不可以运行
(2)执行(running)状态:占有CPU,在CPU上运行
(3)阻塞(block)状态:因等待某一事件而暂时不可以运行
创建态:申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后,为该进程分配运行时所必需的资源;最后,把该进程的状态转换为就绪状态并将其插入就绪队列之中。(三步)
终止态:进程PCB清零,PCB空间返还OS(俩个步骤)
完整步骤:
1.进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
2.当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU就暂时不能运行,系统中可能会有很多个进程都处于就绪态,当CPU空闲时,操作系统就会选择一个就绪进程,让它上处理机(CPU)运行。
3.如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。CPU会执行该进程对应的程序(执行指令序列)
在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”
4.当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行。当等待的事件发生时,进程从“阻塞态”回到“就绪态”5.一个进程可以执行 exit 系统调用,请求操作系统终止该进程。此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。当终止进程的工作完成之后,这个进程就彻底消失了
在这个图中,有很多的细节和知识点:
为什么没有就绪到阻塞?
答:因为进入阻塞是进程主动请求,必然要进程在运行时才可以发出请求,必须走执行才可以
为什么没有阻塞到执行?
因为只有运行到阻塞,而且这是一种主动行为;而且阻塞到就绪态是被动的,不是自己可以控制的
为什么有执行到就绪?
如果没有的话,就变成了串行。时间片完,是因为避免长时间耽搁,而且不需要中止,只是等待CPU来,所以时间片完这个步骤是很有必要的
下面这俩个思维导图结合着看,这个进程的状态和转换我认为大家就可以看懂辣!
挂起的定义:
当该操作作用于某个进程时,该进程将被挂起,这意味着此时该进程处于静止状态。例如,如果进程正在执行,则其此时会暂停执行;如果进程原本处于就绪状态,则其此时暂不接受调度。与挂起操作对应的操作是激活操作。
as far as i,m concerend 我认为:PCB的定义:管理资源和控制进程的数据结构
进程是由:PCB(process control block)和代码和数据集三部分组成的
PCB是给操作系统用的,程序段代码段是给进程自己用的,一个程序开始运行前需要创建对应的进程,也就要创建相应的PCB
(1)作为独立运行基本单位的标志。
当一个程序(含数据)配置了PCB后,就表示它已是一个能在多道程序环境下独立运行的、合法的基本单位了,即具有了取得OS服务的权利。因此,当系统创建一个新进程的同时,就会为它建立一个PCB。进程结束时系统又会回收其PCB,进程也随之消亡。系统是通过PCB来感知进程的存在的。也就是说,PCB已成为进程存在于系统中的唯一标志。
(2)实现间断性运行方式。在多道程序环境下,程序是采用“停停走走”这种间断性的方式运行的。当进程因阻塞而暂停运行时,它必须保留自己运行时的CPU现场信息,因为其再次被调度运行时,还需要恢复CPU现场信息。在有了PCB后,系统就可以将CPU现场信息保存在被中断进程的PCB中,供该进程再次被调度运行而须恢复CPU现场信息时使用。
(3)提供进程管理所需要的信息。当调度程序调度到某进程时,只能根据该进程PCB中记录的程序和数据在内存或外存起始地址(又称为“始址”或“基址”)中找到相应的程序和数据;在进程运行过程中,当进程需要访问文件系统中的文件或I/O设备时,也都需要借助PCB中的信息。另外,还可根据PCB中的资源清单了解到该进程所需的全部资源等信息。由此可见,在进程的整个生命期中,OS总是根据PCB来实施对进程的控制和管理的。
(4)提供进程调度所需要的信息。只有处于就绪状态的进程才能被调度运行,而在PCB中就提供了进程所处状态等信息。如果进程处于就绪状态,系统便会把它插入进程就绪队列中,等待调度程序的调度;另外,在进行进程调度时,往往还需要了解进程的其他信息,如在优先级调度算法中,就需要知道进程的优先级;在有些较为公平的调度算法中,还需要知道进程的等待时间和已执行时间等。
(5)实现与其他进程的同步与通信。进程同步机制是用于实现各进程的协调运行的,在采用信号量机制时,它要求在每个进程中都要设置相应的用于同步的信号量。在PCB中还具有用于实现进程通信的区域或通信队列指针等。
(1)进程标识符。(PCB作用一)
进程标识符用于唯一地标志一个进程。一个进程通常有两种标识符。
① 外部标识符。为了方便用户(进程)对进程的访问
② 内部标识符。为了方便系统对进程的使用
(2)处理机状态。(PCB作用二)
处理机状态信息,也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。①通用寄存器,可被用户程序访问,用于暂存信息
②指令计数器,其中存放了要访问的下一条指令的地址;
③程序状态字寄存器,其中含有状态信息,如条件码、执行方式、中断屏蔽标志等;
④用户栈指针寄存器,指每个用户进程都有一个或若干个与之相关的系统栈,用于存放进程和系统的调用参数及调用地址。
(3)进程调度信息。(PCB作用四)
OS在进行进程调度时,必须了解进程的状态以及有关进程调度的信息,这些信息包括:
①进程状态,指明进程的当前状态,作为进程调度和对换时的依据;②进程优先级,描述进程使用处理机的优先级别(用一个整数表示),优先级高的进程应优先获得处理机;
③进程调度所需要的其他信息,如进程已等待CPU的时间总和、进程已执行时间总和等,它们与所采用的进程调度算法有关;
④事件,指进程由执行状态转换为阻塞状态所等待发生的事件,即阻塞原因。
(4)进程控制信息。(PCB作用三)
进程控制信息是指用于进程控制所必需的信息,包括:①程序和数据的地址,即进程中程序和数据的内存或外存起始地址,便于再调度到该进程执行时,能从PCB中快速找到其程序和数据;
②进程同步和通信机制,这是实现进程同步和进程通信时所必需的机制,如消息队列指针、信号量等,它们可能会全部或部分放在PCB中;
③资源清单,在该清单中列出了进程在运行期间所需的全部资源(除CPU外);
④链接指针,它给出了本进程所在队列中的下一个进程的PCB的始址。
(1)线性方式。将系统中所有的PCB都组织在一张线性表中,将该表的起始地址存放在内
存的一个专用区域中。该方式实现简单且开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。
(2)链接方式。通过PCB中的链接字,将具有相同状态的进程的PCB分别链接成一个队
列。这样即可形成就绪队列、若干个阻塞队列和空闲队列等。对就绪队列而言,其往往会按进程的优先级将PCB从高到低进行排列,即将优先级高的进程的PCB排在队列的前面。
(3)索引方式。系统根据所有进程状态的不同,建立几张索引表,如就绪索引表、阻塞索
引表等,并把各索引表在内存中的起始地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
拓展知识之原语:
原语是一种特殊的程序,它的执行具有原子性,也就是说程序的运行必须一气呵成,不可中断
如果不一气呵成操作的话,就有可能导致操作系统的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作
进程控制是进程管理中最基本的功能,其负责创建新进程、终止已完成的进程、将因发生
异常情况而无法继续运行的进程置于阻塞状态、转换运行中进程的状态等
简化:进程控制就是要实现进程状态转换
在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程(parent process),而把被创建的进程称为子进程(progeny process)。子进程可以继续创建其自己的子
进程(即父进程的孙进程),由此便形成了进程的层次结构。子进程可以继承父进程所拥有的资源,继承父进程所打开的文件和分配到的缓冲区等。当子进程被撤销时,应将其从父进程那里获得
的资源归还给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程。为了标志进
程间的家族关系,在PCB中设置了家族关系表项,以标明自己的父进程及所有的子进程。进程
不能拒绝其子进程的继承权。
值得注意的是,在Windows系统中不存在任何进程层次结构的概念,所有的进程都具有相
同的地位。在一个进程创建了另外一个进程后,创建进程获得一个句柄,其作用相当于一个令
牌,可以用来控制被创建的进程。但是这个句柄是可以进行传递的,也就是说,获得了句柄的
进程拥有控制被创建进程的权力,因此,进程之间的关系不再是层次关系了,而是获得句柄与
否、控制与被控制的简单关系。
为什么要使用原语??
引起进程创建的事件+进程的创建原语知识框架图:
进程的创建原语:(四个)
(1)申请空白PCB:为新进程申请一个唯一的数字标识符,并从PCB集合中索取一个空白PCB。
(2)为新进程分配其运行所需的资源
(3)初始化PCB:PCB的初始化工作包括:①初始化标志信息,将系统分配的标识符和父
进程标识符填入新PCB中;②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶;③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,此外,通常还须将其设置为最低优先级,除非用户以显式方式提出高优先级要求。(4)如果进程就绪队列能够接纳新进程,就将新进程插入就绪队列。
引起进程创建的事件:(四个)
①用户登录:在分时系统中,若登录成功,则系统将会为该用户创建一个进程,并把它插入就绪队列中。
②作业调度:在多道批处理系统中,当作业调度程序按一定的算法调度到某个(或某些)作业时,便会将它(们)装入内存、为它(们)创建进程,并把它(们)插入就绪队列中。
③提供服务:当运行中的用户程序提出某种请求后,系统将专门创建一个进程来为用户提供其所需要的服务,例如,用户进程要求打印文件,系统将为它创建一个打印进程,这样,不仅可使打印进程与该用户进程并发执行,还便于计算出完成打印任务所须花费的时间。
④应用请求:在上述3种情况下,都是由系统内核为用户创建一个新进程;而针对“应用请求”这类事件,则需要由用户进程自己创建新进程,以使新进程以同创建进程并发执行的方式完成特定任务。例如,某用户进程需要不断地先从键盘终端读入数据,再对读入的数据进行相应的处理,最后将处理结果以表格的形式显示在屏幕上。该用户进程为使这几个操作能并发执行以加速完成任务,可以分别建立键盘输入进程、数据处理进程以及表格输出进程。
进程的终止原语:(五个)
①PCB集合中检索出该进程的PCB:并从该进程的PCB中读出该进程的状态
②若被终止进程正处于执行状态,立即剥夺CPU
③终止其所有子孙进程:以防止它们成为不可控的进程;
④将被终止的进程所拥有的全部资源,或归还给其父进程,或归还给系统;
⑤将被终止进程的PCB从所在队列(或链表)中移出:等待其他程序来搜集信息
引起进程终止的事件:
- 正常结束(点右上角叉退出)
- 异常结束(电脑蓝屏死机)
- 外界干预(任务管理器)
阻塞是主动的 唤醒是被动的 block 和 wake up
释放内存,代码和数据集走,但PCB不走,否则改进程会变得透明
进程间通信(inter process communication IPC)是指俩个进程直接产生数据交互
比如我的MC游戏截图发给了微信
咳咳咳!! 我们言归正传 !!
在Linux中实现共享存储:(解释如下)
比如进程P和Q想要通信,发起通信的进程P通过shm_open系统调用申请一片共享内存区,接下来进程P和Q都需要通过mmap系统调用把共享内存区映射到自己的虚拟地址空间
调用mmap函数后,进程的页表项/段表项会增加一项,这个页面/段就可以映射到刚才申请的共享内存区
分类:
基于数据结构理解成共享全局变量(低级通信),基于存储区理解成共享内存池(高级通信)
当进程之间进行通信时,源进程可以直接或间接地将消息发送给目标进程,因此可将进程通
信分为直接和间接两种。常见的直接消息传递系统和信箱通信就分别采用了这两种通信方式
直接通信方式:
定义:指发送进程利用OS所提供的发送原语,直接把消息发送给目标进程
发送原语:send 接收原语: receive
间接通信方式:
定义:发送进程把消息发送到某个中间实体,接收进程从中间实体取得信息,这种中间实体一般叫做信箱
为了协调双方的通信,管道机制必须提供以下3方面的协调能力。
①互斥,即当一个进程正在对管道执行读/写操作时,其他(另一)进程必须等待
②同步,即当写(输入)进程把一定数量(如4KB)的数据写入管道后,便去睡眠(等待),直到读(输出)进程取走数据后,再把它唤醒。当读进程读一空管道时,也应睡眠(等待),直至写进程将数据写入管道后,再把它唤醒
③确定对方是否存在,只有确定了对方已存在时,才能进行通信
管道是一种特殊的共享文件,也是先进先出的,如果俩个进程同时需要写和读,那么需要俩个管道
引入进程是为了解决QQ和玩MC俩个庞大群体之间的问题,没有进程就不可以边聊天边玩游戏。
引入线程是为了解决内部(进程)矛盾,比如QQ现在只可以聊天,不可以聊天的时候发文件,打视频,是线程的出现解决了这个问题!!(下面有个图讲解的很详细)
引入了线程之后,CPU的服务对象就不再是进程,而是进程当中的线程,每一个进程当中可能会包含多个线程,然后CPU会用一定的算法轮流地为这些线程进行服务
小tip:并发并发,可以中途停下来的就叫做并发!
例子:
进程的俩个基本属性:
1、进程是一个可拥有资源的独立单位
2、进程同时是一个可独立调度和分派的基本单位
可以把线程理解为“轻量级进程”
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)线程则作为处理机的分配单元
这个知识点课本其实讲的更加全面,P64,P65,我分别做一个提取精华
1、调度的基本单位:原来进程,现在线程
2、并发性:当然是线程更牛逼了,要不研发他干嘛
3、拥有资源:线程拥有TCB,自己的少量资源等,及进程共享的资源、
4、独立性:同一个进程的线程独立性低,不同进程的线程独立性高
5、系统开销:在一些OS中,线程的切换,同步通信都不需要OS干预
6、支持多处理机系统:
系统资源分配是分配给进程的,所以线程几乎不拥有系统资源
在OS中的所有进程,无论是系统进程还是用户进程,都是在OS内核的支持下运行的,是与内核紧密相关的。而内核支持线程(kernel supported thread,KST),同样也是在内核的支持下运行的,它们的创建、阻塞、撤销和切换等也都是在内核空间实现的。为了对内核支持线程进行控制和管理,在内核空间也为每个内核支持线程设置了一个TCB,内核根据该TCB来感知某线程的存在,并对其加以控制。当前大多数OS都支持KST。
如今大部分操作系统都是内核级线程,Windows,Linux
1.内核级线程的管理工作由操作系统内核完成。
2.线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
3.操作系统会为每个内核级线程建立相应的TCB (Thread Control Block,线程控制块),通过TCB对线程进行管理。“内核级线程”就是 从操作系统内核视角看能看到的线程4.优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
总结:如果某一个操作系统支持内核级线程的话,在这种操作系统当中,内核级线程是处理机调度的基本单位,而进程只作为分配资源的基本单位,因此在多核CPU的环境下这几个线程可以分别分派到不同的核心下并行地执行
用户级线程(user level thread,ULT)是在用户空间中实现的,其对线程的创建、撤销、同步与通信等功能都无须内核支持,即ULT与内核无关。一个系统中的ULT数目可以达到数百个甚至数千个。由于这些线程的TCB都设置在用户空间,而线程所执行的操作又无须内核支持,因而内核完全不知道ULT的存在
在这个时代操作系统的视角看到的其实依然是只有进程,但是程序员们写的这些应用程序当中可以使用线程库来实现多个线程并发地运行(注意理解下面的例子)
在上例中,操作系统其实只看得到进程,而这个进程上处理机运行的时候其实是程序员自己写了一个线程库来创建了逻辑上的线程,也就是所谓的用户级线程
1.用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责 (包括线程切换)
2.用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
3.在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程
4.优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高;调度算法可以是进程专用的,在不干扰OS调度的情况下,不同的进程可以根据自身需要选择不同的调度算法,以对自己的线程进行管理和调度,而与OS的低级调度算法无关;用户级线程的实现与OS平台无关,因为面向线程管理的代码属于用户程序的一部分,所有的应用程序都可以共享这段代码。因此,ULT甚至可以在不支持线程机制的OS平台上实现。缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行理解缺点:(多看while循环代码,并发度非常低,并不可以中途停止)
引入线程后线程成了CPU调度的基本单位,但是如果这个线程是用用户级线程来实现的,CPU的调度单位依然是进程,操作系统是给进程分配CPU时间的。因此即便我们的电脑是多核处理机,但是由于进程才是CPU调度的基本单位,因此这个进程只能被分配一个核心,所以这些线程并不能并行地运行
总结:
上面写的while循环其实就是简单地实现了对这三个线程的管理,让它们交替地运行,所以用户级线程的管理并不是操作系统负责的
上例中线程切换是由while循环来控制的,这并不需要涉及请求操作系统服务之类的事情,所以线程切换的管理是由线程库,应用程序自己完成的
操作系统只能看到进程的存在,它只知道这个进程是一堆代码,而在这堆代码里又分别被分为了几个线程
用户级线程的管理工作,包括切换创建等待,这些工作都不需要请求操作系统的服务,只需要在用户态下就可以完成
将每个ULT映射到一个KST上。为每个ULT都设置了一个KST与之连接。
该模型的主要优点是:当一个线程阻塞时,允许调度另一个线程运行,所以它提供了比多对一模型更好的并发性能。此外,在多处理机系统中,它允许多个线程并行地运行在多处理机系统上。
该模型的唯一缺点是:每创建一个ULT,相应地就需要创建一个KST,开销较大,因此需要限制整个系统的线程数。Windows 2000、Windows NT、OS/2等系统上都实现了该模型。
将多个ULT映射到一个KST上。这些ULT一般属于一个进程,运行在该进程的用户空间,对这些线程的调度和管理也是在该进程的用户空间中完成的。仅当ULT需要访问内核时,才会将其映射到一个KST上,但每次只允许一个线程进行映射。
该模型的主要优点是:线程管理的开销小,效率高。
其主要缺点是:如果一个线程在访问内核时发生阻塞,则整个进程都会被阻塞;此外,在任一时刻,只有一个线程能够访问内核,多个线程不能同时在多个处理机上运行。
将许多ULT映射到同样数量或较少数量的KST上。KST的数目可以根据应用进程和系统的不同而变化,其可以比ULT数少,也可以与之相等。
该模型结合了上述两种模型的优点,它可以像一对一模型那样使一个进程的多个线程并行地运行在多处理机系统上,也可以像多对一模型那样减少线程管理开销并提高效率。
好的,我们的知识点讲解也已经接近尾声,有没有对你有所帮助呢?