操作系统(二)—— 进程管理
二、进程管理
1. 进程与线程
1)进程的概念与特征
① 概念:进程(进程实体) = 程序段 + 数据段 + PCB,PCB是进程存在的唯一标志
② 定义:进程是程序的一次执行过程。进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
③ 特征:动态性、并发性、独立性、异步性、结构性
【考点】进程是能独立运行、系统资源分配的最小单位
2) 进程的状态与转换
3) 进程控制
对系统中的所有进程的管理——实现进程转换
4) 进程的组织
① 链接方式
② 索引方式
5) 进程的通信
① 概念:进程是相互独立的,一个进程不能直接访问另一个进程的地址空间,实现进程之间进行信息交换就是进程通信。
② 通信方式:
6) 线程概念和多线程模型
① 线程是什么? ——轻量级“进程”
② 线程的属性:
③ 线程的实现方式
用户级线程:由应用程序管理,操作系统看不到
内核级线程:由操作系统管理
【注】内核级线程才是处理机分配的单位
④ 多线程模型:
多对一:多个用户级线程映射到一个内核级线程
一对一:一个用户级 对应 一个内核级
多对多:n个用户级 映射到 m个内核级
2. 处理机调度
1)基本概念
进程数量往往大于处理机个数,为了更好地处理进程间的竞争,引入了处理机调度机制。
**2)三个层次
**
3)三层调度的联系和对比
作业调度为进程活动做准备,内存调度将暂时不能运行的进程挂起,进程调度使进程正常活动起来。
4)进程调度的时机
① 需要调度的时机:
a. 主动放弃处理机:进程正常终止、执行异常而终止、主动请求阻塞(I/O)
b. 被动放弃处理机:时间片用完,处理机资源被抢占
② 不能进行调度:
a. 处理中断的过程中
b. 操作系统内核程序临界区
c. 原子操作期间
5)进程调度的切换
【注】进程的切换和调度是有代价的
6)进程调度的方式
① 非抢占式 —— 早期的批处理系统
② 抢占式 —— 分时操作系统、实时操作系统
7)调度算法的评价指标
8)调度算法
适用于批处理操作系统:
① 先来先服务(FCFS)
a. 算法思想:“公平”,排队
b. 算法规则:按照作业/进程的先后顺序服务
c. 用于作业/进程调度:都可以用
d. 是否可抢占:非抢占式
e. 优缺点:算法简单、公平,但是效率低;有利于长作业,不利于短作业;有利于CPU繁忙型作业,不利于IO繁忙型作业。
f. 是否会导致饥饿:不会
② 短作业优先(SJF)
a. 算法思想:追求最少的平均等待时间、最少的平均周转时间、最少的平均带全周转时间
b. 算法规则:已到达的最短的作业/进程优先得到服务(服务时间最短)
c. 用于作业/进程调度:都可以用,用于进程时叫“短进程优先(SPF)”
d. 是否可抢占:SJF和SPF是非抢占式,但是也有抢占式版本的——最短剩余时间优先算法
e. 优缺点:优点:“最短的”平均等待时间、平均周转时间;缺点:不公平,对短作业有利,长作业不利,有可能饥饿现象;作业长短由用户确定,可能出现不准确。
f. 是否会导致饥饿:会,甚至饿死
③ 高响应比优先(HRRN)
a. 算法思想:综合考虑作业/进程的等待时间和要求服务的时间
b. 算法规则:每次调度时,先计算各个作业或进程的响应比,选择响应比最高的作业/进程服务。 响应比 = (等待时间+要求服务时间) / 要求服务时间
c. 用于作业/进程调度:都可以
d. 是否可抢占:非抢占式
e. 优缺点:
i. 综合考虑了等待时间和运行时间(要求服务时间)
ii. 等待时间相同时,要求服务时间短的优先(SF 的优点)
iii. 要求服务时间相同时,等待时间长的优先(FCFS 的优点)
f. 是否会导致饥饿:不会
适用于交互式系统:
④ 时间片轮转调度算法
a. 算法思想:公平的、轮流地为各个进程服务,时间片
b. 算法规则:分配时间片,用完了就重新进入队列
c. 用于作业/进程调度:用于进程调度
d. 是否可抢占:抢占式,由时钟中断来通知CPU时间片已结束
e. 优缺点:公平、响应快,适用于分时操作系统;高频率切换进程会有一定的开销;不区分任务紧急程度
f. 是否会导致饥饿:不会
⑤ 优先级调度算法
a. 算法思想:很多场景需要根据任务的紧急程度来决定处理顺序,常用于实时操作系统
b. 算法规则:优先级高的先执行
c. 用于作业/进程调度:都可以,还可以用于I/O调度
d. 是否可抢占:抢占式、非抢占式都有
e. 优缺点:用优先级划分调度,适用于实时操作系统,可灵活调整任务的偏好程度;如果有很多的高优先级进来,可能导致饥饿。
f. 是否会导致饥饿:会的
⑥ 多级反馈队列调度算法
a. 算法思想:对其他算法折中权衡
b. 算法规则:
c. 用于作业/进程调度:用于进程调度
d. 是否可抢占:抢占式
e. 优缺点:
f. 是否会导致饥饿:不会
3. 进程同步
1)概念
① 同步:为完成某个任务而简历的两个或多个进程
② 互斥:当一个进程访问临界资源时,另一个进程必须等待,当访问结束后,另一个才能访问。
③ 临界资源:一次只能为一个进程服务的资源,如打印机、摄像头等
2)进程互斥的软件实现方法
① 单标志法
a. 算法思想:两个进程访问临界资源结束后,会把使用临界区的权限转交给另一个进程。
b. 优点:可以实现“同一时刻最多只允许一个进程访问临界区”
c. 局限性:如果一个进程拿到锁,但是一直不进入,一直等待。违背“空闲让进”原则
② 双标志先检查法
a. 算法思想:每个进程进入临界区之前先检查当前临界区有没有其他进程,用一个boolean数组存放每个进程的状态(锁标志)。
b. 优点:不会出现一直等待问题
c. 局限性:因为是并发执行,可能多个进程同时进入临界区。违背“忙则等待”原则。
③ 双标志后检查法
a. 算法思想:在算法②的逻辑,改为先加锁,再检查。
b. 优点:解决了“忙则等待”问题。
c. 局限性:并发执行,可能会导致都进入不了,进程饿死了。违背了“空闲让进”、“有限等待”原则
④ Peterson 算法
a. 算法思想:如果多个进程都想进入临界区,就让他们“孔融让梨”。
b. 优点:满足 空闲让进、忙则等待、有限等待。
c. 局限性:未遵循让权等待原则。
3)进程互斥的硬件实现方法
① 中断屏蔽
a. 优点:简单高效
b. 局限性:不适用于多处理机、只适用于操作系统内核进程(因为开/关中断指令只能运行在内核态)
② 硬件指令:
指令:TestAndSet指令(TSL指令或TS指令)、Swap指令
4)信号量机制
4)信号量机制实现互斥、同步、前驱关系
5)生产者消费者问题(同步互斥问题)
① 问题描述:生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区拿一个产品并使用,缓冲区满了不能再生产,缓冲区空了不能再拿。
【注】这里的缓冲区应该是临界资源,各进程之间应该互斥访问,以保证缓冲区中的数据安全(避免覆盖、多拿问题)。
【考点】实现互斥必须在实现同步的两个P操作之后,否则会死锁
6)吸烟者问题(互斥问题)
7)读者-写者(互斥问题)
① 两个及以上的读进程 不需要互斥
② 读 和 写进程需要互斥
③ 两个及以上的写进程 需要互斥
8)哲学家进餐问题
9)管程
类似于 Java中的 类,将执行过程封装到方法中了。
4. 死锁
1)死锁的概念
① 什么是死锁?
并发环境下,各个进程相互等待对方手里的资源,无法向前推进。
② 进程死锁、饥饿、死循环的区别
死锁:并发环境下,各个进程相互等待对方手里的资源,无法向前推进。
饥饿:某个进程由于长期得不到想要的资源,进程无法推进。
死循环:某进程执行过程中一直跳不出去某个循。
③ 死锁产生的必要条件(四个)
a. 互斥条件:只有对必须互斥使用的资源的争抢才会出现死锁。
b. 不可剥夺条件:进程所获得的资源没使用完之前,不能由其他进程强行剥夺,只能由其主动释放。
c. 请求和保持条件:进程持有了至少一个资源的情况下又提出了新的资源请求,新的资源请求得不到满足,也不释放已有的资源。
d. 循环等待条件:存在一种进程资源等待链,链中的每一个进程已获得的资源被下一个进程所请求。
④ 什么时候会产生死锁
a. 竞争不可剥夺的系统资源
b. 进程推荐顺序非法
c. 信号量的使用不当
⑤ 死锁的处理策略
a. 预防死锁 —— 破坏死锁的四个必要条件之一
b. 避免死锁 —— 用某种方法防止系统进入不安全状态从而避免死锁,如银行家算法
c. 死锁的检测和解除 —— 允许死锁的发生,但是会检测处理并解除
2)死锁预防
① 破坏互斥条件
偶尔可以破坏,如SPOOLing技术解决打印机互斥问题,很多时候都不能破坏,甚至要保护。
② 破坏不可剥夺条件
方案一:进程请求新的资源得不到满足时,释放持有的资源
方案二:某个进程需要一个被其他进程占用的资源时,由操作系统协助,强行剥夺
缺点:实现复杂;增加系统开销;可能导致饥饿;仅适用于易保存/恢复状态的资源,如CPU
③ 破坏请求和保持条件
静态分配方法:进程运行前一次性申请所需要全部的资源
缺点:资源利用率低(资源用得不多,但要一直保持),可能引起饥饿(有的资源一直不到位)。
④ 破坏循环等待条件
顺序资源分配法:规定每个进程必须按编号递增的顺序请求资源,同编号资源一次申请完。(先持有小编号—> 才能申请大编号的资源)
缺点:不方便新增设备;进程实际使用资源与递增顺序不一样,资源浪费;必须按照顺序申请,编程麻烦。
3)死锁避免
原理:每一次资源分配时,用银行家算法检测,保证系统处于安全状态。
① 安全序列:如果系统按照一种序列分配资源,能保证每个进程都顺利完成,那么这个序列就是安全序列。
② 安全状态:能找到任何一个安全序列,就是安全状态
【注】安全状态一定不会发生死锁,非安全状态不一定会发生死锁。
③ 银行家算法:资源分配之前判断这次分配是否会导致系统进入不安全状态,如果会进入,就让线程阻塞。
4)死锁检测和解除
① 检测死锁
资源分配图,能消除所有的边,则称这个图是可完全简化的,此时一定没有发生死锁;不能全部消除,则此时一定发生了死锁,且连着边的节点就是发生死锁的进程。
② 死锁解除
a. 资源剥夺法
b. 撤销进程法(终止进程法)
c. 进程回退法