四、进程同步与死锁(第39-50题)
第39题
下列关于临界资源与临界区的叙述中,正确的是( )。
A. 临界资源是允许多个进程同时读写的共享资源,临界区则是访问该资源的程序段 B. 临界区是进程中访问临界资源的那段代码,多个进程可以同时进入各自访问同一资源的临界区 C. 临界资源是一次仅允许一个进程使用的共享资源,临界区是进程中访问临界资源的那段代码 D. 凡是共享资源都是临界资源,凡是访问共享资源的程序段都是临界区
答案:C
考点定位:四、进程同步与死锁——临界资源与临界区的概念,难度★☆☆☆☆,同步互斥问题的最基本概念,国企与互联网笔试中常以概念辨析题出现。
【结论】 临界资源是一次仅允许一个进程使用的共享资源,临界区是进程中访问临界资源的那段代码,选 C。
【逐项辨析】
- A 错在“允许多个进程同时读写”——临界资源的定义恰恰是排他性,任一时刻只允许一个进程使用。
- B 错在后半句“多个进程可以同时进入各自访问同一资源的临界区”——若真能同时进入,互斥就失去了意义;可以有多个进程同时申请,但只能有一个进入。
- C 正确——前半句给出临界资源的排他性,后半句给出临界区的代码属性,与教材定义完全一致。
- D 错在两个“凡是”——共享资源不必都是临界资源(如只读的共享代码段、可重入库函数),访问共享资源的程序段也不一定构成临界区。
【知识点】 三个层次的概念与四条准则:
| 概念 | 定义 | 判定要点 |
|---|---|---|
| 共享资源 | 可被多个进程访问的资源 | 不要求排他 |
| 临界资源 | 一次仅允许一个进程使用的共享资源 | 必须排他 |
| 临界区 | 进程中访问临界资源的那段代码 | 是代码,不是资源 |
| 进入区 | 临界区之前申请许可的代码 | 检查并上锁 |
| 退出区 | 临界区之后释放许可的代码 | 解锁并唤醒等待者 |
| 剩余区 | 进程中的其他代码 | 不含临界资源访问 |
同步机制的四条准则:①空闲让进——临界区空闲时应允许一个请求进入;②忙则等待——已有进程在临界区时其他进程必须等待;③有限等待——等待者不能无限期被推迟;④让权等待——等待时应释放处理机,不能忙等。
【推导过程】 临界区的标准代码结构:
do {
entry section; // 进入区: 如 P(mutex), 申请进入临界区
critical section; // 临界区: 访问临界资源(如共享变量、打印机)
exit section; // 退出区: 如 V(mutex), 释放许可
remainder section;// 剩余区: 与临界资源无关的其他代码
} while (true);互斥执行的状态表(以 mutex 初值 1 为例):
| 时刻 | 进程 P1 | 进程 P2 | mutex 值 | 说明 |
|---|---|---|---|---|
| t₁ | 执行 P(mutex),进入临界区 | 尚未申请 | 1 → 0 | P1 占住临界资源 |
| t₂ | 在临界区内执行 | 执行 P(mutex) | 0 | P2 被阻塞,进入等待队列 |
| t₃ | 执行 V(mutex),退出 | 仍阻塞 | 0 → 1 | P1 释放,唤醒 P2 |
| t₄ | 在剩余区执行 | 获得许可进入临界区 | 1 → 0 | 任一时刻最多一个进程在临界区内 |
关键点:被阻塞的进程可以有很多个,但任一时刻处于临界区内的进程至多一个。
【记忆锚点】 口诀——“资源是东西,临界区是代码;资源要独占,代码要互斥”。再记一句:“申请可以排队,进入只能一个”。
【易混对比】
| 临界资源 | 临界区 | |
|---|---|---|
| 本质 | 资源(打印机、共享变量、文件) | 代码段(访问资源的那几行) |
| 是否可共享 | 是共享资源,但须排他使用 | 不共享,各进程有各自的临界区 |
| 数量关系 | 一个临界资源 | 可对应多个进程的临界区 |
| 常见误写 | 说成“可同时读写” | 说成“可同时进入” |
换个问法:“同一进程内对同一临界资源的两次访问能否放在两个不同的临界区里?” 答:可以,只要每次访问都在某个临界区内且遵守互斥规则即可。与第 40 题(同步与互斥的区别)连考。
【自测】 关于临界区与互斥,下列说法正确的是( )。 A. 只要多个进程不同时申请,就可以同时进入临界区 B. 互斥进入临界区要求任一时刻至多一个进程处于临界区内执行 C. 临界区是指被多个进程共享的那段内存区域 D. 一个进程进入临界区后,其他进程必须永远等待
答:B。A 错,互斥约束的是“进入”而不是“申请”;C 错,临界区是代码段而非内存区域;D 错,其他进程只需等到当前进程退出临界区,不是永远等待。〈出处:408 真题同型题〉
【易错提醒】 ①临界资源与共享资源不是等同概念,只有需要排他访问的共享资源才是临界资源。②临界区是代码段而不是资源本身,描述时要区分资源与访问资源的代码。③互斥要求“任一时刻最多一个进程在临界区内”,而不是“最多一个进程提出申请”,等待的进程可以有很多。
【知识关联】 本题考点:临界资源与临界区(排他使用 vs 访问它的代码段)。同库题群:第40–46题(信号量/PV/生产者消费者)、第47题(管程)、第48–50题(死锁必要条件含互斥)。面试:互斥的软件/硬件/信号量实现分别有什么坑?
【拓展延伸】 变式:只读共享代码段是不是临界资源(不是);「凡是共享都是临界」必错。Linux:mutex/spinlock/RCU 保护不同形态的临界区。(本题答案 C,以题干选项为准)
第40题
下列关于进程同步与进程互斥的叙述中,正确的是( )。
A. 进程互斥是指多个进程为完成同一任务而协调工作次序 B. 进程同步是指多个进程竞争同一临界资源时形成的排他访问关系 C. 进程同步与进程互斥是同一个概念,只是名称不同 D. 进程同步是多个进程为完成共同任务而协调工作次序,进程互斥是多个进程竞争同一临界资源时形成的排他访问关系
答案:D
考点定位:四、进程同步与死锁——进程同步与互斥的概念区分,难度★☆☆☆☆,笔试概念题中的高频送分点,常与临界区概念一并考查。
【结论】 同步是多个进程为完成共同任务而协调工作次序(直接制约),互斥是多个进程竞争同一临界资源而形成的排他访问(间接制约),选 D。
【逐项辨析】
- A 错在把互斥说成“协调工作次序”——协调次序是同步的定义,选项张冠李戴。
- B 错在把同步说成“排他访问”——排他访问是互斥的定义,同样是概念对调。
- C 错在“同一个概念,只是名称不同”——两者的约束对象不同:同步约束执行次序,互斥约束资源占用。
- D 正确——分别给出同步与互斥的准确内涵,并隐含了“直接制约”与“间接制约”的区分。
【知识点】 同步与互斥的完整对照:
| 维度 | 进程同步 | 进程互斥 |
|---|---|---|
| 定义 | 为完成共同任务而协调工作次序 | 竞争同一临界资源形成的排他访问 |
| 制约关系 | 直接制约(有数据或任务依赖) | 间接制约(仅因争用同一资源) |
| 关注点 | 先后顺序(“先 A 后 B”) | 排他性(“我进你不进”) |
| 典型问题 | 生产者-消费者、读者-写者 | 打印机争用、共享变量修改 |
| 实现工具 | 信号量(资源信号量) | 信号量(互斥信号量) |
| 信号量初值 | 常为非 1,表示可用资源数或次序条件 | 通常为 1,表示资源可用 |
两者的联系:都通过信号量机制实现,都需要进程在等待时让出处理机;一个实际问题中常同时出现,生产者-消费者就是典型——empty 与 full 是同步信号量(约束“先生产后消费”),mutex 是互斥信号量(约束“同一时刻只有一个进程操作缓冲区”)。
【推导过程】 生产者-消费者问题的信号量配置与两类关系的分工:
共享: 缓冲区 buffer[N]; 信号量 empty = N, full = 0, mutex = 1
生产者 消费者
do { do {
produce(data); P(full); // 同步: 等有产品
P(empty); // 同步: 等空位 P(mutex); // 互斥: 争缓冲区
P(mutex); // 互斥: 争缓冲区 take(data);
put(data); V(mutex);
V(mutex); V(empty); // 同步: 释放空位
V(full); // 同步: 通知有货 consume(data);
} while (true); } while (true);| 信号量 | 初值 | 类别 | 约束的内容 | 若删掉会怎样 |
|---|---|---|---|---|
| empty | N | 同步 | 生产者必须等到有空位 | 生产者覆盖未取走的数据 |
| full | 0 | 同步 | 消费者必须等到有产品 | 消费者读到空数据 |
| mutex | 1 | 互斥 | 同一时刻只有一个进程动缓冲区 | 多进程同时读写导致数据错乱 |
一个经典易错点:在生产者中 P(empty) 必须写在 P(mutex) 之前,否则可能死锁(若先 P(mutex) 再 P(empty):缓冲区满时生产者已持有 mutex 却等不到 empty 而阻塞;消费者虽能过 P(full),却只能在 P(mutex) 处排队等这把已被生产者占住的锁,双方互相等待成死锁)。
【记忆锚点】 口诀——“同步管先后,互斥管独享;同步是合作,互斥是争抢”。再配一句判据:有数据依赖的先后要求 → 同步;争用同一个资源 → 互斥。
【易混对比】
| 进程同步 | 进程互斥 | |
|---|---|---|
| 制约类型 | 直接制约 | 间接制约 |
| 一句话 | “你先我后” | “你进我不进” |
| 进程间是否有数据依赖 | 有 | 无 |
| 信号量典型初值 | ≥ 0 的资源数或次序条件 | 1 |
| 可否同时发生 | 一个系统里可以同时存在 | 同左 |
换个问法:“只用互斥信号量、不用同步信号量,生产者-消费者问题能正确运行吗?” 答:不能——缺少 empty 与 full 就失去了次序约束,会出现“消费者读空缓冲区”或“生产者覆盖未消费数据”的错误。与第 39 题(临界资源与临界区)连考,与后续 PV 操作、死锁四个必要条件题连考。
【自测】 下列场景中属于进程同步的是( )。 A. 两个进程都要使用同一台打印机,必须排队 B. 计算进程算出结果后,打印进程才能把结果输出 C. 两个进程都要修改同一个全局变量 D. 多个进程竞争同一个互斥锁
答:B。A、C、D 都是因争用同一临界资源而形成的排他访问关系,属于互斥;只有 B 体现了“有先后次序要求”的直接制约,属于同步。〈出处:国网真题库同型题〉
【易错提醒】 ①同步是次序协调,互斥是资源排他,二者不能互换。②同步的进程之间通常有数据或任务上的依赖,互斥的进程之间只是争用资源。③生产者-消费者问题中既有同步(empty、full)又有互斥(mutex),是两类关系共存的典型例子。
【知识关联】 本题考点:进程同步与信号量。与第 41–47 题及死锁题连考;面试经典:生产者消费者。
【拓展延伸】 变式:给一段 PV 序列判断是否死锁。工程上常用 mutex/条件变量而非裸信号量。(本题答案 D,以题干选项为准)
第41题
下列关于信号量 P、V 操作的叙述中,正确的是( )。
A. P 操作表示申请一个资源,先将信号量减 1,若结果小于 0 则进程阻塞;V 操作表示释放一个资源,先将信号量加 1,若结果小于等于 0 则唤醒一个等待进程 B. P 操作表示释放一个资源,V 操作表示申请一个资源 C. P 操作与 V 操作都是原语,但 P 操作允许被中断,V 操作不允许被中断 D. 信号量只能取 0 和 1 这两个值
答案:A
考点定位:四、进程同步与死锁——信号量机制与P、V 操作的定义,难度★☆☆☆☆,是信号量相关题目的基础,几乎每套笔试卷都会涉及。
【结论】 P 操作申请资源先减1后判负阻塞,V 操作释放资源先加1后判非正唤醒,选A。
【逐项辨析】
- A 正确——完整描述了P 操作“减1判负则阻塞”与V 操作“加1判非正则唤醒”的过程,且明确指出二者均为不可中断的原语。
- B 错误——把P与V的功能完全对调,P是申请(wait)、V是释放(signal),这是最基本的概念颠倒。
- C 错误——P、V 操作都是原语,执行过程均不可被中断;若P 操作允许中断,则多个进程可能同时修改信号量值,原子性被破坏。
- D 错误——信号量是整型变量,可取任意整数;互斥信号量初值为1,资源信号量初值可取n,负值的绝对值表示等待进程数。
【知识点】 信号量与P、V 操作的完整定义:
| 要素 | 说明 |
|---|---|
| 信号量本质 | 整型变量S,除初始化外仅能通过P、V 操作访问 |
| P 操作(wait) | S = S - 1;若S < 0则调用进程阻塞并插入等待队列 |
| V 操作(signal) | S = S + 1;若S <= 0则从等待队列唤醒一个进程 |
| 原语特性 | P、V 操作均为原子操作,执行期间不可中断 |
| S > 0 | 表示当前可用资源数目 |
| S = 0 | 表示资源恰好分配完毕,无进程等待 |
| S < 0 | 绝对值|S|表示因申请该资源而阻塞的进程数 |
记录型信号量除整数值外还包含一个进程等待队列,当进程因P 操作阻塞时被挂入该队列,由V 操作负责唤醒。
【推导过程】 以S初值为1(互斥信号量)为例,模拟两个进程P1、P2的P/V 操作过程:
步骤 操作 S值 等待队列 说明
1 初始 1 [] 资源可用
2 P1:P(S) 0 [] S-1=0, P1进入临界区
3 P2:P(S) -1 [P2] S-1=-1<0, P2阻塞
4 P1:V(S) 0 [] S+1=0<=0, 唤醒P2
5 P2:被唤醒 0 [] P2进入临界区
6 P2:V(S) 1 [] S+1=1>0, 无进程唤醒从表中可见:当S从1变为0时无阻塞;S从0变为-1时P2进入等待队列;V 操作使S从-1变为0时触发唤醒。
【记忆锚点】 口诀——“P减V加,P负阻塞,V非正唤醒”。另记:P是“破”(减),V是“加”,申请资源要“破费”(减1),释放资源要“加分”(加1)。
【易混对比】
| 操作 | 功能 | 数学操作 | 阻塞/唤醒条件 | 常见错误 |
|---|---|---|---|---|
| P 操作 | 申请资源 | S = S - 1 | S < 0时阻塞 | 记成加1或释放 |
| V 操作 | 释放资源 | S = S + 1 | S <= 0时唤醒 | 记成减1或申请 |
换个问法:“若S初值为2,某时刻S=-2,说明什么?”——说明资源已分配完毕且有2个进程在等待。与第43题(信号量负值含义)连考。
【自测】 设信号量S初值为3,依次有进程A、B、C、D执行P 操作,随后A执行V 操作,此时S的值和等待队列状态分别是?
答:S = 0,等待队列为空(D 刚被唤醒)。逐步模拟:S=3 → A 的 P 后 S=2 → B 的 P 后 S = 1 → C 的 P 后 S = 0(A、B、C 均已获得资源) → D 的 P 后 S=-1,队列 [D]。A 执行 V:S = 0,因 S≤0 唤醒 D,队列变空。〈出处:同型题〉
【易错提醒】 ①牢记P是减、V是加,顺序不要记反;②P 操作的判断条件是S < 0,V 操作的判断条件是S <= 0,两者不等号不同;③“原语不可中断”是信号量机制正确性的关键,不能认为只有V 操作或只有P 操作是原语。
【知识关联】 本题考点:进程同步与信号量。与第 41–47 题及死锁题连考;面试经典:生产者消费者。
【拓展延伸】 变式:给一段 PV 序列判断是否死锁。工程上常用 mutex/条件变量而非裸信号量。(本题答案 A,以题干选项为准)
第42题
互斥信号量 mutex 的初值为 1,这表示( )。
A. 表示系统中已有 1 个进程正在等待进入临界区 B. 表示当前有 1 个临界资源可供使用,允许 1 个进程进入临界区 C. 表示最多允许 1 个进程被阻塞在临界区中 D. 表示系统允许 1 个进程长期占用该临界资源而不释放
答案:B
考点定位:四、进程同步与死锁——互斥信号量的初值及其物理含义,难度★☆☆☆☆,是互斥实现的常识性考点,国企笔试概念题中经常出现。
【结论】 互斥信号量mutex 初值为1,表示当前有1个临界资源可供使用,允许1个进程进入临界区,选B。
【逐项辨析】
- A 错误——初值1表示资源可用,并不表示已有进程在等待;有进程等待时mutex应为负值。
- B 正确——准确说明初值1的物理含义是“有1个临界资源可用,允许1个进程进入”。
- C 错误——等待的进程数由信号量负值的绝对值反映,与初值1无关;初值仅反映初始可用资源数。
- D 错误——互斥的初衷恰恰是防止某进程长期独占资源,该说法与互斥目的完全相反。
【知识点】 互斥信号量mutex的取值含义与状态演变:
| mutex值 | 物理含义 | 系统状态 |
|---|---|---|
| 1 | 有1个临界资源可用 | 无进程在临界区,无进程等待 |
| 0 | 资源已被占用 | 有1个进程在临界区内执行 |
| -1 | 1个进程在等待 | 1个进程在临界区,另有1个阻塞 |
| -k | k个进程在等待 | 1个进程在临界区,k个进程阻塞 |
mutex本质上是“可用通行证数”。初值为1意味着系统启动时有1张通行证。进程进入临界区前执行P(mutex)取走通行证(mutex减1),退出时执行V(mutex)归还通行证(mutex加1)。当通行证发完(mutex<=0)后,后续进程必须排队等待。
【推导过程】 以mutex 初值为1,三个进程A、B、C依次申请进入临界区为例:
步骤 事件 mutex值 在临界区 等待队列
1 初始 1 无 []
2 A执行P(mutex) 0 A []
3 B执行P(mutex) -1 A [B]
4 C执行P(mutex) -2 A [B,C]
5 A执行V(mutex) -1 B [C]
6 B执行V(mutex) 0 C []
7 C执行V(mutex) 1 无 []临界区内始终最多只有1个进程,mutex最小值为-(n-1),最大值为1。
【记忆锚点】 口诀——“互斥初值为一,零表占用,负表排队”。想象mutex是一把厕所钥匙:1表示钥匙在墙上(可用),0表示有人在里面(占用),-1表示门外有1个人在排队。
【易混对比】
| 信号量类型 | 初值 | 含义 | 用途 |
|---|---|---|---|
| 互斥信号量 | 1 | 临界资源可用数(1个) | 保护临界区 |
| 资源信号量 | n | 某类资源总可用数(n个) | 控制资源分配 |
| 同步信号量 | 0 | 初始无产品/事件未发生 | 协调执行次序 |
换个问法:“若mutex当前值为-2,表示什么?”——表示有1个进程在临界区内,另有2个进程因申请进入失败而阻塞。与第41题(PV 操作定义)和第43题(负值含义)连考。
【自测】 某系统用信号量mutex实现互斥,初始值为1。某时刻mutex=-3,此时临界区内最多有几个进程?等待进入的进程有几个?
答:临界区内最多有1个进程;等待进入的进程有3个。〈出处:同型题〉
【易错提醒】 ①互斥信号量初值恒为1,资源信号量初值等于资源数目,两者不要混淆;②mutex等于0表示已有1个进程在临界区,mutex等于-1表示另有1个进程在等待;③P、V必须成对出现,漏掉V会使其他进程永久阻塞。
【知识关联】 本题考点:进程同步与信号量。与第 41–47 题及死锁题连考;面试经典:生产者消费者。
【拓展延伸】 变式:给一段 PV 序列判断是否死锁。工程上常用 mutex/条件变量而非裸信号量。(本题答案 B,以题干选项为准)
第43题
某记录型信号量 S 的当前值为 -3,这表示( )。
A. 还有 3 个资源可供进程使用 B. 有 3 个进程正在临界区内使用该资源 C. 有 3 个进程因申请该资源失败而正在等待队列中排队 D. 有 3 个进程已经完成对该资源的访问并退出
答案:C
考点定位:四、进程同步与死锁——记录型信号量当前值为负数时的含义,难度★☆☆☆☆,属于信号量概念的核心判断题,笔试中出现频率很高。
【结论】 记录型信号量S = -3表示资源已耗尽,有3个进程因申请失败而阻塞在等待队列中,选C。
【逐项辨析】
- A 错误——S为负说明资源已经耗尽,不存在剩余资源;只有S>0时才表示还有资源可供使用。
- B 错误——正在使用资源的进程数并不直接由S的值反映;负值反映的是等待者而非使用者。
- C 正确——|S|=3,即等待队列中有3个进程因申请该资源失败而排队。
- D 错误——已经完成访问并退出的进程不会体现在信号量的负值上,它们已在退出时执行了V 操作。
【知识点】 记录型信号量S的取值与系统状态的完整对应:
| S的取值 | 含义 | 资源状态 | 等待情况 |
|---|---|---|---|
| S > 0 | 还可供使用的资源数目 | 有剩余 | 无进程等待 |
| S = 0 | 资源恰好分配完毕 | 刚好用完 | 无进程等待 |
| S < 0 | 绝对值|S|为阻塞进程数 | 已耗尽 | 有|S|个进程等待 |
记录型信号量包含两个成员:一个整型value和一个进程等待队列L。当进程执行P 操作后value<0时,该进程被插入L的队尾;执行V 操作后value<=0时,从L的队首唤醒一个进程。因此S的负值与等待队列长度严格同步。
【推导过程】 设某资源信号量初值为2,四个进程P1-P4依次申请:
步骤 操作 S值 已分配数 等待队列 说明
1 初始 2 0 [] 有2个资源可用
2 P1:P(S) 1 1 [] P1获得资源
3 P2:P(S) 0 2 [] P2获得资源
4 P3:P(S) -1 2 [P3] 资源耗尽,P3阻塞
5 P4:P(S) -2 2 [P3,P4] P4阻塞
6 P1:V(S) -1 2 [P4] 唤醒P3,P3出队但未执行V
7 P3:V(S) 0 2 [] 唤醒P4,P2、P4各持1个S = -3意味着若再有1个进程申请,将变为-4;只要S<0,新申请的进程一律阻塞。
【记忆锚点】 口诀——“正数有余,零刚好,负数绝对是排队数”。想象银行排队叫号:S=2表示还有两个窗口空闲,S = 0表示窗口全满但无人排队,S = -3表示窗口全满且门外站了3个人。
【易混对比】
| 概念 | 反映内容 | 与S的关系 |
|---|---|---|
| 资源总数 | 系统中该类资源的总量 | 等于S的初值 |
| 已分配数 | 当前被进程占用的资源数 | 初值 - S (当S>=0)或初值 (当S<0) |
| 可用数 | 当前空闲资源数 | max(S, 0) |
| 等待进程数 | 阻塞队列长度 | max(-S, 0) = |S| (当S<0) |
换个问法:“资源信号量初值为5,当前S=-2,已分配多少个资源?还有几个进程在等待?”——已分配5个,有2个进程在等待。与第42题(互斥信号量初值)和第44题(取值范围)连考。
【自测】 某记录型信号量初值为4,某时刻其值为-2。此时若有一个进程执行V 操作,信号量的值变为多少?是否会唤醒进程?
答:信号量值变为-1;会唤醒一个等待进程,因为V 操作后S = -1<=0,满足唤醒条件。〈出处:408真题同型题〉
【易错提醒】 ①负数取绝对值,绝对值就是等待进程数,这是最常考的结论;②S = 0与S<0含义不同,前者表示无等待,后者表示有等待;③资源总数、正在使用资源的进程数、等待进程数是三个不同概念,只有等待进程数由负值直接给出。
【知识关联】 本题考点:进程同步与信号量。与第 41–47 题及死锁题连考;面试经典:生产者消费者。
【拓展延伸】 变式:给一段 PV 序列判断是否死锁。工程上常用 mutex/条件变量而非裸信号量。(本题答案 C,以题干选项为准)
第44题
系统中有 5 个进程共享一个临界资源,用信号量 mutex(初值为 1)实现互斥访问,则 mutex 可能取到的值范围是( )。 A. [-5, 0] B. [0, 1] C. [1, 5] D. [-4, 1]
答案:D
考点定位:四、进程同步与死锁——信号量取值范围的计算,难度★★☆☆☆,属于一步计算题,国企笔试中常以选择题或填空题形式出现。
【结论】 5个进程互斥使用1个临界资源时,信号量mutex的最大值为1,最小值为-4,取值范围是[-4, 1],选D。
【逐项辨析】
- A 错误——[-5, 0]既没有体现最大值为1,也把最小值错误地算成了-5。
- B 错误——[0, 1]忽略了出现负值即有进程等待的情况,最小值应为负。
- C 错误——[1, 5]把信号量当成了资源计数器,与互斥信号量的语义完全不符。
- D 正确——最大值为1(初值),最小值为1-5=-4,符合互斥信号量的变化规律。
【知识点】 互斥信号量取值范围的一般公式:
设n个进程共享1个临界资源,互斥信号量mutex 初值为1。
| 场景 | mutex值 | 说明 |
|---|---|---|
| 无进程进入,无进程等待 | 1 | 最大值,等于初值 |
| 1个进程在临界区 | 0 | 资源被占用 |
| k个进程在临界区外等待 | -k | 绝对值为等待数 |
| 1个在临界区,n-1个等待 | -(n-1) | 最小值 |
通用公式:mutex取值范围 = [-(n - 1), 1]
推导依据:mutex最大值为初值1;最小值出现在1个进程进入临界区(mutex=0)后,其余n-1个进程全部执行P 操作被阻塞,每次P使mutex减1,最终mutex = 0 - (n-1) = -(n-1)。
若允许k个进程同时进入(即信号量初值为k),则取值范围变为 [k - n, k]。
【推导过程】 以n=5为例,逐步推导mutex的极值:
状态描述 mutex计算 mutex值
---------------------------------------------------------------
初始,无任何进程操作 初值 1 <- 最大值
1个进程进入临界区 1 - 1 0
2个进程申请,1个阻塞 0 - 1 -1
3个进程申请,2个阻塞 -1 - 1 -2
4个进程申请,3个阻塞 -2 - 1 -3
5个进程申请,4个阻塞 -3 - 1 -4 <- 最小值最小值推导式:mutex_min = 1 - n = 1 - 5 = -4
因此取值范围为 [-4, 1]。
【记忆锚点】 口诀——“互斥最大是一,最小一减n,负的绝对是排队人”。快速公式:范围 = [1-n, 1]。
【易混对比】
| 信号量类型 | 初值 | 取值范围(n个进程) | 最小值计算 |
|---|---|---|---|
| 互斥信号量 | 1 | [-(n-1), 1] | 1 - n |
| 允许k个同时进入 | k | [k-n, k] | k - n |
| 资源信号量(资源数为m) | m | [m-n, m] (若每个进程最多要1个) | m - n |
换个问法:“若允许2个进程同时进入临界区,5个进程共享时信号量范围是多少?”——初值为2,范围为[2-5, 2]即[-3, 2]。与第42题(互斥信号量初值)和第43题(负值含义)连考。
【自测】 某系统有8个进程竞争1个临界资源,用信号量mutex实现互斥,则mutex的取值范围是?
答:[-7, 1]。推导:最大值=初值=1,最小值=1-8=-7。〈出处:同型题〉
【易错提醒】 ①最小值是1-n而不是-n,因为有1个进程可以进入临界区;②最大值就是初值1,不会再超过1;③若题目改为“允许k个进程同时进入”,则初值为k,取值范围变为[k-n, k]。
【知识关联】 本题考点:进程同步与信号量——互斥信号量 mutex 的取值范围 [1-n, 1]。与第 41–47 题及死锁题连考;面试:信号量负值的绝对值代表什么。
【拓展延伸】 变式:初值为 k、n 个进程竞争时,信号量取值范围是 [k−n, k];负值的绝对值就是阻塞等待的进程数。(本题答案 D,以题干选项为准)
第45题
在生产者-消费者问题中,设缓冲区大小为 n,需要设置 empty、full、mutex 三个信号量,则它们的初值应分别为( )。 A. empty = n, full = 0, mutex = 1 B. empty = 0, full = n, mutex = 1 C. empty = n, full = 0, mutex = 0 D. empty = 1, full = 1, mutex = n
答案:A
考点定位:四、进程同步与死锁——生产者-消费者问题中信号量的设置,难度★☆☆☆☆,是同步问题的经典模型,国企笔试与互联网笔试均为高频考点。
【结论】 生产者-消费者问题中,empty初值为n(空位数),full初值为0(产品数),mutex 初值为1(互斥),选A。
【逐项辨析】
- A 正确——empty=n表示初始有n个空位,full=0表示初始无产品,mutex=1保证互斥访问。
- B 错误——把empty与full的初值对调,会使生产者一开始因P(empty)失败而无法生产。
- C 错误——mutex 初值应为1而不是0;若mutex=0,第一个执行P(mutex)的进程把它减为-1并阻塞,此后每个进程再执行P都会继续减为-2、-3……(绝对值等于等待进程数),谁都进不了临界区,系统死锁。
- D 错误——empty与full初值被混淆,mutex也不能取n,mutex恒为1。
【知识点】 生产者-消费者问题的三个信号量及其完整语义:
| 信号量 | 初值 | 含义 | P 操作意义 | V 操作意义 |
|---|---|---|---|---|
| empty | n | 空闲缓冲区数目 | 申请1个空位(空位减1) | 释放1个空位(空位加1) |
| full | 0 | 已存放产品数目 | 申请1个产品(产品减1) | 释放1个产品(产品加1) |
| mutex | 1 | 缓冲区互斥访问权 | 申请进入临界区 | 退出临界区 |
生产者流程:P(empty) -> P(mutex) -> 放入产品 -> V(mutex) -> V(full) 消费者流程:P(full) -> P(mutex) -> 取出产品 -> V(mutex) -> V(empty)
两个资源信号量一增一减,保证缓冲区既不被写满也不被取空。mutex确保对缓冲区的互斥访问。
【推导过程】 以缓冲区大小n=3为例,说明信号量变化:
步骤 事件 empty full mutex 说明
----------------------------------------------------------------
1 初始 3 0 1 缓冲区全空
2 生产者P1:P(empty) 2 0 1 占用1个空位
3 生产者P1:P(mutex) 2 0 0 进入临界区
4 生产者P1:放入产品 2 0 0 写缓冲区
5 生产者P1:V(mutex) 2 0 1 退出临界区
6 生产者P1:V(full) 2 1 1 产品数加1
7 消费者C1:P(full) 2 0 1 申请1个产品
8 消费者C1:P(mutex) 2 0 0 进入临界区
9 消费者C1:取出产品 2 0 0 读缓冲区
10 消费者C1:V(mutex) 2 0 1 退出临界区
11 消费者C1:V(empty) 3 0 1 空位归还注意:P 操作的顺序是先资源信号量后互斥信号量,颠倒顺序可能引起死锁。
【记忆锚点】 口诀——“空位empty给n,产品full给零,互斥mutex给一”。另记:生产者先P空后P锁,消费者先P满后P锁;释放时先V锁后V资源。
【易混对比】
| 问题模型 | 信号量个数 | 关键信号量 | 核心约束 |
|---|---|---|---|
| 生产者-消费者 | 3个 | empty, full, mutex | 缓冲区不满不空,互斥访问 |
| 读者-写者 | 2个+计数器 | mutex, write, count | 读读共享,读写互斥,写写互斥 |
| 哲学家进餐 | 5个 | 5把叉子 | 防止循环等待 |
| 吸烟者问题 | 多个 | 原料信号量 | 供应商与消费者的变体 |
换个问法:“若缓冲区大小为1,三个信号量初值分别是多少?”——empty=1, full=0, mutex=1。与第46题(读者-写者)连考。
【自测】 某生产者-消费者系统缓冲区大小为10,当前full=7, empty=3。此时有2个生产者同时执行P(empty),随后1个消费者执行P(full),问三个信号量变为多少?
答:2个生产者P(empty)后empty=3-2=1;消费者P(full)后full=7-1=6;mutex在PV前后始终回到1(假设无竞争)。最终empty=1, full=6, mutex=1。〈出处:同型题〉
【易错提醒】 ①“空位”用empty、“产品”用full,初值分别是n和0,千万不要记反;②P 操作通常先作用于资源信号量、再作用于互斥信号量,颠倒顺序可能引起死锁;③V 操作的顺序通常与P 操作相反,先V(mutex)再V资源信号量。
【知识关联】 本题考点:进程同步与信号量。与第 41–47 题及死锁题连考;面试经典:生产者消费者。
【拓展延伸】 变式:给一段 PV 序列判断是否死锁。工程上常用 mutex/条件变量而非裸信号量。(本题答案 A,以题干选项为准)
第46题
在读者—写者问题中,正确的同步要求是( )。
A. 读者与读者之间、读者与写者之间都必须互斥 B. 允许多个读者同时读文件,但写者与任何其他进程(无论是读者还是写者)必须互斥 C. 允许多个写者同时写文件,但读者与读者之间必须互斥 D. 读者与写者可以任意同时访问文件,不需要任何同步控制
答案:B
考点定位:四、进程同步与死锁——读者-写者问题的访问规则,难度★☆☆☆☆,是同步互斥的经典模型,笔试常考“谁与谁互斥”的判断。
【结论】 读者-写者问题的核心是“读读共享、读写互斥、写写互斥”,选B。
【逐项辨析】
- A 错误——读者之间不需要互斥,读操作不会改变文件内容,多个读者可同时读。
- B 正确——准确概括了“读者可并发、写者全互斥”的规则。
- C 错误——写者之间必须互斥,不可能多个写者同时写;而读者之间反而无需互斥。
- D 错误——若不加任何控制,读写并发会导致数据不一致(读到半写状态或写覆盖)。
【知识点】 读者-写者问题的完整访问规则与实现机制:
| 访问组合 | 是否允许同时 | 原因 |
|---|---|---|
| 读者 + 读者 | 允许 | 读操作不修改数据,互不干扰 |
| 读者 + 写者 | 禁止 | 读可能读到不一致状态,写可能被覆盖 |
| 写者 + 写者 | 禁止 | 写操作互相覆盖,数据混乱 |
典型实现使用一个互斥信号量write控制写操作,再用一个整数count记录当前读者数,由第一个读者进入时P(write)加锁、最后一个读者离开时V(write)解锁。读者计数器count本身也需要一个互斥信号量mutex保护,防止多个读者同时修改count导致错误。
写者流程:P(write) -> 写文件 -> V(write) 读者流程:P(mutex) -> count++ -> 若count==1则P(write) -> V(mutex) -> 读文件 -> P(mutex) -> count-- -> 若count==0则V(write) -> V(mutex)
【推导过程】 以两个读者R1、R2和一个写者W为例,演示访问控制过程:
步骤 事件 write值 count值 说明
-----------------------------------------------------------------
1 初始 1 0 无读者无写者
2 R1:P(mutex),count=1 1 1 第一个读者
3 R1:P(write) 0 1 封锁写者
4 R1:V(mutex) 0 1 R1开始读
5 R2:P(mutex),count=2 0 2 第二个读者加入
6 R2:V(mutex) 0 2 R2开始读(读读并发)
7 W:P(write) -1 2 写者阻塞
8 R1结束:P(mutex),count=1 -1 1 还有读者
9 R1:V(mutex) -1 1 R1离开
10 R2结束:P(mutex),count=0 -1 0 最后一个读者
11 R2:V(write) 0 0 唤醒写者
12 R2:V(mutex) 0 0 R2离开
13 W被唤醒,写文件 0 0 写者执行
14 W:V(write) 1 0 写者完成步骤6时R1与R2同时读,步骤7时W因write=-1而阻塞,直到所有读者离开后才被唤醒。
【记忆锚点】 口诀——“读读共享,读写互斥,写写互斥”。简称“共互互”:读者之间共享,读者与写者互斥,写者与写者互斥。
【易混对比】
| 特性 | 读者-写者问题 | 生产者-消费者问题 |
|---|---|---|
| 核心目的 | 保证数据一致性 | 协调生产与消费速率 |
| 并发程度 | 读者可并发 | 生产与消费串行化(互斥访问缓冲区) |
| 信号量 | write + mutex + count | empty + full + mutex |
| 饥饿风险 | 读者优先造成写者饥饿,写者优先造成读者饥饿 | 通常无饥饿(有界缓冲区) |
换个问法:“读者优先策略有什么缺陷?”——可能导致写者长期饥饿,因为读者源源不断到来时写者始终无法获得write信号量。与第45题(生产者-消费者)连考。
【自测】 某读者-写者系统当前有3个读者正在读文件,count=3,write=0。此时一个写者请求写文件,一个读者请求读文件,各会怎样?
答:写者执行P(write)后write=-1,阻塞;新读者执行P(mutex)后count=4,因count!=1故不执行P(write),直接开始读,可立即读。这体现了读者优先策略下写者可能饥饿的特点。〈出处:同型题〉
【易错提醒】 ①核心结论是“读读共享、读写互斥、写写互斥”;②读者优先可能造成写者饥饿,写者优先可能造成读者饥饿,这是常见的延伸考点;③实现中读者计数器本身也需要互斥保护,否则计数会出错。
【知识关联】 本题考点:进程同步与信号量。与第 41–47 题及死锁题连考;面试经典:生产者消费者。
【拓展延伸】 变式:给一段 PV 序列判断是否死锁。工程上常用 mutex/条件变量而非裸信号量。(本题答案 B,以题干选项为准)
第47题
下列关于管程(Monitor)的叙述中,正确的是( )。
A. 管程是一种必须依靠硬件指令才能实现的同步机制 B. 管程中的共享数据结构可以被管程之外的进程直接访问 C. 管程内的多个过程可以被多个进程同时执行 D. 管程把共享资源以及对其操作的过程封装在一起,任一时刻仅允许一个进程在管程内执行
答案:D
考点定位:四、进程同步与死锁——管程的概念与特性,难度★☆☆☆☆,是比信号量更高级的同步工具,国企笔试概念题常以封装性、互斥性与条件变量为考点。
【结论】 管程把共享资源及对其操作的过程封装在一起,任一时刻仅允许一个进程在管程内执行,选D。
【逐项辨析】
- A 错误——管程是语言级、软件级的同步机制,由编译器保证互斥,并不依赖硬件指令实现。
- B 错误——管程具有封装性,外部进程不能直接访问其内部共享数据,只能通过调用管程内的过程间接访问。
- C 错误——管程的互斥性要求任一时刻只有一个进程在其中执行,不可能多个过程同时被多个进程执行。
- D 正确——完整概括了管程的封装性与互斥性两大核心特性。
【知识点】 管程(Monitor)的完整定义与三要素:
| 特性 | 说明 |
|---|---|
| 封装性 | 共享数据结构 + 对该结构操作的一组过程封装为一个模块,外部只能间接访问 |
| 互斥性 | 任一时刻仅允许一个进程在管程内执行,由编译机制自动保证,无需显式PV |
| 条件变量 | 进程在管程内无法继续时调用wait在条件变量上等待,由其他进程用signal唤醒 |
管程与信号量的本质区别:
| 对比项 | 管程 | 信号量 |
|---|---|---|
| 互斥实现 | 编译器自动保证 | 程序员显式P/V |
| 封装程度 | 高(数据+过程一体化) | 低(仅一个整型变量) |
| 易用性 | 不易出错 | 容易遗漏P或V |
| 条件变量 | 有(可多个) | 无(仅有信号量值) |
| 典型语言 | Java(synchronized), Pascal(Concurrent Pascal) | 操作系统内核普遍使用 |
管程内的条件变量不保存资源计数,仅用于阻塞和唤醒。调用wait会释放管程的互斥权并阻塞,调用signal会唤醒一个等待者。
【推导过程】 以生产者-消费者问题的管程实现为例,说明封装与互斥:
管程 ProducerConsumer {
条件变量 notFull, notEmpty;
整数 count = 0;
缓冲区 buffer[n];
过程 put(item) {
if count == n then wait(notFull); // 缓冲区满则等待
buffer[in] = item;
count++;
signal(notEmpty); // 唤醒等待的消费者
}
过程 get() {
if count == 0 then wait(notEmpty); // 缓冲区空则等待
item = buffer[out];
count--;
signal(notFull); // 唤醒等待的生产者
return item;
}
}外部进程只能通过put()和get()访问缓冲区,无法直接读写buffer或count;任一时刻只有一个进程在执行put或get。
【记忆锚点】 口诀——“封装数据加过程,一次只进一个客,条件变量管阻塞”。管程像一间“VIP包间”:数据是包间里的宝贝,过程是进出规则,一次只能进一个人。
【易混对比】
| 对比项 | 管程wait | 信号量P 操作 |
|---|---|---|
| 释放互斥权 | 会释放管程互斥权 | 不会释放(只是减1) |
| 阻塞条件 | 由程序员在条件判断后调用 | 由信号量值自动决定(S<0) |
| 唤醒机制 | signal唤醒特定条件变量上的进程 | V 操作唤醒信号量等待队列 |
| 使用场景 | 高级语言同步 | 操作系统内核/低级同步 |
换个问法:“管程中的signal与信号量中的V 操作有何不同?”——管程signal若没有等待进程则信号丢失(唤醒空操作),而信号量V 操作一定会使信号量值加1。与第41题(信号量PV 操作)连考。
【自测】 以下关于管程的描述,正确的是?A. 管程依赖Test-and-Set硬件指令;B. 管程允许多个进程同时执行不同的过程;C. 管程的条件变量可以保存资源数量信息;D. 管程把共享数据及其操作封装,自动保证互斥。
答:D。A错在管程是软件机制;B错在管程要求互斥;C错在条件变量不保存计数。〈出处:同型题〉
【易错提醒】 ①管程的互斥是自动完成的,不需要像信号量那样显式地P、V,这是它相对信号量的最大优势;②条件变量上的wait与信号量的P 操作含义不同,wait会释放管程的互斥权;③一个管程中可以有多个条件变量,用于不同的等待原因。
【知识关联】 本题考点:管程——共享数据与过程封装、任一时刻仅一进程在内执行。同库题群:第39题(临界区)、第40–46题(信号量机制)、第48题(死锁条件);补题可对照用户态锁与条件变量实践。面试:管程相对信号量的优势(封装、不易写错 PV 序)?
【拓展延伸】 变式:条件变量解决什么(同步等待,避免忙等);管程是否依赖硬件关中断(由编译器/运行时保证互斥)。工程:Java synchronized+wait/notify、pthread mutex+cond 即管程思想。(本题答案 D,以题干选项为准)
第48题
产生死锁的四个必要条件是( )。
A. 互斥条件、请求与保持条件、可剥夺条件、循环等待条件 B. 互斥条件、请求与保持条件、不可剥夺条件、顺序等待条件 C. 共享条件、请求与保持条件、不可剥夺条件、循环等待条件 D. 互斥条件、请求与保持条件、不可剥夺条件、循环等待条件
答案:D
考点定位:四、进程同步与死锁——死锁的四个必要条件,难度★☆☆☆☆,是死锁部分的必考知识点,国企笔试中几乎每年以原题形式出现。
【结论】 死锁的四个必要条件是互斥条件、请求与保持条件、不可剥夺条件、循环等待条件,选D。
【逐项辨析】
- A 错误——把“不可剥夺”写成了“可剥夺”,条件的方向正好相反;若资源可剥夺,死锁可被避免。
- B 错误——把“循环等待”写成了“顺序等待”,顺序等待恰恰是预防死锁的手段而非原因。
- C 错误——把“互斥条件”写成了“共享条件”,而互斥才是正确的必要条件;共享资源不会导致死锁。
- D 正确——四个条件的表述完全准确。
【知识点】 死锁的定义与四个必要条件的完整解释:
死锁是指多个进程因竞争资源而陷入的一种僵局,若无外力干预,这些进程都将无法向前推进。产生死锁必须同时满足四个条件:
| 条件名称 | 含义 | 破坏手段 |
|---|---|---|
| 互斥条件 | 资源一次只能被一个进程占用 | 通常无法破坏(部分资源必须互斥) |
| 请求与保持条件 | 进程已保持至少一个资源,又提出新资源请求 | 资源一次性分配(静态分配) |
| 不可剥夺条件 | 进程已获得的资源在未使用完前不能被强行剥夺 | 可剥夺资源策略 |
| 循环等待条件 | 系统中存在一个进程与资源的循环等待链 | 资源有序分配法 |
四个条件缺一不可,只要破坏其中任意一个,死锁就不会发生。互斥条件是最根本的,通常无法破坏,因为某些资源(如打印机)本身必须排他使用。
【推导过程】 用资源分配图说明四个条件如何共同导致死锁:
进程P1 进程P2
| |
占有R1,请求R2 占有R2,请求R1
| |
v v
资源R1 <----------> 资源R2
(循环等待链)四个条件同时满足分析:
- 互斥:R1、R2都只能被一个进程占用 (ok)
- 请求与保持:P1占R1求R2,P2占R2求R1 (ok)
- 不可剥夺:P1、P2已占资源不能被强制收回 (ok)
- 循环等待:P1->R2->P2->R1->P1形成环路 (ok)
结论:四条件齐备 -> 死锁发生。
【记忆锚点】 口诀——“互斥请求不可夺,循环等待死锁结”。四条件英文首字母可记为M(Mutual exclusion)、H(Hold and wait)、N(No preemption)、C(Circular wait)——“MHNC”或谐音“忙坏你不成”。
【易混对比】
| 条件 | 核心要点 | 常见干扰项 |
|---|---|---|
| 互斥 | 资源排他使用 | 被改成“共享条件” |
| 请求与保持 | 拿着碗里的看着锅里的 | 被简化为“请求条件” |
| 不可剥夺 | 占着不能抢 | 被改成“可剥夺条件” |
| 循环等待 | 形成环路 | 被改成“顺序等待” |
换个问法:“破坏死锁四个必要条件中的哪一个最容易实现?”——循环等待条件,通过资源有序分配法给资源编号即可。与第49题(死锁预防方法)连考。
【自测】 以下哪一组条件同时满足时,系统必然发生死锁? A. 互斥+请求与保持 B. 互斥+不可剥夺+循环等待 C. 四个条件全部满足 D. 请求与保持+循环等待
答:C。四个条件同时满足才可能发生死锁,缺一不可。仅满足其中部分条件不必然导致死锁。〈出处:408真题同型题〉
【易错提醒】 ①四个条件必须同时满足才可能死锁,破坏任意一个即可预防;②“不可剥夺”与“可剥夺”只有一字之差,是命题人常用的干扰点;③循环等待是四个条件中最容易通过资源有序分配来破坏的一个。
【知识关联】 本题考点:死锁。与第 48–50 题;银行家/预防/避免算法。面试追问:你的系统如何处理死锁?
【拓展延伸】 变式:给资源分配图判断是否可分配。MySQL 等中间件也会死锁,与 OS 原理同构。(本题答案 D,以题干选项为准)
第49题
下列关于死锁预防方法的叙述中,正确的是( )。
A. 资源一次性分配破坏循环等待条件,资源有序分配法破坏请求与保持条件 B. 资源有序分配法破坏循环等待条件,资源一次性分配破坏请求与保持条件,可剥夺资源破坏不可剥夺条件 C. 可剥夺资源破坏互斥条件,资源有序分配法破坏不可剥夺条件 D. 资源有序分配法破坏互斥条件,资源一次性分配破坏不可剥夺条件
答案:B
考点定位:四、进程同步与死锁——死锁预防方法与其破坏条件的对应,难度★☆☆☆☆,是死锁预防的经典对应题,笔试中反复出现。
【结论】 资源有序分配法破坏循环等待条件,资源一次性分配破坏请求与保持条件,可剥夺资源破坏不可剥夺条件,选B。
【逐项辨析】
- A 错误——把资源一次性分配与资源有序分配法所破坏的条件对调了。
- B 正确——三组对应关系完全准确。
- C 错误——可剥夺资源破坏的是不可剥夺条件而不是互斥条件,且互斥条件通常无法破坏。
- D 错误——资源有序分配法破坏的是循环等待条件而不是互斥条件。
【知识点】 死锁预防的完整方法体系:
| 预防方法 | 破坏的条件 | 具体做法 | 副作用 |
|---|---|---|---|
| 资源一次性分配(静态分配) | 请求与保持 | 运行前一次性申请全部资源 | 资源利用率低,进程可能等待很久 |
| 可剥夺资源 | 不可剥夺条件 | 请求不满足时强行收回已占资源 | 实现复杂,不适合所有资源类型 |
| 资源有序分配法 | 循环等待条件 | 给资源统一编号,按递增顺序申请 | 限制资源申请灵活性 |
| — | 互斥条件 | 通常不破坏 | 部分资源本身必须互斥 |
死锁预防 vs 死锁避免 vs 死锁检测:
| 策略 | 核心思想 | 代表算法 | 资源利用率 |
|---|---|---|---|
| 预防 | 破坏四条件之一 | 静态分配、有序分配 | 最低(最保守) |
| 避免 | 动态检查是否安全 | 银行家算法 | 中等 |
| 检测 | 允许死锁发生,定期检测 | 资源分配图化简 | 较高 |
| 解除 | 死锁发生后强制恢复 | 剥夺资源、终止进程 | — |
【推导过程】 建立“条件 <-> 预防手段”的严格对应关系:
死锁四必要条件 预防手段 破坏原理
--------------------------------------------------------------------------------
互斥条件 ---> (通常不破坏) 部分资源必须互斥,无法避免
|
请求与保持 ---> 资源一次性分配 要么全给要么不给,不会"拿着还要"
|
不可剥夺条件 ---> 可剥夺资源 需要时可强制收回,打破"占着不放"
|
循环等待条件 ---> 资源有序分配法 按编号递增申请,不可能形成环路资源有序分配法的关键证明:假设存在循环等待链P1->P2->...->Pn->P1,则P1占有的资源编号小于请求的资源编号,P2同理...最终推出P1占有资源编号 < P1占有资源编号,矛盾。故环路不可能存在。
【记忆锚点】 口诀——“静态分配破请求保持,可剥夺破不可剥夺,有序分配破循环等待”。简称“静求可夺序循”。
【易混对比】
| 策略 | 是否允许死锁发生 | 干预时机 | 特点 |
|---|---|---|---|
| 死锁预防 | 不允许 | 资源分配前(静态) | 最保守,利用率最低 |
| 死锁避免 | 不允许 | 资源分配时(动态) | 银行家算法检查安全序列 |
| 死锁检测 | 允许发生 | 运行中定期检测 | 检测到后再解除 |
| 死锁解除 | — | 检测到死锁后 | 剥夺或终止 |
换个问法:“银行家算法属于死锁预防、避免还是检测?”——属于死锁避免,因为它在资源分配时动态检查系统是否仍处于安全状态,而不是破坏死锁条件。与第48题(死锁四条件)和第50题(资源计算)连考。
【自测】 某系统采用资源有序分配法预防死锁,资源编号为1、2、3。某进程已占有资源2,它还可以申请哪些资源?
答:只能申请编号大于2的资源,即资源3。若申请资源1则违反递增顺序,可能形成循环等待。〈出处:同型题〉
【易错提醒】 ①记住口诀“静态分配破请求保持、可剥夺破不可剥夺、有序分配破循环等待”;②互斥条件是最根本的,一般不能被破坏,所以选项中一旦出现“破坏互斥条件”多为错误项;③死锁预防比死锁避免更保守,会降低资源利用率,这是常考的对比点。
【知识关联】 本题考点:死锁。与第 48–50 题;银行家/预防/避免算法。面试追问:你的系统如何处理死锁?
【拓展延伸】 变式:给资源分配图判断是否可分配。MySQL 等中间件也会死锁,与 OS 原理同构。(本题答案 B,以题干选项为准)
第50题
系统中有 5 个进程,每个进程最多需要 3 个某类资源。为保证系统一定不发生死锁,该类资源至少应有( )个。 A. 10 B. 12 C. 11 D. 15
答案:C
考点定位:四、进程同步与死锁——保证系统不发生死锁的最少资源数计算,难度★★☆☆☆,属于一步计算的高频题,国企笔试中常以数字计算题的形式出现。
【结论】 5个进程各需最多3个资源时,保证不死锁的最少资源数为5*(3-1)+1=11,选C。
【逐项辨析】
- A 错误——10恰好是每个进程各得2个资源的最坏状态,此时所有进程都在等待,系统会死锁。
- B 错误——12虽然也能避免死锁,但不是“最少”的数目,不符合题意。
- C 正确——5(3-1)+1=11,是最少资源数,可保证至少一个进程获得3个资源并完成运行。*
- D 错误——15等于5*3,是每个进程都能立即满足的资源数,远多于最少需要。
【知识点】 最少资源数计算的通用公式与适用条件:
设系统有n个进程,每个进程最多需要m个某类资源。
| 参数 | 含义 |
|---|---|
| n | 进程总数 |
| m | 每个进程对该类资源的最大需求量 |
| n*(m-1) | 最坏情况下已分配的资源数(每个进程差1个) |
| n*(m-1)+1 | 保证不死锁的最少资源数 |
公式:最少资源数 = n(m - 1) + 1*
推导逻辑:考虑最坏情况,每个进程都已分配到m-1个资源,都还差1个才能运行完毕,此时系统共分配出n*(m-1)个资源,全部进程都在等待。若此时资源数再增加1个,就至少有一个进程能够凑齐m个资源而运行完毕,并在结束后释放其占有的全部资源,使其他进程也能依次完成。
本公式仅适用于各进程最大需求相同的情况。若各进程需求不同,需按“每个进程需求减1后求和再加1”的思路处理。
【推导过程】 以n=5, m=3为例,分步推导:
最坏情况分析:
- 进程P1: 已分配2个,还需1个 -> 阻塞等待
- 进程P2: 已分配2个,还需1个 -> 阻塞等待
- 进程P3: 已分配2个,还需1个 -> 阻塞等待
- 进程P4: 已分配2个,还需1个 -> 阻塞等待
- 进程P5: 已分配2个,还需1个 -> 阻塞等待
已分配资源总数 = 5 * 2 = 10
系统状态: 全部5个进程都在等待,死锁!
此时若增加1个资源:
- 无论给哪个进程,该进程都将获得第3个资源
- 该进程运行完毕,释放其占有的3个资源
- 系统可用资源变为3个,足够其他进程依次完成
因此,最少资源数 = 5 * (3 - 1) + 1 = 11公式推导式: R_min = n(m - 1) + 1 = 5(3 - 1) + 1 = 5*2 + 1 = 11**
【记忆锚点】 口诀——“每个差一加一”:每个进程差1个时系统最危险,此时资源总数加1就能破局。公式记为“n乘(m减1)再加1”。
【易混对比】
| 问法 | 计算公式 | 本题结果 |
|---|---|---|
| 最少资源数(本题) | n*(m-1)+1 | 11 |
| 每个进程立即可满足 | n*m | 15 |
| 某进程最大需求 | m | 3 |
| 最坏已分配数 | n*(m-1) | 10 |
换个问法:“若4个进程各需最多5个资源,最少需要多少个?”——4*(5-1)+1=17。与第48题(死锁四条件)和第49题(死锁预防)连考。
【自测】 某系统有6个进程,每个进程最多需要4个同类资源。为保证系统一定不发生死锁,该类资源至少应有多少个?
答:19个。推导:R_min = n*(m-1)+1 = 6*(4-1)+1 = 6*3+1 = 19。〈出处:同型题〉
【易错提醒】 ①公式是n*(m-1)+1,容易误写成n*m或漏掉末尾的加1;②题目问的是“至少”,因此要选恰好使系统脱离死锁的最小值,比它大的数值虽然安全却不是答案;③若各进程的最大需求数不相同,该公式不再直接适用,需要按“各类最大需求之和再取最小保证值”的思路处理,本题属于最标准的等需求情形。
【知识关联】 本题考点:死锁。与第 48–50 题;银行家/预防/避免算法。面试追问:你的系统如何处理死锁? 【拓展延伸】 变式:给资源分配图判断是否可分配。MySQL 等中间件也会死锁,与 OS 原理同构。(本题答案 C,以题干选项为准)