1. 进程的定义、组成、组织方式、特征
定义
程序:就是一个指令序列。(静态概念)
进程是程序的一次执行,该程序可以与其他程序并发执行。(强调动态性)
组成
- PCB,进程控制块,是进程存在的唯一标志
- 程序
- 数据
PCB包含如下信息
- 进程描述信息
- 进程控制和管理信息
- 资源分配上清单
- 处理及相关信息
组织方式
链接方式
指针指向一个进程队列
索引方式
指针指向索引表
特征
2. 进程的状态与转换
进程的状态
进程是程序的一次执行。在这个执行过程中,有时进程正在倍CPU处理,有时又需要等待CPU服务,可见,
进程的三种基本状态:
进程的另外两种状态:
进程的转换
进程的基本调度状态:
3. 进程控制
3.1 什么是进程控制?
进程的控制主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
简而言之:进程控制就是要实现进程状态转换。
3.2 如何实现进程控制?
用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作即原子操作。
原语采用“关中断指令”和“开中断指令”实现。如图所示,使用了关中断指令之后,外部的中断信号不会影响原语代码的执行。
关/开中断指令的权限是非常大,是只能在核心态下执行的特权指令。
3.3 进程控制原语:
进程控制会导致进程状态的转换。无论是哪个原语,要做的无非三件事:
- 更新PCB中的信息
- 所有的进程控制原语一定会修改进程状态标志
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行前必然要恢复其运行环境 - 将PCB插入合适的队列
- 分配/回收资源
创建原语:
创建原语执行步骤:
- 申请空白PCB
- 为新进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列
引起进程创建的事件:
- 用户登录:分时系统中,用户登录成功,系统会为其建立一个新的进程
- 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
- 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理改请求
- 应用请求:由用户进程主动请求创建一个子进程
撤销原语
就绪态/阻塞态/运行态–>终止态
撤销步骤:
- 从PCB集合中找到终止进程的PCB
- 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
- 终止其所有子进程
- 将该进程拥有的所有资源归还给父进程或者操作系统
- 删除PCB
引起终止的事件:
- 正常结束
- 异常结束
- 外界干预
阻塞原语与唤醒原语
阻塞原语:运行态–>阻塞态
唤醒原语:阻塞态–>就绪态
阻塞原语执行步骤
- 找到要阻塞的进程对应的PCB
- 保护进程运行现场,将PCB状态设置为“阻塞态”,暂时停止进程运行
- 将PCB插入相应事件的等待队列
引起阻塞的事件
- 需要等待系统分配某种资源
- 需要等待相互合作的其他进程完成工作
唤醒原语执行步骤
- 在事件等待队列中找到PCB
- 将PCB插入相应事件的等待队列
- 将PCB插入就绪队列,等待被调度
引起唤醒的事件
- 等待事件发生(因合适阻塞,就应由何事唤醒)
注意:阻塞原语和唤醒原语要成对出现
切换原语
运行态–>阻塞态/就绪态
就绪态–>运行态
切换原语执行步骤:
- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复进程所需的运行环境
引起进程切换的事件:
- 当前进程事件片到
- 有更高优先级的进程达到
- 当前进程主动阻塞
- 当前进程终止
4. 进程通信
4.1 什么是进程通信?
共享存储
管道通信:
消息传递:
两种消息传递的区别是:
- 直接通信方式是进程1直接将消息挂到进程2的消息队列上。
- 间接通信方式是进程1通过发送原语将消息发送给信箱,进程2通过接收原语从信箱中取得消息。
5. 线程的概念和多线程模型
什么是线程,为什么要引入线程?
- 可以把线程理解为“轻量级进程”。
- 线程是一个基本的CPU执行单原,也是程序执行流的最小单元。
- 引入线程后,不仅是进程之间可以并发,进程内的个线程之间也可以并发,进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务。
- 引入线程后,进程制作为除CPU之外的系统资源的分配单元。
资源分配是分给进程的而不是分配给线程的。
引入线程机制后。有什么变化?
线程有哪些重要的属性
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可占用不同的CPU
- 每个线程都有一个线程ID,线程控制块(TCB)
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程之间贡献进程的资源
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
- 同一进程中线程切换,不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
- 切换同进程内的线程,系统开销很小
- 切换进程,系统开销较大
线程的实现方式
用户级线程
- 用户级线程有应用程序通过线程库实现
- 所有的线程管理工作都由应用程序负责(包括线程切换)
- 在用户看来,是有多个线程。但在操作系统意识不到线程的存在
内核级线程(Kernel-Level Thread)
- 内核级线程的管理工作由操作系统完成。线程调度,切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
- “内核级线程”就是“从操作系统内核视角能看到的线程”
组合线程
多线程模型