第2章 进程与线程(1)
2.1进程与线程
2.1.1进程的特征
进程和程序的区别:程序是静态的,是存在磁盘的可执行文件(一系列指令的集合)。进程是动态的,是程序的一次执行。
- 进程的特征:
(1)动态性(最基本的特征):是程序的一次执行过程
(2)并发性:内存有多个进程实体,各个进程并发执行
(3)独立性:进程能独立运行,独立获取资源,独立接受调度的基本单位
(4)异步性:各个进程独立的,不可预知的速度向前推进。
(5)结构性:每个进程都会有PCB。结构上看进程由程序段,数据段,PCB组成
2.1.2进程的状态和转换

(1)运行态。正在处理机上运行。
(2)就绪态。已经获得除处理机以外的全部资源,一旦得到处理机就开始运行。
(3)阻塞态。进程因等待某事件而暂停运行。
(4)创建态。进程正在被创建。
申请空白PCB->写入控制和管理进程的信息->分配所需资源->设置为就绪态并插入就绪队列
(5)终止态。正常结束或其他原因推出运行。
转换关系:
- 就绪->运行: 获得处理机资源
- 运行->就绪: 时间片用完,让出处理机。可剥夺操作系统,更高优先级进程抢占处理机。
- 运行->阻塞
(主动行为): 请求资源分配(外设)或等待某些事件完成(I/O操作)从而让出处理机使用。 - 阻塞->就绪
(被动行为): 等待事件到来。例如I/O操作结束或中断结束
2.1.3进程的组成
进程的组成 ( 进程实体 ) { P C B { 进程描述信息 进程控制和管理信息 资源分配清单 处理机相关信息 程序段 : 程序的代码 ( 指令序列 ) 数据段 : 运行过程产生的各种数据 进程的组成(进程实体)\begin{cases}PCB \begin{cases} 进程描述信息 \\ 进程控制和管理信息\\ 资源分配清单\\ 处理机相关信息 \end{cases}\\程序段:程序的代码(指令序列)\\ 数据段:运行过程产生的各种数据 \end{cases} 进程的组成(进程实体)⎩ ⎨ ⎧PCB⎩ ⎨ ⎧进程描述信息进程控制和管理信息资源分配清单处理机相关信息程序段:程序的代码(指令序列)数据段:运行过程产生的各种数据
PCB是进程存在的唯一标志,进程是资源分配和调度的独立单位
2.1.4进程控制
功能:创建新进程,撤销已有进程,实现进程状态转换
进程控制的程序段称为原语
- 1.进程的创建
分配唯一进程标识和PCB->分配运行时所需资源->初始化PCB->新进程插入就绪队列 - 2.进程的终止
根据进程标识符检索PCB->终止进程的执行,处理机资源分配给其他进程->结束子孙进程->全部资源返回给父进程或操作系统->从队列中删除PCB - 3.进程的阻塞和唤醒 (两者成对使用)
阻塞原语:根据进程标识符找到PCB->保护运行现场,转为阻塞状态->把PCB插入等待队列
唤醒原语:根据进程标识符找到PCB->从等待队列中移除,转为就绪态->PCB插入就绪队列 - 4.切换原语 (时间片到/更高优先级进程到/进程主动阻塞/当前进程终止)
运行环境信息存入PCB->PCB移入相应队列->选择其他进程进行执行->恢复环境
2.1.5进程通信
PV操作时低级通信方式
高级通信方式:
- 1.共享存储:
(操作系统划分共享区域,进程的虚拟存储映射)
(1)低级方式:基于数据结构的共享,速度慢,限制多

(2)高级方式:基于存储区的共享,速度快,更灵活

操作系统只负责通信进程提供可共享使用的存储空间和同步互斥工具。数据交换由用户安排读写指令完成。
-
2.消息传递
(以格式化的消息为单位,以操作系统提供的"发送消息"和"接收消息"进行数据交换):
(1)直接通信方式:发送消息需要指名接收进程的PID,发送方的信息被复制到操作系统内核的接收方进程的消息队列中

(2)间接通信方式:通过"信箱"间接通信,进程向操作系统申请内存空间(可以申请多个)用于接收消息传递

-
3.管道通信:
(单向传递信息)(循环队列)
系统调用申请管道文件(本质时开辟内存缓存区)

(1)半双工通信
(2)进程互斥访问管道
(3)管道写满,写进程应该被阻塞
(4)管道读空,读进程阻塞
(5)管道中数据被读出,彻底消失。多个进程读管道,可能会错乱.解决方案: { 1. 一个管道允许多个写进程 , 一个读进程 ( 408 真题答案 ) 2. 允许多个读进程 , 多个写进程 ( L i n u x 方案 ) \begin{cases}1.一个管道允许多个写进程,一个读进程(408真题答案)\\ 2.允许多个读进程,多个写进程 (Linux方案) \end{cases} {1.一个管道允许多个写进程,一个读进程(408真题答案)2.允许多个读进程,多个写进程(Linux方案) 请以408真题结果作为考试答案
共享通信和管道通信都是向操作系统申请固定大小的内存空间
共享通信和管道通信区别:
| 共享通信 | 管道通信 | |
|---|---|---|
| 存数据 | 可以在某个信箱的任意位置存放 | 管道通信可以看作使用一个队列,只能在尾部存放 |
| 取数据 | 指定信箱内部的任意位置 | 只能从对头取数据 |
2.1.6线程与多线程模型
引入线程后的变化:

线程的属性:

- 线程实现方式
(1)用户级线程:[操作系统只支持进程不支持线程时期]
线程管理(创建,撤销,切换)等工作都由应用程序在用户空间完成

- 线程的管理工作由 应用程序通过线程库完成
- 线程切换不需要CPU干涉
- 操作系统不能感知到线程存在
优点:线程切换不需要切换到和心态,管理开销小,效率高
缺点:当一个线程被阻塞,整个进程会被阻塞,并发度不高,多个线程不能再多核处理机上并行运行
(2)内核级线程:[现代操作系统都实现了内核级线程]

- 线程管理工作由操作系统完成
- 线程切换需要CPU从用户态变成内核态
- 操作系统能意识到线程的存在
优点:当一个线程被阻塞后,其他线程可以继续执行。并发能力强。可以在多核处理机上并行运行
缺点:一个进程对应多个内核级线程,线程切换由操作系统完成,需要切换到核心态。线程管理成本高
多线程模型:
-
一对一模型:一个用户级线程映射到一个内核级线程

优点:一个线程被阻塞,其他线程还可以继续执行。并发能力强。多线程可在多核处理机上并行执行。
缺点:用户进程占用多个内核级线程。线程切换开销大。 -
多对一模型:多个用户级线程映射到一个内核级线程
(默认一个进程只分配一个内核级线程)

优点:线程切换只要再用户空间内完成。线程管理开销小,效率高。
缺点:当一个用户级线程被阻塞,整个进程会被阻塞,并发度不高,多个线程在多核处理机上并行运行。
!!!操作系统只"看得见"内核级线程,因此只有内核级线程才是处理机分配单位。!!! -
多对多模型:n个用户级线程映射到m个内核级线程(n>=m)
每个用户线程对应m个内核级线程

优点:克服了多对一并发度不高的缺点,也克服了一对一用户进程占太多内核级线程,开销大的缺点。****
缺点:当一个用户级线程被阻塞,整个进程会被阻塞,并发度不高,多个线程在多核处理机上并行运行。
线程的组织和控制:
线程控制块 ( T C B ) = { 线程标识符 − > T I D , 与 P I D 类似 程序计数器 ( 线程切换时保存 / 恢复 ) − > 线程执行到哪 其他寄存器 ( 线程切换时保存 / 恢复 ) − > 线程运行中间结果 堆栈指针 ( 线程切换时保存 / 恢复 ) − > 堆栈保存函数调用 , 局部信息等 线程运行状态 − > 运行 / 就绪 / 阻塞 优先级 − > 线程调度 , 资源分配的参考 线程控制块(TCB)=\begin{cases}线程标识符->TID,与PID类似\\ 程序计数器(线程切换时保存/恢复)->线程执行到哪\\ 其他寄存器(线程切换时保存/恢复)->线程运行中间结果\\ 堆栈指针(线程切换时保存/恢复)->堆栈保存函数调用,局部信息等\\ 线程运行状态->运行/就绪/阻塞\\ 优先级->线程调度,资源分配的参考 \end{cases} 线程控制块(TCB)=⎩ ⎨ ⎧线程标识符−>TID,与PID类似程序计数器(线程切换时保存/恢复)−>线程执行到哪其他寄存器(线程切换时保存/恢复)−>线程运行中间结果堆栈指针(线程切换时保存/恢复)−>堆栈保存函数调用,局部信息等线程运行状态−>运行/就绪/阻塞优先级−>线程调度,资源分配的参考
多个TCB组织成一张线程表
总结:





