第 3 章 进程调度与死锁¶
依据:《操作系统概论》(2017 年版)第 3 章、配套自考大纲及附录答案。下文编号指大纲“考核内容与考核要求”;标注“自编”的算例为学习辅助,不是真题。
复习导航:大纲要求与笔记位置¶
| 大纲条目 | 层次 | 位置 | 学完应能做到 |
|---|---|---|---|
| 1.1 进程调度功能、1.2 调度时机 | 识记 | 第 1 节 | 能定义、列出调度入口时机 |
| 2.1 选择准则 | 识记 | 第 2 节 | 能说明各种指标的侧重点 |
| 2.2 周转、平均周转、平均带权周转 | 简单应用 | 第 3 节 | 会算单作业和平均值 |
| 2.3 六种算法及抢占时机 | 领会 | 第 4 节 | 说明规则、适用情形及局限 |
| 2.4 实时条件、EDF、LLF | 领会 | 第 5 节 | 说明条件并跟踪截止时间/松弛度 |
| 2.5 多处理机类型、分配与调度 | 识记 | 第 6 节 | 区分分类与三种调度方式 |
| 3.1–3.3 死锁定义、原因、必要条件 | 领会 | 第 7 节 | 用资源等待关系分析四个条件 |
| 4.1 死锁预防 | 识记 | 第 8 节 | 说明破坏哪个必要条件 |
| 4.2 安全/不安全状态 | 识记 | 第 9 节 | 会判断安全序列,区分不安全和死锁 |
| 4.2 银行家算法 | 简单应用 | 第 10 节 | 会算 Need、试分配和安全性 |
| 4.3 检测、解除,死锁定理 | 识记 | 第 11 节 | 会化简资源图并说出解除方式 |
大纲将平均时间计算和银行家算法列为应用题;调度算法要求理解规则与实现思路,多处理机调度要求识记。
本章学习目标¶
本章分为调度与死锁两部分。前半介绍调度准则、周转时间、六种算法、实时调度和多处理机调度;后半从死锁四个必要条件,讲到预防、避免、检测与解除。
调度算法需按规则逐步画时间轴,检查到达时刻和入队顺序,再计算完成时间。银行家算法则需完整填写安全性表,尤其确认 Work 增加的是 Allocation,而不是 Need。
1 调度功能与时机(1.1、1.2,识记)¶
外存后备队列中的作业与内存就绪队列中的进程,分别由两级调度处理。作业调度从外存选择作业,将其装入内存并建立进程;进程调度从就绪队列选择进程,分配 CPU 使用权。本章主要讨论进程调度。
教材列出五类可能触发进程调度的时机:
- 当前进程正常结束或因异常终止。
- 当前进程因等待资源或 I/O 转为阻塞。
- 中断处理完成并准备返回。
- 抢占式系统中出现优先级更高的就绪进程。
- 当前进程的时间片用完。
2 调度准则(2.1,识记)¶
| 准则 | 含义/关注点 |
|---|---|
| 周转时间短 | 从提交到完成经过的总时间;用户等待体验 |
| 响应时间快 | 从请求提交到首次得到响应;交互系统关注 |
| 保证截止时间 | 最迟开始或完成的时限;实时系统关注 |
| 吞吐量高 | 单位时间完成的作业数 |
| CPU 利用率好 | 尽量减少处理器空闲 |
不同调度指标可能相互制约:短作业等待减少,长作业可能等待更久;时间片缩短可改善响应,却会增加切换开销。选择算法时,应结合批处理、分时或实时系统的目标权衡。
3 周转时间与计算(2.2,简单应用)¶
对作业 i:
服务时间 \(Ts_i\) 是作业实际占用 CPU 的总时长。周转时间 \(T_i\) 则从提交时刻算到完成时刻,包含等待调入、等待 CPU、执行和等待 I/O 的时间,因此 \(T_i \ge Ts_i\),带权周转时间 \(W_i \ge 1\)。若作业分多段执行,服务时间要累加各段 CPU 时间。题目若混用钟点时刻和分钟数,应先换成同一单位。
3.1 自编核算例¶
单 CPU,非抢占 FCFS,P1、P2 分别在 0、1 到达,服务时间为 3、2。P1 运行区间 [0,3],P2 为 [3,5]。
| 进程 | 到达(提交) | 服务 | 开始 | 完成 | 等待 | 周转 | 带权周转 |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 3 | 0 | 3 | 0 | 3 | 1 |
| P2 | 1 | 2 | 3 | 5 | 2 | 4 | 2 |
平均周转时间为 (3+4)/2=3.5,平均带权周转时间为 (1+2)/2=1.5。P2 等待时间是 3−1=2,周转时间则是 5−1=4。
本例用八列展示完整计算过程。按既有真题核对记录,202410 综合 37 的表格有六列(含等待时间),202504 综合 37 有五列(不含等待时间),两个平均值均另行计算。作答时应按题目给定的表头填写;本例多列出的中间量用于核算。
3.2 教材综合题:单作业平均周转时间(2016 年 4 月,未经原卷核验)¶
这题源自本地一份题目讲解资料,标为 2016 年 4 月综合题(年份与分值沿用该资料标注,未经官方原卷核验),正好对应大纲 2.2 的简单应用。题干只问单个作业的周转时间 \(T_i = \text{完成时刻} - \text{提交时刻}\) 和算术平均值 \(T = \frac{1}{n}\sum T_i\),不考带权周转时间;书写时注意别把单个作业的 \(T_i\) 和总平均 \(T\) 混用符号。
原题。
- 有一个单道作业的操作系统,若在一段时间内先后到达 4 个作业,它们的提交时间和估计运行时间见下表。系统采用短作业优先(SJF)算法。 要求: (1)列表给出 4 个作业的开始执行时间、完成时间、周转时间; (2)计算平均作业周转时间。
| 作业 | 提交时间 | 估计运行时间(分钟) |
|---|---|---|
| J1 | 8:00 | 60 |
| J2 | 8:20 | 35 |
| J3 | 8:25 | 25 |
| J4 | 8:30 | 20 |
单道是这题的前提:一次只装一道作业,选中的那道跑完才轮到下一道,中途不会被切走。所以不用考虑轮转和抢占,排出顺序、沿时间轴往下推就行。
要求(1):排开始、完成、周转。
8:00 只有 J1 到达,让它跑。60 分钟后 9:00 结束,周转时间 9:00−8:00=60。这一步容易误选 J4:它只要 20 分钟,看着最该优先,可 8:30 才提交,8:00 时还没进候选集。短作业优先挑的是“当前已到达的作业里最短的那个”,不是全局最短。
9:00 时 J2、J3、J4 都到了,运行时间分别是 35、25、20。选 J4,9:00 开始,9:20 完成,周转时间 9:20−8:30=50。基准是提交时刻 8:30,不是开始时刻 9:00,中间等的这 30 分钟要算进周转时间。这里最容易丢分:按开始时刻算会得出 20。
9:20 只剩 J2 和 J3,取较短的 J3,9:45 完成,周转时间 9:45−8:25=80。
9:45 时只剩 J2,J2 于 10:20 完成,周转时间为 10:20−8:20=120 分钟。J2 在 J1 后面的三道作业中最早提交,却最后完成;这段差额来自排队等待,不是运行中主动让出 CPU。
| 作业 | 到达(提交) | 服务 | 开始 | 完成 | 等待 | 周转 | 带权周转 |
|---|---|---|---|---|---|---|---|
| J1 | 8:00 | 60 | 8:00 | 9:00 | 0 | 60 | 1 |
| J4 | 8:30 | 20 | 9:00 | 9:20 | 30 | 50 | 2.5 |
| J3 | 8:25 | 25 | 9:20 | 9:45 | 55 | 80 | 3.2 |
| J2 | 8:20 | 35 | 9:45 | 10:20 | 85 | 120 | 3.43 |
表按执行顺序排,不是按作业编号排。等待与带权周转两列按八列体例补出,本题原问只有开始、完成、周转三项;带权周转 J2 为 120÷35,除不尽,取 3.43。
要求(2):算平均值。
平均周转时间 =(60+50+80+120) ÷ 4 = 310 ÷ 4 = 77.5 分钟。
可用完成时刻总和减提交时刻总和核对周转时间总和:换算为分钟后,前者为 2305,后者为 1995,差值为 310,与表中周转时间之和一致。
作答与扣分点。 讲解资料标注这题 10 分,表格 6 分、平均周转时间 4 分;这份评分细则同样未经官方试卷核验。
计算时检查以下五点:
- 拿全局最短的作业当候选,忘了 J4 在 8:00 还没提交。
- 周转、等待、运行三个时间混着用。J4 的完成减提交是 50,开始减提交是 30,完成减开始是 20。本题没有 I/O,中间那 30 分钟就是等待。
- 把非抢占的 SJF 当成可抢占,中途换作业;或者凭空给 CPU 塞一段空闲。本题四道作业首尾相接,没有空闲——别的题里若还没有作业到达,CPU 是可以闲着的。
- 求平均忘了除以作业数,拿总周转时间当平均值。
- 单位没统一到分钟,把 9:00−8:00 记成 1。
4 进程调度算法(2.3,领会)¶
调度准则确定评价目标,调度算法规定每次从就绪集合中选哪个进程。规则不同,执行顺序就不同,等待、响应和周转时间也随之改变。
| 算法 | 选择规则 | 优点与局限 |
|---|---|---|
| FCFS 先来先服务 | 选最先进入就绪队列者,通常非抢占 | 简单;长进程在前会使短进程等待很久;偏有利于 CPU 繁忙进程 |
| SPF 短进程优先 | 在就绪进程中选估计服务时间最短者,教材描述为运行到完成或阻塞再调度 | 可降低平均等待/周转;长进程可能饥饿;运行时间依赖估计,不保证紧迫任务优先 |
| 优先权 | 选优先级最高的就绪进程 | 可按任务重要性调度;定义须看系统是数值大优先还是数值小优先 |
| RR 时间片轮转 | 就绪队列按 FIFO;运行一个时间片,未完成则放队尾 | 适合分时交互;片太短切换开销大,太长响应变慢;片足够大时近似 FCFS |
| 多级队列 | 按属性固定分入不同就绪队列,各队列可有自己的优先级和算法 | 开销较低;分类固定、灵活性差,低优先级队列可饥饿 |
| 多级反馈队列 | 进程可按反馈规则在不同优先级队列间移动;教材典型规则为高优先级队列时间片较短 | 兼顾短作业响应与长作业进展;规则较复杂,具体实现因系统而异 |
4.1 抢占、非抢占与优先级¶
- 非抢占式:进程获得 CPU 后持续执行,直到完成、阻塞或主动让出。期间即使有优先级更高或服务时间更短的进程到达,也要等待当前进程让出 CPU。教材中的 SPF(短进程优先)默认采用非抢占方式,每次从已到达的就绪进程中选择服务时间最短者;不要将其与可抢占的“短剩余时间优先”混淆。
- 抢占式:满足条件就剥夺当前进程的 CPU,教材给出两种时机——要么新进程到达时立即抢占,要么等到最近一次时钟中断再切换。
- 静态优先级与动态优先级:前者在创建时定死、全程不变;后者随运行时间增长或等待时间变长动态调整。
- 饥饿与老化:就绪进程长期抢不到 CPU 叫饥饿,教材给出的解法是老化——等得越久,逐步把它的优先级往上提。
再来看 RR(时间片轮转) 的推演规矩:每次从队首取出一个进程,运行 min(时间片, 剩余服务时间);跑完就撤出,没跑完就放回队尾,同时把各进程的到达、空闲和完成时刻记清。
图3-1 时间片轮转调度时间轴
照配图走一遍完整的。图设三个进程、时间片 q=2,三者在 0 时刻同时就绪,各需 4 个时间单位(图上 P1、P2、P3 各出现两次、每次占 2 格,没有第三次出现)。初始就绪队列 P1, P2, P3,各剩 4。
| 区间 | 队首 | 该进程剩余 | 跑多久 | 结果 | 之后队列 |
|---|---|---|---|---|---|
| 0–2 | P1 | 4 | 2 | 用满一片未完成,剩 2,回队尾 | P2, P3, P1 |
| 2–4 | P2 | 4 | 2 | 剩 2,回队尾 | P3, P1, P2 |
| 4–6 | P3 | 4 | 2 | 剩 2,回队尾 | P1, P2, P3 |
| 6–8 | P1 | 2 | 2 | 跑完,剩 0,撤销 | P2, P3 |
| 8–10 | P2 | 2 | 2 | 跑完 | P3 |
| 10–12 | P3 | 2 | 2 | 跑完 | 空 |
完成时刻依次是 8、10、12。三者在 0 时刻到达,周转时间就等于完成时刻:T1=8、T2=10、T3=12,平均周转时间 (8+10+12)÷3=10。带权周转时间分别是 8÷4=2、10÷4=2.5、12÷4=3,平均 2.5。
这一遍里有四个动作值得记牢。
- 队列一直在转,但每个进程每轮只拿一片。P1 在 6–8 拿到第二片,是队列轮到它,不是“别人跑完了补给它”。
- 时间片用满而没跑完,叫时间片到期:进程回队尾,状态回到就绪。跑完了才撤销。这两种结果在推演表里要分开记,混了就会多算一轮。
- 队首若只剩不到一个时间片,跑完就撤,不会空占满整片。本例每个进程每次都恰好用满 2 格,没撞上这种情形;换一组数据就可能遇到。
- 到达时刻一旦错开,第一轮队列里就只有已到达的那几个,新进程在到达时插入队尾。图上三者同时到达,所以从第一轮起队列就是满的。
上述计算假定进程没有中途阻塞、切换开销忽略不计。若只有当前进程可运行,时间片到期后仍可再次选中它;以后有新进程到达时,仍需按题设的时间片与入队规则处理,不能据此让当前进程无限延长本轮运行。
新进程恰在时间片结束时到达的情形,也要先约定“新到达者先入队”还是“原进程先回队尾”。题目有规定时依题目;未规定时应写明约定,并全程保持一致。
5 实时系统调度(2.4,领会)¶
教材从四方面说明实时调度所需的支持:完整的任务信息(就绪时间、开始或完成截止时间、处理时间、资源需求、优先级)、足够的处理能力、满足任务要求的抢占机制,以及较短的中断响应和上下文切换时间。具体能否满足截止时间,仍需结合任务集合和调度规则分析。
对周期性硬实时任务,设任务 \(i\) 的周期为 \(P_i\)、每次处理耗时为 \(C_i\),则其平均处理器利用率为 \(C_i/P_i\)。总需求不应超过处理器容量:
以上是不超过处理器总容量的必要条件,不能单凭它判定所有任务都能按期完成;还需考虑截止时间、抢占方式、任务约束和调度开销。
大纲重点介绍以下两种动态实时调度算法:
| 算法 | 优先依据 | 执行规则 |
|---|---|---|
| EDF 最早截止时间优先 | 谁的截止时间早谁先上 | 就绪队列按截止时间从早到晚排;抢占与非抢占场景都能用 |
| LLF 最低松弛度优先 | 谁的“富余时间”少谁先上 | 松弛度 \(L = \text{截止时间 } T - \text{当前时刻 } T_c - \text{剩余处理时间 } T_s\),挑 \(L\) 最小者 |
EDF 根据截止时刻决定优先级,不按到达先后排序。LLF 则要随时间更新松弛度。任务执行 1 个时间单位时,当前时刻 \(T_c\) 增加 1、剩余处理时间 \(T_s\) 减少 1,因此该任务的 \(L\) 不变;等待中的任务处理时间不变,松弛度会逐渐减小。若其松弛度降到 0,再延迟执行就会错过截止时间。
6 多处理机调度(2.5,识记)¶
机器里不止一颗 CPU 时,先看硬件怎么连、内核怎么管,再看线程怎么往多颗核上派:
| 分类角度 | 类型 | 含义 |
|---|---|---|
| 耦合程度 | 紧密耦合 | 多个处理机共享主存和 I/O 设备,归同一个操作系统统一管理 |
| 耦合程度 | 松弛耦合 | 多台机器各有独立内存与 I/O,能各自单干,靠通信链路互联协作 |
| 处理器控制关系 | 对称多处理(SMP) | 各处理器地位平等,都能自己跑内核代码、自己挑任务调度 |
| 处理器控制关系 | 非对称多处理 | 指定一颗主处理器统管内核与任务分派,其余从处理器只管干活 |
往多颗处理器上派活,教材讲了三种路数:
- 自调度:全系统共用一条就绪队列,各处理器空闲时从队列中取任务。任务可由空闲处理器继续领取,有利于分散负载;多个处理器同时访问队列会增加锁竞争。同一应用中相互依赖的线程也可能无法同时运行,导致处理器等待。
- 成组调度:在同一时间片内,将同一应用中密切协作的一组线程分配到多个处理器并行执行,减少线程相互等待和切换的开销;代价是调度器需要协调多个处理器的分配。
- 专用处理器分配:应用运行期间,为每个线程分配专用处理器,减少切换开销;但线程等待 I/O 时,其处理器也可能闲置,整体利用率较低。
7 死锁定义、原因与四个必要条件(3.1–3.3,领会)¶
调度算法决定就绪进程的执行次序,但无法直接解决死锁。若一组进程中的每个进程都在等待其他进程持有的资源,且这些资源只有由等待中的进程释放后才能获得,这组进程就无法继续推进,形成死锁。其主要原因是资源竞争和不当的申请、释放次序。
死锁要想成立,下面四个必要条件缺一不可:
| 条件 | 含义 | 典型破坏思路 |
|---|---|---|
| 互斥 | 资源一次只允许一个进程独占 | 改成可共享访问,但打印机、写锁这类资源天生没法取消互斥 |
| 请求和保持 | 手里占着已分到的资源不放,同时伸手要新资源 | 开跑前一次性要齐全部资源,或者要新资源前先把旧资源全退回 |
| 不剥夺 | 分出去的资源只能由进程自己用完释放,别人不能硬抢 | 新申请得不到满足时,按规则强行收回或让出已占资源 |
| 环路等待 | 存在 P0 等 P1、P1 等 P2 … Pn 等 P0 的闭环等待链 |
给所有资源类型统一编号,硬性规定只能按编号递增顺序申请 |
死锁发生时,四个必要条件必须同时成立;破坏其中任意一个,就可阻止这类资源死锁。但单独满足某一条件不能证明已死锁,例如互斥访问本身并不意味着发生死锁。
图3-2 资源分配图中的等待环
图3-2 就是最典型的双进程死锁:资源 A、B 各只有 1 个实例,互斥且不可剥夺;P1 占着 B 等 A,P2 占着 A 等 B,四条条件全齐,谁也退不出来。
8 死锁预防(4.1,识记)¶
死锁预防的思路是保证至少一个必要条件不成立。互斥通常是某些资源的固有属性,不适合一概取消,教材因此重点讲摒弃其余三个条件:
| 摒弃的条件 | 做法 | 代价/限制 |
|---|---|---|
| 请求和保持 | 运行前一次性申请所需资源;或申请新资源前释放已有资源 | 资源需求难以预知,资源可能闲置,并发性下降 |
| 不剥夺 | 新申请无法满足时,按策略释放/抢占已持资源 | 实现复杂;某些资源不适合抢占,可能要回滚 |
| 环路等待 | 资源类型排序,进程按递增次序申请 | 限制申请顺序、降低灵活性,可能浪费资源 |
死锁预防通过限制申请或占有方式,使至少一个必要条件不成立;死锁避免则允许动态申请,但在分配前检查新状态是否安全。银行家算法属于后者。
9 安全状态与不安全状态(4.2,识记)¶
若能找到一个进程序列,使每个进程轮到自己时都能被满足,系统就处于安全状态。满足它的是当前可用资源,加上前面进程完成后释放的资源;该序列称安全序列。找不到这样的序列,就是不安全状态。
不安全状态不等于已经死锁。安全状态存在一条安全序列,按该序列分配资源,可以保证所有进程在其最大需求范围内完成;不安全状态表示缺少这种保证,后续可能发生死锁,但当前未必已经死锁。判断时应区分“能否保证完成”和“是否已经相互等待”。
单一资源类型下有直观判法。逐个寻找 Need <= Available 的进程,假设它完成并归还已占资源 Allocation,更新可用量,再继续检查。
10 银行家算法(4.2,简单应用)¶
银行家算法把安全状态的判断用于每一次资源申请。它先试算请求获准后的状态,再检查是否仍存在让全部进程完成的安全序列。
先约定记号:n 个进程、m 类资源。
| 数据 | 含义 |
|---|---|
| Available[j] | 当前 j 类资源可用数量 |
| Max[i,j] | 进程 i 对 j 类资源的最大需求 |
| Allocation[i,j] | 已分给进程 i 的 j 类资源 |
| Need[i,j] | 进程 i 尚需资源,Need = Max − Allocation |
| Requesti | 进程 i 本次提出的请求向量 |
向量不等式逐项比较。X <= Y 表示每一种资源都不超过对应分量,不是把各分量求和后再比较。
10.1 安全性检查¶
Work = Available;所有Finish[i] = false。- 找一个
Finish[i] = false且Need[i] <= Work的进程。 - 假设它运行完毕:
Work = Work + Allocation[i],置Finish[i] = true,记下进程序列。 - 重复检查。若所有进程 Finish 为 true,安全;否则若找不到可继续者,不安全。
图3-3 银行家算法安全性检查
10.2 资源请求检查¶
进程 i 请求 Requesti 时:
- 检查
Requesti <= Needi是否逐项成立。若任一分量超过对应的 Need,说明超过声明的最大需求,拒绝该请求。 - 检查
Requesti <= Available是否逐项成立。若任一类资源不足,进程等待。 - 否则做试分配:
Available -= Requesti;Allocation[i] += Requesti;Need[i] -= Requesti。 - 对试分配后的状态运行安全性检查。安全则确认分配;不安全则撤销试分配,令进程等待。
10.3 教材例题状态核对¶
教材的 A、B、C 三类资源例题中,初始 Available=(3,3,2),安全序列为 <p1,p3,p4,p2,p0>。p1 请求 (1,0,2) 后,Available=(2,3,0)、Need1=(0,2,0)。试分配后的状态仍然安全,因此可以分配。
安全性检查的记录应包含三项:每一步的 Work,所选进程的 Need,以及该进程完成后归还的 Allocation。Work 增加的只是原来已经分配给进程的资源。当前可用量满足不了某一个进程,并不表示整个状态不安全,其他进程可能先完成并释放资源。
10.4 安全性检查过程表¶
安全性检查过程表包含六列:进程 | Work | Need | Allocation | Work+Allocation | Finish。教材例题初始 Available=(3,3,2),共有五个进程、三类资源,先用 Need = Max − Allocation 补齐初始状态:
| 进程 | Allocation | Max | Need |
|---|---|---|---|
| p0 | (0,1,0) | (7,5,3) | (7,4,3) |
| p1 | (2,0,0) | (3,2,2) | (1,2,2) |
| p2 | (3,0,2) | (9,0,2) | (6,0,0) |
| p3 | (2,1,1) | (2,2,2) | (0,1,1) |
| p4 | (0,0,2) | (4,3,3) | (4,3,1) |
接着逐行推,一行选中一个进程:
| 进程 | Work | Need | Allocation | Work+Allocation | Finish |
|---|---|---|---|---|---|
| p1 | (3,3,2) | (1,2,2) | (2,0,0) | (5,3,2) | true |
| p3 | (5,3,2) | (0,1,1) | (2,1,1) | (7,4,3) | true |
| p4 | (7,4,3) | (4,3,1) | (0,0,2) | (7,4,5) | true |
| p2 | (7,4,5) | (6,0,0) | (3,0,2) | (10,4,7) | true |
| p0 | (10,4,7) | (7,4,3) | (0,1,0) | (10,5,7) | true |
第一行的 Work 取初始 Available,之后每一行的 Work 取上一行的 Work+Allocation,表示已完成进程释放资源后的可用量。五行均满足 Need <= Work,因此得到安全序列 <p1,p3,p4,p2,p0>。
Work 增加的是该进程的 Allocation,不是 Need。 安全性检查假设进程能获得剩余需求、执行完成并归还全部资源,这一过程对 Work 的净增加量是原先已分配的 Allocation。若误写为 Work + Need,后续可用量就会失真,安全性判断也会出错。
可用资源总量核对:初始 Available (3,3,2) 加上全部 Allocation (7,2,5),等于 (10,5,7),即 A、B、C 三类资源的总量。最后一个进程完成后,Work 应等于这个总量,可用来检查表格是否算错。
11 死锁检测、资源分配图与解除(4.3,识记)¶
死锁检测与解除允许系统先分配资源,再定期或按需检测死锁。检测过于频繁会增加 CPU 开销,间隔过长则可能使更多进程等待,因此需结合死锁发生概率和检测成本决定频率。
检测工具是资源分配图:圆圈画进程,方框画资源类,框里的小圆点代表该类资源有几个实例;从进程指向资源框的有向边叫请求边(还要申请),从资源实例小圆点指向进程的有向边叫分配边(已经占住)。
死锁定理指出:当前状态死锁,当且仅当资源分配图不可完全简化。化简时,选择一个非孤立、且当前请求可由空闲资源满足的进程,假设它完成并释放全部已占资源,删除与它相连的请求边和分配边,再对剩余进程重复这一过程。若所有进程均可化为孤立点,则无死锁;若还有进程未化简却无法继续,则存在死锁。
“有环就死锁”只适用于每类资源只有单个实例的情况。若某类资源有多个实例,环外进程可能先完成并释放所需资源,使环中的进程继续执行。因此,多实例资源分配图应通过化简判断,不能只看是否存在环。
一旦查出死锁,解除只有两条路:
- 终止进程:终止全部死锁进程,或按代价逐个终止,每次重新检测,直到死锁解除。选择进程时,需要考虑优先级、已执行时间、剩余执行时间、占有资源量、对其他进程的影响,以及是否为前台交互任务。
- 剥夺资源:从部分死锁进程中收回资源,分配给其他进程,以打破等待关系。需要决定剥夺对象、进程回滚的安全检查点,并避免反复选择同一进程而造成饥饿。
12 考核要求¶
本章共 14 条考核条目:识记 7 条、领会 5 条、简单应用 2 条。简单应用包括 2.2 周转时间计算和 4.2 银行家算法。复习时对照各调度准则与六种算法,画出 FCFS、SPF、RR 的时间轴,检查到达时刻与入队顺序;再练习死锁四个必要条件和银行家算法六列安全性检查表。
13 教材本章习题¶
题目取自教材第 3 章“习题”(共 13 题),答案取自教材附录“参考答案”(全部收录)。
13.1 单项选择题¶
1. 影响时间片大小选择的主要因素有【 】。
答案与解析
参考答案: A。时间片直接影响轮转系统的响应时间;实际选择还要兼顾进程数和切换开销。
2. 关于多级队列调度算法,下列说法正确的是【 】。
答案与解析
参考答案: C。多级队列可为各队列配置不同优先权和调度算法;进程固定属于某队列,跨队列移动是多级反馈队列的特点。
3. 某系统中有 4 个并发进程,都需要同类资源 3 个。该系统不会发生死锁的最少资源数是【 】。
答案与解析
参考答案: D。最坏情况是每个进程先各占 2 个,共占 8 个;再有第 9 个资源即可让一个进程取得第 3 个资源并完成、释放资源,随后其他进程依次完成。一般 n 个进程各需 k 个同类资源时,足以保证不死锁的资源数为 n(k−1)+1。
13.2 填空题¶
4. FCFS 适合___进程,不利于___进程。
答案与解析
参考答案: 长;短。教材附录此处作“短、长”,与正文相反,按正文与通用结论作答。
5. 采用基于静态优先权的调度算法时,若不断有高优先权进程进入就绪队列,低优先权进程可能进入___状态。
答案与解析
参考答案: 饥饿。
6. ___算法是用来避免死锁的算法。
答案与解析
参考答案: 银行家。
7. S 为死锁状态的___条件是当且仅当 S 状态的资源分配图是不可完全简化的。
答案与解析
参考答案: 充分。教材附录按此空格给出答案;完整死锁定理的表述见本章第 11 节。
13.3 简答题¶
8. 进程调度的功能是什么?
答案与解析
参考答案: 内核调度程序按策略和算法从就绪进程中选择一个,为其分配 CPU,使其进入执行状态。
9. 说明什么是时间片轮转调度算法。
答案与解析
参考答案: 就绪进程按先来先服务排队;队首进程运行一个时间片,完成则退出,未完成则回到队尾;时间片到期后重新调度。时间片过短会增加切换开销,过长则响应变慢。
10. 什么是多级队列调度算法?
答案与解析
参考答案: 按进程属性将就绪队列划分为多个独立队列,进程进入系统后固定分配到一个队列;各队列可有不同优先级和调度算法。调度开销较低,但灵活性较差,低优先级队列可能饥饿。
11. 什么是自调度方式?有什么优缺点?
答案与解析
参考答案: 多个处理器从共享就绪队列自行选择进程或线程。优点是实现简单、可动态分配负载;缺点是队列竞争和调度开销,合作线程也可能因未同时运行而相互等待。
12. 什么是死锁?引起死锁的原因是什么?
答案与解析
参考答案: 多个进程竞争共享资源,各自等待其他进程占有的资源而都不能继续推进,这种僵持状态称为死锁。其原因是竞争共享资源且资源分配顺序不当。
13.4 综合应用¶
13. 考虑系统某一时刻的状态,资源列顺序为 A、B、C、D。
| 进程 | Allocation | Max | Available |
|---|---|---|---|
| p0 | (0,0,1,2) | (0,0,1,2) | (1,5,2,0) |
| p1 | (1,0,0,0) | (1,7,5,0) | |
| p2 | (1,3,5,4) | (2,3,5,6) | |
| p3 | (0,6,3,2) | (0,6,5,2) | |
| p4 | (0,0,1,4) | (0,6,5,6) |
用银行家算法回答:
- Need 矩阵是什么?
- 系统是否处于安全状态?
- 若 p1 请求
(0,4,2,0),能否立即满足?
答案与解析
参考答案: (1)计算 Need。 Need = Max − Allocation,逐资源列相减:
| 进程 | Need (A,B,C,D) |
|---|---|
| p0 | (0,0,0,0) |
| p1 | (0,7,5,0) |
| p2 | (1,0,0,2) |
| p3 | (0,0,2,0) |
| p4 | (0,6,4,2) |
(2)检查初始安全性。 初始 Work = Available = (1,5,2,0)。按 Need[i] <= Work 逐项比较,并在假设进程完成后加回其 Allocation:
| 步骤 | 进程 | Need | 完成前 Work | 完成后 Work = Work + Allocation |
|---|---|---|---|---|
| 1 | p0 | (0,0,0,0) | (1,5,2,0) | (1,5,3,2) |
| 2 | p2 | (1,0,0,2) | (1,5,3,2) | (2,8,8,6) |
| 3 | p3 | (0,0,2,0) | (2,8,8,6) | (2,14,11,8) |
| 4 | p4 | (0,6,4,2) | (2,14,11,8) | (2,14,12,12) |
| 5 | p1 | (0,7,5,0) | (2,14,12,12) | (3,14,12,12) |
因此存在安全序列 <p0,p2,p3,p4,p1>,系统处于安全状态。
(3)检查 p1 的请求。 请求 (0,4,2,0) 不超过 Need1=(0,7,5,0),也不超过 Available=(1,5,2,0),可以试分配:
对试分配状态进行安全性检查:
| 步骤 | 进程 | Need | 完成前 Work | 完成后 Work |
|---|---|---|---|---|
| 1 | p0 | (0,0,0,0) | (1,1,0,0) | (1,1,1,2) |
| 2 | p2 | (1,0,0,2) | (1,1,1,2) | (2,4,6,6) |
| 3 | p3 | (0,0,2,0) | (2,4,6,6) | (2,10,9,8) |
| 4 | p4 | (0,6,4,2) | (2,10,9,8) | (2,10,10,12) |
| 5 | p1 | (0,3,3,0) | (2,10,10,12) | (3,14,12,12) |
仍存在安全序列 <p0,p2,p3,p4,p1>,所以该请求可以立即满足。
14 闭卷复习与跨章联系(补充)¶
一、闭卷自答(合上书逐题口述)
- 进程调度与作业调度各在什么阶段起作用,教材列的重新调度时机有哪五类?
- 周转时间、带权周转时间、平均周转时间各自怎么算,等待时间又怎么由它们反推?
- FCFS、SPF、优先权、RR 四种算法的选择规则各是什么,各自偏利哪类作业、代价是什么?
- 时间片轮转推演里,新到达的进程与时间片用完的进程谁先入队,为什么全题要统一?
- 如何判断系统处于安全状态,安全性检查表的 Work 为什么只能加 Allocation?
- 死锁的四个必要条件各是什么,预防时为什么通常不走“取消互斥”这一条?
二、本章易错
- 短作业/短进程优先只在“当前已到达”的候选里挑最短,别把还没提交的全局最短作业提前排进去(第 3.2 节)。
- 安全性检查表里
Work累加的是该进程已占有的Allocation,不是它还差多少的Need(第 10.4 节)。 - 不安全状态只是“眼下排不出稳妥的完成序列”,还不等于已经死锁;资源分配图有环在多实例下也不必死锁,要按死锁定理看能否完全简化(第 9、11 节)。
三、本章骨架
| 阶段 | 什么时候用 | 手段 |
|---|---|---|
| 调度 | 从就绪集合选下一个 | 六种算法,按周转与带权周转评价 |
| 预防 | 分配前限制申请方式 | 破坏互斥以外的三个必要条件之一 |
| 避免 | 每次分配前先试算 | 银行家算法:试分配加安全性检查 |
| 检测 | 先分配、之后定期查 | 资源分配图化简,依死锁定理 |
| 解除 | 确认死锁之后 | 终止进程或抢占资源 |
四、跨章指路