参考视频:王道计算机考研 操作系统_哔哩哔哩_bilibili
目录
第二章 进程管理1
一、进程与线程
在单道程序中,内存中有程序段(程序:一个指令序列)和数据段。而在多道程序中,内存中放入多个程序段和数据段,操作系统需要找到
1)各个程序段存放位置;
2)哪些程序分配了哪些系统资源等。
为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,引入进程和进程实体的概念。
1.进程的定义和组成
进程控制块(PCB)控制每一个程序(如:记录程序段存放位置),使得每一程序能够独立运行。
进程实体(又称为进程映像)由PCB、程序段、数据段三部分组成,创建进程的实质就是创建进程实体中的PCB,而撤销进程就是撤销进程实体中的PCB。PCB是进程存在的唯一标志。
引入进程实体概念之后,可以把进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。【强调“动态性”】
【知识树 王道(左) 汤子瀛(右)】
2.进程的组织
为了有效管理上千个PCB,需要将其组织起来。
链接方式:
执行指针、就绪队列指针、阻塞队列指针
索引方式:
执行指针、就绪表指针、阻塞表指针
3.进程的特征
动态性:最基本的特征。进程是程序的执行。
并发性:多个进程实体并发执行。
独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位。
【进程是资源分配、接受调度的基本单位】
异步性:由于各个进程独立、不可预知的速度前进,会导致程序执行结果的不确定性。
【需要“进程同步机制”来解决】
结构性:PCB、程序段、数据段三部分组成。
4.进程的状态
(1)三种基本状态:运行态、就绪态、阻塞态。
就绪态下的进程只缺少CPU。
若在运行态中需要等待某个除处理机以外的资源可用或是输入/输出完成,则会将此进程阻塞,当事件处理完成后再回到就绪态。
(2)进程的另外两种状态:创建态、终止态
创建:程序在计算机内运行,操作系统为该进程分配所需的内存空间,并创建、初始化PCB(分配PID)。
终止:进程运行结束后(正常或异常导致),撤销进程相关的工作,回收资源、撤销PCB等。
5.进程的转换
就绪态 → 运行态:进程调度,分配处理机时间片。
运行态 → 就绪态:时间片用完后,不得不让出处理机;或是处理机被更加紧急的进程抢占。
运行态 → 阻塞态:主动申请资源。
阻塞态 → 就绪态:被动等待分配。
6.进程控制
概念:对所有进程实施有效管理,具有创建新进程、实现进程状态转换、撤销已有进程等功能。
对进程进行控制,从一态到另一态的转变必须
①更新PCB的内容(状态标志PID、运行环境)
②将进程的PCB放入相应的队列中(就绪队列、事件 i 的阻塞队列)
③可能涉及分配/回收资源
注:有些程序在运行中被切换,处理机被抢占回到的就绪态,当时的运行环境保存在PCB中,那么再从就绪队列到运行就需要恢复运行环境。
上述的①、②和③必须全部完成,否则程序将产生极大错误,因此引入原语来实现进程控制。
原语中具备两个特权指令【关中断指令和开中断指令】,因此运行在核心态。在关中断期间执行的原子操作只能一气呵成,原语执行完需要开中断。
无→创建态→就绪态
引起进程创建的事件:用户登录、新作业调度、用户请求操作系统服务、申请子进程。
就绪态/阻塞态/运行态→终止态→无
引起终止的事件:正常结束、异常结束、外界干预。
运行态→阻塞态;阻塞态→就绪态
成对使用;因何事阻塞就应由何事唤醒。
7.进程通信
每个进程都有自己独立的地址空间,只能自己访问。
因此,为实现进程之间的信息交换,需要一些方法。
1)共享存储
为实现通信,内存中开辟一个共享空间供多个进程互斥使用,即同一时刻只能有一个进程使用。
1️⃣基于数据结构的共享:多个进程共用某些数据结构,操作系统提供空间和同步互斥工具,程序员来负责空间中数据结构的设置以及进程同步的处理。仅适用传递相对少量数据,通信效率低下,属于低级通信。
【相当于使用同一种结构规则,对应位置表示相同,从而进行信息传递】(我自己的理解)
2️⃣基于存储区的共享:操作系统提供空间和同步互斥工具,数据的形式、存放位置都由进程控制,这种共享方式速度更快,属于高级通信。
2)管道通信
①一个管道采用半双工通信,即只能单向传输,双向同时通信需要两个管道。
②进程互斥访问管道
③管道字符流写满时,写进程的write()系统调用将阻塞;为空时,读进程的read()系统调用阻塞。
④没写满,不读。没读完,不写。
⑤读出的数据被抛弃,无法找回。因此,读数据只能有一个。
3)消息传递
进程间的数据交换以格式化的消息(消息头+消息体)为单位。
通过“发送消息/接收消息”两个原语进行数据交换。
1️⃣直接通信方式
发送进程的消息直接挂到接收进程的消息缓冲队列上。
2️⃣间接通信方式(信箱通信方式)
两进程通信,发送到或接收于中间实体(信箱)中,如:电子邮件系统。
8.线程
操作系统引入线程,是为了减少程序在并发执行时所付出的时空开销。
1)线程的引入
1️⃣进程的两个属性
①可拥有资源的独立单位 ;②可独立调度和分派的基本单位(对进程的PCB操作)。
2️⃣时空开销
创建进程(初始化),撤销进程(回收),进程切换(不宜频繁,否则限制并发程度)。
3️⃣线程——作为调度和分派的基本单位(属性②)
既要并行又要减少开销,就将两个属性分开(线程出现后就成为CPU的基本执行单元)。一个进程中的线程被调度,会访问自己所在的进程中的共享资源。
2)线程与进程的比较(或者说引入线程后的变化)
1️⃣进程成为只是资源分配的基本单位,线程替代其成为调度的基本单位
2️⃣进程间并发,线程间也并发,提高并发性
3️⃣主要资源归进程所有,线程共享,少数资源(自己使用的线程控制块TCB)属于线程
4️⃣因同进程内线程共享进程资源,故线程的独立性较低许多
5️⃣不同于进程切换,线程切换不需要切换运行环境,所以无需系统干预,系统开销小
(注:多个线程具有相同的地址空间,因此线程间的同步和通信也都不需要操作系统的干预)
3)线程的实现方式
用户级线程(ULT),对操作系统透明,意识不到其存在。
所有的线程管理工作都由应用程序(基于库函数)负责,通过线程库实现。线程创建、撤销、状态切换在目态即可完成。
(MOOC)
(王道)
内核级线程(KLT)
线程调度、切换等管理工作都由内核负责,线程切换必须在核心态下完成。
(MOOC)
(王道)
组合/混合线程
是将用户级线程和内核支持线程两种方式组合
1️⃣User Level Thread 用户级线程
2️⃣Light Weighted Process(LWP)轻量级进程
3️⃣Kernel Level Thread 核心级线程
用户级线程只能被用户看到,核心级线程只能操作系统看到,因此,需要使用内核控制线程(也就是LWP)将两个级别的线程联系在一起,使两者都能看到。
9.多线程模型
用户级线程映射到内核级线程,有多种连接方式。
1️⃣只在用户态下即可完成线程切换的多对一模型
优点:不需要切换到内核态,开销小,效率高。
缺点:一个用户级线程阻塞,整个进程阻塞;因为就对应一个内核级线程,故不能并发执行多个用户级线程。
2️⃣一个用户级对应一个内核级的一对一模型
优点:一个阻塞,另一个还能用,多核处理机中的并发能力强。
缺点:一个进程多个线程,将用多个内核级线程,切换时成本高、开销大。
3️⃣多对多模型
综合了上面两种模型的优点,既能使并发能力强,又开销小。