操作系统的进程管理与进程通信功能。
进程管理
进程:程序的一次动态执行过程,是程序处在一个执行环境中在一个数据集上的执行过程,系统资源分配和调度的可并发执行单位
进程映像:
- PCB(基本块+扩充块)
- 共享正文段:程序+不可修改的常数
- 数据区:执行时需要的数据,外部变量+静态变量
- 工作区:传递参数、返回地址、保护现场;核心栈+用户栈
执行,就绪,阻塞
队列的形式管理PCB,分为执行队列、就绪队列、多个阻塞队列
调度
- 高级调度:输入池哪个作业调入主系统,形成一个或一组就绪的进程
- 中级调度:交换区的就绪进程进入内存
- 低级调度(进程调度):内存的就绪进程占用CPU
- 进程调度策略:
- 先来先服务调度
- 时间片轮转:每次选择队首的就绪进程,运行一段“时间片”的固定时间间隔
- 优先级调度
- 多级反馈队列调度:不同队列优先级不同,优先级高的队列分配到短时间片。未完成则降低优先级排到下一级别队尾,高优先级队列进程可抢占处理机
- UNIX调度:
- 计算动态优先数,小的优先级高
- 核心态进程优先数对调度不起作用,只有在进入睡眠状态时才根据等待事件分配优先数
- 切换时机:
- 主动:
- 完成任务
- 等待资源
- 因其他进程同步/互斥
- 被动:中断或陷入处理的末尾
- 被唤醒的睡眠进程有更高优先级
- 系统调用返回用户态时,进程的优先级下降
- 时钟中断程序对优先级过小的进程重新计算优先数
- 主动:
- 切换操作:保存现场,选择优先级最高进程,恢复现场
- 中级调度:
- 换入:
- 依据就绪进程在外存驻留时间从长到短换入内存,直到内存无任何空闲区
- 换出:
- 部分映像已经换出的进程从内存完全换出
- 睡眠进程换出
- 内存驻留时间最长的进程换出
- 换入为主动,换出为被动
- 换入:
睡眠与唤醒
- 系统调用
sleep()
进入睡眠状态,根据睡眠原因划分队列 - 根据睡眠原因得到阻塞对列,全部唤醒,排入就绪队列,竞争处理机
- 系统调用
进程终止:系统调用
exit()
,关闭所有文件,释放空间,只保留基本的PCB创建与映像改换:
- 创建:
fork()
- 映像改换:父子进程的映像基本一致,但父进程执行过的内容对子进程没有意义。系统调用
exec()
- 创建:
线程:CPU的最小调度单位
- 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据
- 多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈
- 各个线程切换开销小
- 内核级线程:
- 线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程
- 在全系统内进行资源的竞争
- 每一个内核支持线程设置了一个线程控制块(TCB)
- 切换线程时需要进入核心态
- 用户级线程:
- 仅存在于用户空间
- 内核并不能看到用户线程
- 用户线程只能在进程内进行资源竞争
进程通信
临界资源:一段时间内只允许一个进程访问的资源;对应的访问程序段为临界段
锁
- 锁的关闭包括测试和关闭两个步骤——中断可能导致临界资源的控制失败
- 安全控制方法:
- 交换指令:设置测试单元并赋值为1,将测试单元和锁变量交换——先将锁关闭——然后查看锁变量
- 禁止中断
- 测试时禁止中断,设置锁之后开启中断
信号量
semWait
:减小信号量的值,如果结果为负数,则执行此操作的进程阻塞semSignal
:增大信号量的值,如果结果大于等于0,则对应的阻塞进程解除阻塞互斥:
同步:
- 单方同步
- 两个进程同步(以计算并存储、取出并打印为例)
- 生产者与消费者问题
- 读者与写者问题
- 单方同步
数据通信
- 消息通信
- 向系统申请一个缓冲区
- 填写消息正文与控制信息
- 通过消息通信机构送到接收进程的消息队列
- 接收进程从消息队列中移出消息
- 共享存储区
- 将内存的一个区域连入多个进程的虚拟地址空间
- 核心按进程提供的关键字查照共享存储区段表,有则返回,无则建立一个共享段并在段表中填入共享段的信息
- 管道通信
- 先进先出组织数据传输
- 以流的形式将数据写入管道,以相同的顺序读出管道中的信息
- 消息通信
软中断
- 信号
- 由事件引起,可在进程之间传送,通知进程发生了异常事件,需要执行相应动作
- 信号无优先级,中断有优先级;中断处理程序在核心态运行,信号处理程序可在用户态运行;中断响应及时,信号响应需要进程在执行中的几个时机询问
- 信号存入PCB的相应字段
- 只有当进程从核心态返回到用户态(系统调用、中断返回时、陷入返回时)才检查相应字段是否被设置
- 子进程继承父进程所有信号处理方式;信号处理程序入口在一个PCB扩充块的数组中
- 设置新的处理方式 :系统调用
signal()
- 进程之间传递信号:系统调用
kill()
- 设置新的处理方式 :系统调用
- 信号
死锁
- 产生原因
- 互斥执行:其他申请资源的进程被阻塞
- 保持并等待:进程等待分配资源时,保持占有已分配的资源
- 不可剥夺:不能强迫移除进程占有的资源
- 循环等待:存在一个闭合的进程资源链
- 预防
- 进程一次性申请需要的所有资源
- 进程不能进一步获得资源时,必须释放原有的占用资源
- 资源有序使用,进程只能申请资源顺序表中排在已分配到资源后面的资源类型
- 银行家算法
- 系统保证申请者在有限时间中能获得所需的全部资源;保证至少有一个进程能得到所需的全部资源时,才进行资源分配
- 安全状态:
- 不安全状态:
- 撤销死锁
- 强迫撤销所有死锁进程
- 回退到一些过去的“检查点”
- 逐个撤销死锁进程,直到死锁不存在
- 逐个剥夺进程占用的资源,直到死锁不存在
- 产生原因