二、综合应用题

2026 旧版 · 非 2027 主源 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

## 二、综合应用题

01. 设系统中有下述解决死锁的方法:

1)银行家算法。
2)检测死锁,终止处于死锁状态的进程,释放该进程占有的资源。
3)资源预分配。

简述哪种办法允许最大的并发性,即哪种办法允许更多的进程无等待地向前推进。请按“并发性”从大到小对上述三种办法排序。

02. 某银行计算机系统要实现一个电子转账系统,基本业务流程是:首先对转出方和转入方的账户进行加锁,然后进行转账业务,最后对转出方和转入方的账户进行解锁。若不采取任何措施,系统会不会发生死锁?为什么?请设计一个能够避免死锁的办法。

03. 设有进程 $\mathrm{P}_1$ 和进程 $\mathrm{P}_2$ 并发执行,都需要使用资源 $\mathrm{R}_1$ 和 $\mathrm{R}_2$,使用资源的情况见下表。

[tbl-53.md](tbl-53.md)

试判断是否会发生死锁,并解释和说明产生死锁的原因与必要条件。

04. 系统有同类资源 $m$ 个,供 $n$ 个进程共享,若每个进程对资源的最大需求量为 $k$,试问:当 $m, n, k$ 的值分别为下列情况时(见下表),是否会发生死锁?

[tbl-54.md](tbl-54.md)

05. 有三个进程 $\mathrm{P}_1, \mathrm{P}_2$ 和 $\mathrm{P}_3$ 并发工作。进程 $\mathrm{P}_1$ 需要资源 $\mathrm{S}_3$ 和资源 $\mathrm{S}_1$;进程 $\mathrm{P}_2$ 需要资源 $\mathrm{S}_2$ 和资源 $\mathrm{S}_1$;进程 $\mathrm{P}_3$ 需要资源 $\mathrm{S}_3$ 和资源 $\mathrm{S}_2$。问:

1)若对资源分配不加限制,会发生什么情况?为什么?
2)为保证进程正确运行,应采用怎样的分配策略?列出所有可能的方法。

06. 某系统有 $\mathrm{R}_1, \mathrm{R}_2$ 和 $\mathrm{R}_3$ 共三种资源,在 $T_0$ 时刻 $\mathrm{P}_1, \mathrm{P}_2, \mathrm{P}_3$ 和 $\mathrm{P}_4$ 这四个进程对资源的占用和需求情况见下表,此时系统的可用资源向量为(2, 1, 2)。试问:

1)系统是否处于安全状态?若安全,则请给出一个安全序列。


<!-- page: 176 -->

2)若此时进程 $\mathrm{P}_1$ 和进程 $\mathrm{P}_2$ 均发出资源请求向量 Request(1, 0, 1),为了保证系统的安全性,应如何分配资源给这两个进程?说明所采用策略的原因。

3)若2)中两个请求立即得到满足后,系统此刻是否处于死锁状态?

[tbl-55.md](tbl-55.md)

07. 考虑某个系统在下表时刻的状态。

[tbl-56.md](tbl-56.md)

使用银行家算法回答下面的问题:

1)Need 矩阵是怎样的?

2)系统是否处于安全状态?如安全,请给出一个安全序列。

3)若从进程 $\mathrm{P}_1$ 发来一个请求(0, 4, 2, 0),这个请求能否立刻被满足?如安全,请给出一个安全序列。

08. 假设具有5个进程的进程集合 $\mathrm{P} = \{\mathrm{P}_0, \mathrm{P}_1, \mathrm{P}_2, \mathrm{P}_3, \mathrm{P}_4\}$,系统中有三类资源A, B, C,假设在某时刻有如下状态:

[tbl-57.md](tbl-57.md)

当前系统是否处于安全状态?若系统中的可利用资源 Available 为 (0, 6, 2),系统是否安全?若系统处在安全状态,请给出安全序列;若系统处在非安全状态,简要说明原因。

## 2.4.7 答案与解析

### 一、单项选择题

#### 01. C

引起死锁的4个必要条件是:互斥、占有并等待、非剥夺和循环等待。本题中,出现了循环等待的现象,意味着可能导致死锁。进程释放资源不会导致死锁,进程自己进入死循环只能产生“饥饿”,不涉及其他进程。共享型设备允许多个进程申请使用,因此不会造成死锁。再次提醒,死锁一定要有两个或两个以上的进程才会导致,而饥饿可能由一个进程导致。

#### 02. C


<!-- page: 177 -->

信号量机制能确保临界资源的互斥访问,不能完全避免死锁,选项A错误。同时检查两支筷子是否可用的方法可以预防死锁,但是会导致资源浪费,因为可能有一些空闲的筷子无法使用,但拿到筷子的哲学家用完餐后,释放筷子,其他哲学家就可以正常用餐,因此不会导致饥饿现象,选项B错误。若限制允许拿起筷子的哲学家数量,则不被允许的哲学家左边的哲学家一定可以拿到两边的筷子,从而破坏“循环等待”条件,选项C正确。对哲学家顺序编号,奇数号哲学家先拿左筷子,然后拿右筷子,而偶数号哲学家刚好相反,则相邻的哲学家总有一个可以拿起两边的筷子,但这破坏的是“循环等待”条件,而不是“互斥条件”,选项D错误。

03. C

进程的执行优先级并不能破坏死锁的四个必要条件。即使有高优先级和低优先级的进程,若它们都请求或占有了不可抢占的资源,且形成了环路等待,则死锁仍可能发生。选项A可以破坏请求并保持条件,选项B可以破坏互斥条件,选项D可以破坏循环等待条件。

04. B

发生死锁的4个必要条件:互斥、占有并请求、非剥夺和循环等待。一次分配所有资源的方法是当进程需要资源时,一次性提出所有的请求,若请求的所有资源均满足则分配,只要有一项不满足,就不分配任何资源,该进程阻塞,直到所有的资源空闲后,满足进程的所有需求时再分配。这种分配方式不会部分地占有资源,因此打破了死锁的4个必要条件之一,实现了对死锁的预防。但是,这种分配方式需要凑齐所有资源,因此当一个进程所需的资源较多时,资源的利用率会较低,甚至会造成进程“饥饿”。

05. A

系统死锁的可能原因主要是时间上和空间上的。时间上由于进程运行中推进顺序不当,即调度时机不合适,不该切换进程时进行了切换,可能造成死锁;空间上的原因是对独占资源分配不当,互斥资源部分分配又不可剥夺,极易造成死锁。那么,为什么系统资源不足不是造成死锁的原因呢?系统资源不足只会对进程造成“饥饿”。例如,某系统只有三台打印机,若进程运行中要申请四台,显然不能满足,该进程会永远等待下去。若该进程在创建时便声明需要四台打印机,则操作系统立即就会拒绝,这实际上是资源分配不当的一种表现。不能以系统资源不足来描述剩余资源不足的情形。

06. D

死锁避免是指在资源动态分配过程中用某些算法加以限制,防止系统进入不安全状态从而避免死锁的发生。选项B是避免死锁后的结果,而不是措施的原理。

07. D

资源有序分配策略可以限制循环等待条件的发生。选项A判断是否为不安全状态;选项B破坏了占有请求条件;选项C破坏了非剥夺条件。

08. C

PV操作不能破坏死锁条件,反而可能加强互斥和占有并等待条件。选项B同理。选项C可以破坏请求并保持条件。选项D只能在系统出现死锁时检测,却不能防止系统出现死锁。

09. B

资源数为9时,存在三个进程都占有三个资源,为死锁;资源数为10时,必然存在一个进程能拿到4个资源,然后可以顺利执行完其他进程。

10. B

考虑一下极端情况:每个进程已经分配了两台磁带机,那么其中任何一个进程只要再分配一台磁带机即可满足它的最大需求,该进程总能运行下去直到结束,然后将磁带机归还给系统再次


<!-- page: 178 -->

分配给其他进程使用。因此,系统中只要满足 $2X + 1 = 11$ 这个条件即可认为系统不会死锁,解得 $X = 5$,也就是说,系统中最多可以并发5个这样的进程是不会死锁的。或者,根据死锁公式,资源数大于进程个数乘以“每个进程需要的最大资源数减1”就不会发生死锁,即 $m &gt; n(w - 1)$,其中 $m$ 是磁带机的数量,$n$ 是进程的数量,$w$ 是每个进程最多请求的磁带机数量。代入可得 $11 &gt; n(3 - 1)$,即 $n &lt; 5.5$,$n$ 是正整数,因此系统必然不会死锁的最大 $n$ 值是5。

11. A

A项的每个进程只申请一个资源,破坏了请求并保持条件,必然不会发生死锁。或者,根据死锁公式,假设系统共有 $m$ 个资源,$n$ 个进程,每个进程需要 $k$ 个资源,若满足 $m &gt; n(k - 1)$,则系统一定不会发生死锁,代入公式可知选项B、C、D均可能发生死锁。

12. D

解除死锁的方法有,①剥夺资源法;挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程;②撤销进程法;强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。

13. B

资源剥夺法允许一个进程强行剥夺其他进程所占有的系统资源。而撤销进程强行释放一个进程已占有的系统资源,与资源剥夺法同理,都通过破坏死锁的“请求和保持”条件来解除死锁。拒绝分配新资源只能维持死锁的现状,无法解除死锁。

14. B

其中,银行家算法为死锁避免算法,死锁检测算法和资源分配图化简法为死锁检测,根据排除法可以得出资源有序分配算法为死锁预防策略。

15. C

不会发生死锁。因为每个进程都分得一个资源时,还有一个资源可以让任意一个进程满足,这样这个进程可以顺利运行完成进而释放它的资源。

16. D

进程指向资源的有向边称为申请边,资源指向进程的有向边称为分配边,选项A张冠李戴;矩形框表示资源,其中的圆点表示资源的数量,选项B错;圆圈节点表示进程,选项C错;选项D的说法是正确的。

17. B

所谓破坏互斥使用资源,是指允许多个进程同时访问资源,但有些资源根本不能同时访问,如打印机只能互斥使用。因此,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。其他三个条件都可以实现。

18. D

如下图所示,并非所有不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态;死锁状态必定是不安全状态。


19. A

死锁检测一般采用两种方法:资源有向图法和资源矩阵法。前驱图只是说明进程之间的同步关系,搜索树用于数据结构的分析,安全图并不存在。注意死锁避免和死锁检测的区别:死锁避免是指避免死锁发生,即死锁没有发生;死锁检测是指死锁已出现,要把它


<!-- page: 179 -->

检测出来。

## 20. D

某个进程主动释放资源不会导致死锁,因为破坏了请求并保持条件,选项A错。颠簸也就是抖动,这是请求分页系统中页面调度不当而导致的现象,是下一章讨论的问题,这里权且断定选项B是错的。回退是指从此时此刻的状态退回到一分钟之前的状态,假如一分钟之前拥有资源X,它有可能释放了资源X,那就不称回到一分钟之前的状态,也就不是回退,选项C错。因为进程过于“慷慨”,不断把自己已得到的资源送给别人,导致自己长期无法完成,所以是饥饿,选项D正确。

## 21. C

出现了环路,只是满足了循环等待的必要条件,而满足必要条件不一定会导致死锁,选项I对;没有环路,破坏了循环等待条件,一定不会发生死锁,选项II错;每种资源只有一个,又出现了环路,这是死锁的充分条件,可以确定是否有死锁,选项III错;即使每个进程至少有一条请求边,若资源足够,则不会发生死锁,但若资源不充足,则有发生死锁的可能,选项IV对。综上所述,选择选项C。

## 22. D

选项I正确。

选项II正确:这是产生死锁的两大原因。

选项 III 正确:在对资源进行有序分配时,进程间不可能出现环形链,即不会出现循环等待。

选项 IV 正确:资源剥夺法允许一个进程强行剥夺其他进程占有的系统资源。而撤销进程强行释放一个进程已占有的系统资源,与资源剥夺法同理,都通过破坏死锁的“请求和保持”条件来解除死锁,所以选择选项 D。

## 23. B

遇到这种问题时千万不要慌张,下面我们来慢慢分析,给读者一个清晰的解题过程:

仔细考察程序代码,可以看出这是一个扩展的单行线问题。也就是说,某单行线只允许单方向的车辆通过,在单行线的入口设置信号量y,在告示牌上显示某一时刻各方向来车的数量c1和c2,要修改告示牌上的车辆数量必须互斥进行,为此设置信号量x1和x2。若某方向的车辆需要通过时,则首先要将该方向来车数量c1或c2增加1,并查看自己是否是第一个进入单行线的车辆,若是,则获取单行线的信号量y,并进入单行线。通过此路段以后出单行线时,将该方向的车辆数c1或c2减1(当然是利用x1或x2来互斥修改),并查看自己是否是最后一辆车,若是,则释放单行线的互斥量y,否则保留信号量y,让后继车辆继续通过。双方的操作如出一辙。考虑出现一个极端情况,即当某方向的车辆首先占据单行线并后来者络绎不绝时,另一个方向的车辆就再没有机会通过该单行线了。而这种现象是由于算法本身的缺陷造成的,不属于因为特殊序列造成的饥饿,所以它是真正的饥饿现象。因为有信号量的控制,所以死锁的可能性没有了(双方同时进入单行线,在中间相遇,造成双方均无法通过的情景)。

① 假设 $\mathrm{P}_{1}$ 进程稍快,$\mathrm{P}_{2}$ 进程稍慢,同时运行;② $\mathrm{P}_{1}$ 进程首先进入if条件语句,因此获得了y的互斥访问权,$\mathrm{P}_{2}$ 被阻塞;③ 在第一个 $\mathrm{P}_{1}$ 进程未释放y之前,又有另一个 $\mathrm{P}_{1}$ 进入,c1的值变成2,当第一个 $\mathrm{P}_{1}$ 离开时,$\mathrm{P}_{2}$ 仍然被阻塞,这种情形不断发生;④ 在这种情况下会发生什么事?$\mathrm{P}_{1}$ 顺利执行,$\mathrm{P}_{2}$ 很郁闷,长期被阻塞。

综上所述,不会发生死锁,但会出现饥饿现象。因此选B。

## 24. C


<!-- page: 180 -->

本题中两个进程不能正确地工作,运行结果的可能性详见下面的说明。

1.  $x = 1$
2.  $y = 0$
3.  $\mathrm{If}x &gt;= 1$  then  $\mathrm{y} = \mathrm{y} + 1$
4.  $z = y$
5.  $x = 0$
6.  $t = 0$
7.  $\mathrm{if}x &lt;= 1$  then  $t = t + 2$
8.  $u = t$

不确定的原因是由于使用了公共变量 x,考查程序中与变量 x 有关的语句共四处,执行的顺序是  $1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 5 \rightarrow 6 \rightarrow 7 \rightarrow 8$  时,结果是  $y = 1, z = 1, t = 2, u = 2, x = 0$ ;并发执行过程是  $1 \rightarrow 2 \rightarrow 5 \rightarrow 6 \rightarrow 3 \rightarrow 4 \rightarrow 7 \rightarrow 8$  时,结果是  $y = 0, z = 0, t = 2, u = 2, x = 0$ ;执行的顺序是  $5 \rightarrow 6 \rightarrow 7 \rightarrow 8 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 4$  时,结果是  $y = 1, z = 1, t = 2, u = 2, x = 1$ ;执行的顺序是  $5 \rightarrow 6 \rightarrow 1 \rightarrow 2 \rightarrow 7 \rightarrow 8 \rightarrow 3 \rightarrow 4$  时,结果是  $y = 1, z = 1, t = 2, u = 2, x = 1$ 。可见结果有多种可能性。

显然,无论执行顺序如何,x 的结果只能是 0 或 1,因此语句 7 的条件一定成立,即  $t = u = 2$  的结果是一定的;而  $y = z$  必定成立,只可能有 0, 1 两种情况,又不可能出现  $x = 1, y = z = 0$  的情况,所以总共只有 3 种结果(答案中的 3 种)。

25. C

一个进程在获得资源后,只能在使用完资源后由自己释放,即它的资源不能被系统剥夺,答案为选项 C。

26. C

$$
\operatorname {N e e d} = \operatorname {M a x} - \operatorname {A l l o c a t i o n} = \left[ \begin{array}{l l l} 0 &amp; 0 &amp; 4 \\ 1 &amp; 7 &amp; 5 \\ 2 &amp; 3 &amp; 5 \\ 0 &amp; 6 &amp; 4 \\ 0 &amp; 6 &amp; 5 \end{array} \right] - \left[ \begin{array}{l l l} 0 &amp; 0 &amp; 3 \\ 1 &amp; 0 &amp; 0 \\ 1 &amp; 3 &amp; 5 \\ 0 &amp; 0 &amp; 2 \\ 0 &amp; 0 &amp; 1 \end{array} \right] = \left[ \begin{array}{l l l} 0 &amp; 0 &amp; 1 \\ 0 &amp; 7 &amp; 5 \\ 1 &amp; 0 &amp; 0 \\ 0 &amp; 6 &amp; 2 \\ 0 &amp; 6 &amp; 4 \end{array} \right]
$$

选项 I:根据 need 矩阵可知,当 Available 为 (1, 4, 0) 时,可满足  $\mathrm{P}_2$  的需求; $\mathrm{P}_2$  结束后释放资源,Available 为 (2, 7, 5) 可以满足  $\mathrm{P}_0, \mathrm{P}_1, \mathrm{P}_3, \mathrm{P}_4$  中任意一个进程的需求,所以系统不会出现死锁,处于安全状态。选项 II:当 Available 为 (0, 6, 2) 时,可以满足进程  $\mathrm{P}_0, \mathrm{P}_3$  的需求;这两个进程结束后释放资源,Available 为 (0, 6, 7),仅可以满足进程 4 的需求; $\mathrm{P}_4$  结束并释放后,Available 为 (0, 6, 8),此时不能满足余下任意一个进程的需求,因此当前处在非安全状态。选项 III:当 Available 为 (1, 1, 1) 时,可以满足进程  $\mathrm{P}_0, \mathrm{P}_2$  的需求;这两个进程结束后释放资源,Available 为 (2, 4, 9),此时不能满足余下任意一个进程的需求,处于非安全状态。选项 IV:当 Available 为 (0, 4, 7) 时,可以满足  $\mathrm{P}_0$  的需求,进程结束后释放资源,Available 为 (0, 4, 10),此时不能满足余下任意一个进程的需求,处于非安全状态。

综上分析:只有选项I处于安全状态。

27. C

死锁定理是用于检测死锁的方法。

28. C

按照银行家算法,只要保证系统中进程申请的最大资源数小于或等于  $m$ ,就一定存在一个安全序列。考虑最极端的情况,假如有  $n - 1$  个进程都申请了 1 个资源,剩下一个进程申请了  $m$  个资源,则各进程的最大需求量之和为  $m + n - 1$ ,此时能保证一定不会发生死锁。

29. D

任何时刻都能保证至少有一个进程可以得到所需的全部资源,这意味着银行家算法可以保证系统中至少存在一个安全序列,使每个进程都能按该顺序得到所需的全部资源并正常结束,不会


<!-- page: 181 -->

出现死锁的情况。这也是银行家算法避免死锁的核心思想。

## 30. C

银行家算法要求,进程运行之前先声明它对各类资源的最大需求量,并保证它在任何时刻对每类资源的请求量不超过它所声明的最大需求量。当进程已占有的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源量能满足尚需的最大资源量时,才分配资源。

## 31. D

解除死锁的方法有两种:撤销死锁进程和剥夺死锁进程的资源。降低死锁进程的优先级是无效的方法,因为它不能改变死锁进程对资源的需求和占有,也不能打破循环等待条件。

## 32. B

当两个进程都执行完第一步后,即进程 $\mathrm{P_1}$ 和进程 $\mathrm{P_2}$ 都申请到了一个 $\mathrm{R_1}$ 类资源时,随着两个进程向前推进,无论哪个进程执行完第二步,系统都将进入死锁状态,进入死锁状态的原因是两个进程都需要两个 $\mathrm{R_1}$ 类资源才能运行,但系统中此时已经没有可供分配的 $\mathrm{R_1}$ 类资源。假定进程 $\mathrm{P_1}$ 成功执行了第二步,则死锁发生时资源分配图如下图所示。