4.2.5 进程的调度
进程调度是操作系统核心功能之一,其目的是合理分配CPU资源,提高系统效率和响应速度。
1. 调度方式
- 可剥夺式调度:这种调度方式能更好地响应高优先级任务。例如,在实时系统中,当有紧急的实时进程(如火灾报警处理进程)到来时,会立即暂停当前正在运行的普通进程(如文档编辑进程),将CPU资源分配给实时进程,以保证紧急任务的及时处理。
- 不可剥夺式调度:适用于对任务连续性要求较高的场景。比如,在一些工业控制进程中,正在执行的控制程序(如生产线的流程控制)不能被轻易打断,即使有高优先级进程到来,也需等待其完成当前操作并释放CPU后,高优先级进程才能获得运行机会。
2. 三级调度
三级调度从不同层面管理进程的状态和资源分配:
- 高级调度(作业调度):决定哪些作业能进入内存。作业是用户提交的任务单位,高级调度会根据系统资源情况,选择合适的作业调入内存,为其创建进程。
- 中级调度(内存调度):主要用于内存管理,解决内存紧张问题。当内存不足时,会将部分暂时不用的进程调出内存(挂起),当内存有空闲时,再将合适的挂起进程调入内存继续运行。
- 低级调度(进程调度):直接负责CPU的分配,决定就绪队列中哪个进程获得CPU运行。前面提到的调度方式和调度算法主要针对低级调度。
3. 调度算法
- 先来先服务(FCFS):按进程到达就绪队列的先后顺序进行调度。优点是实现简单,公平性好;缺点是不利于短进程,可能导致长进程长时间占用CPU,短进程等待时间过长。例如,若就绪队列中有一个需要运行1小时的视频渲染进程和一个只需1分钟的文件复制进程,文件复制进程会因排在后面而等待1小时后才运行。
- 时间片轮转:将CPU时间划分成固定长度的时间片,就绪队列中的进程轮流获得一个时间片运行,若时间片用完仍未完成,则回到就绪队列末尾等待下一次调度。这种算法能保证各进程公平共享CPU,响应时间较好,常用于分时系统。比如,时间片设为100ms,进程P1运行100ms后未完成,就会被暂停,让给下一个进程P2运行。
- 优先级调度:为每个进程分配优先级,调度时选择优先级最高的进程运行。优先级可静态分配(创建时确定,终身不变)或动态调整(根据进程运行情况改变)。例如,系统进程优先级高于用户进程,实时进程优先级高于普通用户进程。
- 多级反馈调度算法:结合了时间片轮转和优先级调度的优点。设置多个优先级队列,优先级越高,时间片越短。进程开始时进入最高优先级队列,若时间片用完未完成则进入下一优先级队列。当高优先级队列空时,才调度低优先级队列的进程。这种算法能兼顾短进程和I/O型进程,是目前较优的调度算法之一。
4. 进程优先级确定
合理确定进程优先级能提高系统整体性能:
- I/O型进程(如键盘输入处理进程、网络数据接收进程)频繁进行I/O操作,CPU利用率低,将其放入最高优先级队列,能及时响应I/O请求,减少等待时间。
- 计算型进程(如科学计算进程、数据加密进程)主要占用CPU进行计算,将其逐步放入低优先级队列并采用较大时间片,可减少调度开销,提高CPU利用率。
- 对于I/O次数不多、以CPU处理为主的进程,在I/O完成后返回原队列,避免频繁进入高优先级队列导致的调度抖动。
- 动态调整优先级能适应进程不同阶段的需求,I/O完成后提高优先级可让其快速处理I/O结果,时间片用完降低优先级可避免进程长时间占用CPU。
4.2.6 死锁
死锁是操作系统中一种严重的故障状态,会导致系统资源浪费和任务停滞。
1. 死锁的定义
如你所述,死锁是指多个进程因相互等待对方释放已占有的资源而陷入无限等待的状态。
举例【4-2】补充
假设进程P1和P2的操作顺序如下:
- P1:请求读卡机A → 请求打印机B → 释放读卡机A → 释放打印机B
- P2:请求打印机B → 请求读卡机A → 释放打印机B → 释放读卡机A
若P1先获得读卡机A,同时P2先获得打印机B,此时P1需要打印机B才能继续运行,而P2需要读卡机A才能继续运行,双方都无法获得所需资源,就会陷入死锁。
死锁产生需要满足四个必要条件:互斥条件(资源只能被一个进程占用)、占有并等待条件(进程占有部分资源并等待其他资源)、不可剥夺条件(资源不能被强行剥夺)、循环等待条件(进程间形成资源等待循环链)。只要破坏其中一个条件,就能避免死锁的发生。
1. 调度方式
- 可剥夺式(抢占式):高优先级进程可强制剥夺当前进程的CPU。
- 不可剥夺式(非抢占式):当前进程主动释放CPU后,高优先级进程才能运行。
2. 三级调度
- 高级调度(作业调度):从外存后备队列中选择作业调入内存。
- 中级调度(内存调度):将暂时不能运行的进程调至外存(挂起),或重新调入内存(解挂)。
- 低级调度(进程调度):从就绪队列中选择进程分配CPU。
3. 调度算法
- 先来先服务(FCFS):按到达顺序分配CPU,简单但可能使短作业等待长作业。
- 时间片轮转(RR):按固定时间片轮流执行,兼顾响应时间。
- 优先级调度:按优先级分配CPU,可能导致低优先级进程“饥饿”。
- 多级反馈队列:动态调整优先级和时间片,兼顾I/O密集型和CPU密集型进程。
4. 进程优先级确定规则
- I/O型进程:
- 赋予最高优先级,时间片短(满足一次I/O请求),完成后转入阻塞队列。
- 计算型进程:
- 每次用完时间片后降级,最终用大时间片减少调度开销。
- 混合类型进程:
- I/O完成后返回原队列,避免重复降级。
- 动态调整:
- I/O完成时提升优先级,时间片用完时降低优先级。
4.2.6 死锁
1. 定义
- 多个进程因互相等待对方已占有的资源而无限阻塞的现象。
2. 举例【4-2】:进程推进顺序不当导致死锁
- 场景:系统有读卡机A和打印机B,被进程P1和P2共享。
- 死锁发生顺序:
- P1请求并占用A → P2请求并占用B。
- P1请求B(被P2占用,阻塞) → P2请求A(被P1占用,阻塞)。
- 结果:P1和P2互相等待对方释放资源,形成死锁。
3. 死锁的必要条件(补充)
- 互斥:资源一次只能被一个进程占用。
- 占有且等待:进程已占有资源,同时等待其他资源。
- 非抢占:已分配资源不能被强制剥夺。
- 循环等待:进程间形成环形等待链。
总结
- 调度需平衡响应时间、吞吐量和公平性,多级反馈队列能动态适应进程行为。
- 死锁需通过预防(破坏必要条件)、避免(银行家算法)或检测恢复(资源剥夺)处理。