第三章:处理机调度与死锁
第三章:处理机调度与死锁
1.处理机调度的概述
高级调度:硬件到内存之间的调度,将外存上处于后备队列中的作业调入内存,也称为作业调度
低级调度:内存到CPU之间的调度,决定就绪队列中的哪个进程应获得处理机,也称为进程调度
中级调度:根据优先级,外存上的急需运行的进程调入内存运行,也称为内存调度
调度程序分为三部分(进程调度的机制)
排队器:用于将就绪进程插入相应的就绪队列
分派器:用于将选定的进程移出就绪队列
上下文切换器:进行新旧进程之间的上下文切换

抢占式:系统可以“打断”正在用CPU的进程,比如来了更紧急的任务,或者它用太久了,就把它暂停,让别人先用。
非抢占式:谁拿到CPU就一直用,直到自己用完或主动让出,别人不能插队。
2.调度算法
调度算法的共同目标:资源利用率,公平性,平衡性,策略强制执行
批处理系统:周转时间短,吞吐量高,处理机利用率高
分时系统:响应时间快,均衡性
实时系统:截止时间的保证
CPU利用率 = CPU有效工作时间 / ( CPU有效工作时间 + CPU空闲等待时间 )
评价指标
- 周转时间:从作业提交给系统开始,到作业完成为止的这段时间间隔
- 带权周转时间:权值为作业周转时间T与系统为之服务时间TS之比
- 响应时间:从用户提交请求开始,直到系统首次显示处理结果的时间
- 等待时间:进程在就绪队列中等待调度的所有时间之和
作业调度算法:
先来先服务(FCFS)、短作业优先(SJF)、优先级调度(PR)、高响应比(HRRN)
进程调度算法:
先来先服务(FCFS)、短作业优先(SJF)、优先级调度(PR)、时间片轮转(RR)
先来先服务(FCFS):按照作业到达的先后次序来进行调度

短作业优先(SJF):
对作业:从后备队列中选择若干个估计运行时间最短的作业。
对进程:关联到每个进程下次运行的CPU区间长度,调度最短的进程
抢占式:有比当前进程剩余时间片更短的进程到达时,先执行运行时间短的

非抢占式:必须等到当前进程全部执行完或者主动放弃CPU

缺点:人-机无法实现交互、未考虑作业的紧迫程度
优先级调度(PR):基于作业/进程的紧迫程度,由外部赋予作业相应的优先级,根据优先级进行调度。小的优先数具有高优先级
静态优先级:在创建进程时,确定优先数,在进程运行的整个过程中不变,可能会出现优先级低的进程长期没有被调度的情况
动态优先级:创建进程时先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变

缺点:饥饿 ——低优先级的进程可能永远得不到运行
高响应比优先调度算法(PR):既考虑作业的等到时间,又考虑作业的运行时间

时间片轮转:类似于FCFS,但增加了抢占,(时间片 / 10 > 进程上下文切换时间)

3.实时调度
最早截止时间优先(EDF):根据任务的截止时间确定优先级,截止时间越早,优先级越高
最低松弛度优先(LLF)算法:根据任务的紧急程度确定优先级,紧急程度越高,优先级越高
4.Linux进程调度

5.死锁概述
概念:死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局
产生死锁的必要条件:
互斥
请求与保持
不可抢占
循环等待
产生死锁的原因:
竞争不可抢占性资源
竞争可消耗性资源
进程推进顺序不当
处理死锁的方法:
预防死锁:破坏死锁的四个必要条件中一个或几个
避免死锁:在资源动态分配时,防止系统进入不安全状态。
检测死锁:事先不采取任何措施,允许死锁发生,但及时检测死锁发发生。
解除死锁:检测到死锁发生时,采取相应措施,将进程从死锁状态中解脱出来。
6.预防死锁
互斥:互斥条件是共享资源必须的,不能改变,应加以保证
请求与保持:别一边拿着资源一边再要新资源,要么全要完再用,要么用完释放完再要,这样更安全高效。
传统做法:执行前一次性申请全部资源
改进做法:先拿一部分资源开始运行,用完后再逐步释放,再申请新的资源。
非抢占:
如果一个进程的申请没有实现,它要释放所有占有的资源;
循环等待:
对所有资源类型进行线性排序,并赋予不同的序号,要求进程按照递增的顺序申请资源
7.避免死锁
死锁避免 ---> 确保系统永远不会进入不安全状态
银行家算法是一种避免死锁的策略,只在确保“不会让系统陷入危险状态”的前提下,才分配资源
🌟 核心思想(通俗版):
系统像一个谨慎的银行家:
每个进程申请资源时,先假装同意,然后检查: “如果给了它,剩下的资源还能不能让所有进程都顺利完成?”
如果能 → 安全,就真的分配;
如果不能 → 不安全,就拒绝,让进程等等。
🔑 关键概念:
最大需求(Max):每个进程最多要多少资源(提前声明)。
已分配(Allocation):已经给了多少。
还需要(Need) = 最大需求 - 已分配。
可用资源(Available):系统当前空闲的资源。

根据Available去找是否有能够满足的Need


✅ 总结一句话:
银行家算法 = 先模拟分配,确认安全再真正分配,从而避免死锁。
8.死锁的检测与解除
🔍 死锁怎么检测?
系统会画一张“资源分配图”:
看哪些进程在等资源;
看哪些资源被谁占着;
如果图中出现“循环等待”(比如 A 等 B 的资源,B 又等 A 的),就说明发生了死锁。

就像几个人互相借笔,A 等 B 还笔,B 等 C,C 又等 A— —谁也动不了,卡住了。
🛠️ 检测到死锁后怎么解除?
常用方法有:
终止进程
直接干掉一个或多个死锁中的进程(选代价小的,比如没做太多工作的)。
抢占资源
把某个进程占的资源强行拿走,给别的进程用,打破循环。
之后可能要让被抢的进程回滚重做。
回滚重启
让某些进程退回到之前的安全状态,重新申请资源。
