第二十一课:死锁预防与死锁避免


第一部分:先理解"银行家算法"

为什么叫:

银行家算法?

来看一个故事。

假设:

你是一家银行。

你:

现在:

有:

100万元

来了:

三个客户。

A:

最多:

需要:

60万

B:

最多:

需要:

40万

C:

最多:

需要:

50万

注意:

这里说的是:

最多需要。

不是:

现在就要。


例如:

今天。

A:

先借:

30万

银行:

还能:

借。

因为:

还有:

70万

但是。

如果:

A:

后来:

又借:

30万。

B:

借:

40万。

C:

借:

50万。

银行:

是不是:

一下:

没钱了?

如果:

大家:

都没完成。

没人:

还钱。

银行:

是不是:

可能:

崩?

所以。

银行:

每借一次钱。

都会:

先想:

借给你之后,我还有没有办法保证所有人最终都能完成?

如果:

可以。

借。

如果:

不可以。

拒绝。

这就是:

银行家算法。


第二部分:什么叫安全状态?

教材定义:

存在一个安全序列,使所有进程都能顺利完成。

这一句话:

第一次看。

几乎:

没人懂。

我们:

换成人话。


假设:

三个进程:

P1

P2

P3

资源:

还剩:

5

如果:

操作系统:

发现:

可以:

这样安排。

P2

↓

完成

↓

释放资源

↓

P1

↓

完成

↓

释放资源

↓

P3

最后:

三个:

都能:

结束。

那么:

现在:

就是:

安全状态(Safe State)

注意。

不是:

一起完成。

而是:

存在:

一种:

执行顺序。


第三部分:什么叫安全序列?

刚才:

那个顺序。

P2

↓

P1

↓

P3

就是:

安全序列(Safe Sequence)

所以:

教材:

一定:

会考。

区别:

名称 含义
安全状态 存在至少一个安全序列
安全序列 一个能够让所有进程完成的执行顺序

很多同学:

会:

混。


第四部分:危险状态(Unsafe State)

很多人:

最容易:

误解。

危险状态:

是不是:

已经:

死锁?

不是!

一定:

记住。

危险状态 ≠ 死锁

为什么?

来看。

假设:

现在:

资源:

越来越少。

已经:

找不到:

安全序列。

那么:

现在:

就是:

危险状态。

但是。

如果:

后面:

有进程:

提前:

释放:

资源。

还是:

可能:

恢复。

所以:

危险:

只是:

可能:

死锁。

不是:

一定。

口诀:

安全状态 → 一定不会死锁。

危险状态 → 可能死锁,但不一定已经死锁。

这是考试最爱出的判断题。


第五部分:死锁预防

上一课:

我们学过:

死锁:

发生:

必须:

满足:

四个条件。

那:

最简单:

怎么办?

破坏其中一个条件。

这就是:

死锁预防(Deadlock Prevention)。


方法一:破坏"请求并保持"

规定:

所有进程:

必须:

一次:

申请:

全部资源。

例如:

你要:

打印机。

扫描仪。

必须:

一起申请。

不能:

先拿:

打印机。

再:

申请:

扫描仪。

这样:

就不会:

拿着一个。

等另一个。

是不是:

破坏了:

请求并保持?


缺点:

资源:

利用率:

低。

因为:

很多资源:

可能:

一直:

空着。


方法二:破坏"不可剥夺"

规定:

如果:

申请:

失败。

已经:

拿到:

的资源。

全部:

还回去。

以后:

重新:

申请。

例如:

已经:

拿着:

打印机。

申请:

扫描仪。

失败。

操作系统:

直接:

收回:

打印机。

这样:

别人:

可以:

继续。


缺点:

有些资源:

不能:

随便:

抢。

例如:

打印机:

已经:

打印:

一半。

抢走:

是不是:

坏了?

所以:

不是:

所有资源:

都适合。


方法三:破坏"循环等待"

规定:

所有资源:

编号。

例如:

R1

R2

R3

R4

规定:

必须:

按:

编号:

申请。

例如:

可以:

R1

↓

R2

↓

R3

不能:

反过来。

于是:

等待:

永远:

不会:

形成:

一个圈。


教材:

这一种:

最喜欢:

考。

第六部分:死锁避免

预防:

比较:

严格。

资源:

利用率:

低。

于是:

提出:

避免。

思想:

不是:

禁止。

而是:

每次:

申请。

先:

试一试。

如果:

借出去。

还能:

保持:

安全状态。

批准。

否则:

拒绝。

这就是:

银行家算法。


第七部分:银行家算法流程(思想版)

假设:

P1:

申请:

2个资源。

操作系统:

不会:

马上:

给。

而是:

先:

模拟。

假装:

已经:

给了。

然后:

检查:

有没有:

安全序列。

如果:

有。

真正:

分配。

如果:

没有。

恢复。

拒绝。

整个过程:

像:

银行:

审批:

贷款。


第八部分:为什么叫"避免"?

因为:

它:

不是:

死锁:

以后:

解决。

而是:

在:

发生:

之前。

避免:

进入:

危险状态。

所以:

叫:

Deadlock Avoidance(死锁避免)


第九部分:预防 vs 避免(★★★★★)

这是考试最喜欢考的表格。

项目 死锁预防 死锁避免
思想 破坏四个必要条件 不进入危险状态
是否限制申请 很严格 较灵活
资源利用率 较低 较高
是否需要知道最大需求 不需要 需要

最后一行:

一定:

记住。

银行家算法:

必须:

知道:

每个进程:

最多:

需要:

多少资源。

否则:

怎么:

模拟?


第十部分:口诀(★★★★★)

预防:

破坏条件

避免:

进入危险

银行家:

先模拟

后分配

一句口诀:

预防靠破坏,避免靠判断;先试再分配,安全才批准。


第十一部分:本课重点

必须掌握

✅ 安全状态:存在安全序列。

✅ 安全序列:一种能让所有进程完成的执行顺序。

✅ 危险状态:可能死锁,不等于已经死锁。


必须会区分

状态 是否一定死锁
安全状态 ❌ 一定不会死锁
危险状态 ❌ 不一定死锁
死锁状态 ✅ 已经死锁

必须知道

死锁预防:

破坏四个必要条件。

死锁避免:

银行家算法。

第二十二课:银行家算法(计算题)


一、先认识四张表

银行家算法一定会给你四组数据。

例如:

进程 Max Allocation
P0 7 3
P1 5 2
P2 3 2

还有:

Available = 3

很多同学:

第一眼:

就懵了。

其实:

每一列:

都很好理解。


① Max(最大需求)

表示:

这个进程最多需要多少资源。

例如:

P0:

Max = 7

说明:

P0:

这一生:

最多:

需要:

7 个资源。

不是:

现在。

而是:

最多。


② Allocation(已分配)

表示:

操作系统已经给了多少资源。

例如:

Allocation = 3

说明:

P0:

手里:

已经:

有:

3 个资源。


③ Need(还需要)

考试:

不会:

直接:

给。

需要:

自己:

算。

公式:

Need = Max - Allocation

例如:

Max = 7

Allocation = 3

那么:

Need = 4

意思:

P0:

还需要:

4 个资源。


④ Available(剩余资源)

表示:

系统:

现在:

还有:

多少:

空闲资源。

例如:

Available = 3

说明:

系统:

还能:

借出去:

3 个资源。


二、第一步:计算 Need

来看完整例子。

进程 Max Allocation
P0 7 3
P1 5 2
P2 3 2

Available:

3

先算:

Need。

进程 Need
P0 4
P1 3
P2 1

因为:

7-3=4

5-2=3

3-2=1

第一步:

结束。


三、第二步:找能完成的进程

规则:

Need ≤ Available

谁:

满足。

谁:

先执行。

现在:

Available = 3

看看:

P0:

Need = 4

够吗?

不够。


P1:

Need = 3

够。

可以:

完成。


P2:

Need = 1

也够。

也可以。

说明:

这里:

有:

两个:

选择。

例如:

我们:

先选:

P2。


四、第三步:释放资源

P2:

完成。

是不是:

应该:

把:

之前:

占有:

的资源:

还回来?

P2:

Allocation:

2

所以:

系统:

资源:

增加。

原来:

Available = 3

现在:

变成:

3 + 2 = 5

注意:

增加的是 Allocation ,不是 Need。

因为归还的是已经占有的资源。


五、继续找

现在:

Available = 5

看看:

P0:

Need = 4

可以。

P1:

Need = 3

也可以。

例如:

选:

P1。

完成。

释放:

Allocation = 2

于是:

Available = 7

最后:

P0:

Need:

4

系统:

有:

7

完成。

释放:

3。

结束。


于是:

安全序列:

就是:

P2

↓

P1

↓

P0

这就是:

安全序列(Safe Sequence)


六、考试完整步骤

拿到题目。

一定:

按下面:

四步。


第一步

算:

Need

公式:

Need = Max - Allocation

第二步

找:

Need ≤ Available

的进程。


第三步

执行:

释放:

Allocation

更新:

Available

第四步

重复。

直到:

全部:

完成。

或者:

找不到:

任何:

可执行:

进程。


七、什么时候是不安全状态?

假设:

Available:

只有:

1

看看:

Need。

P0 = 4

P1 = 3

P2 = 2

有没有:

一个:

满足:

Need ≤ 1

没有。

于是:

没有:

任何:

进程:

可以:

完成。

说明:

找不到:

安全序列。

于是:

进入:

危险状态。

注意:

这里:

还是:

危险。

不是:

已经:

死锁。


八、银行家算法真正干什么?

假设:

P1:

申请:

一个资源。

操作系统:

不会:

马上:

给。

而是:

先:

模拟:

给了之后

重新:

计算:

Available。

重新:

计算:

安全序列。

如果:

还能:

找到:

安全序列。

批准。

否则:

拒绝。

九、多资源怎么办?

刚才:

我们:

只有:

一种资源。

实际考试:

一般:

三个资源。

例如:

A

B

C

表格:

变成:

进程 Max(A,B,C) Allocation(A,B,C)
P0 (7,5,3) (0,1,0)

Need:

仍然:

公式:

Need = Max - Allocation

只是:

每一种:

资源:

分别:

计算。

例如:

Need

=

(7,5,3)

-

(0,1,0)

=

(7,4,3)

判断:

也是:

逐列:

比较。

例如:

Need

(2,1,3)

Available

(3,2,4)

比较:

2≤3

1≤2

3≤4

全部:

成立。

才能:

执行。

只要有一种资源不够,就不能执行。

十、一张流程图

开始

↓

计算Need

↓

Need≤Available?

↓

是

↓

执行

↓

释放Allocation

↓

更新Available

↓

继续

↓

全部完成?

↓

是

↓

安全状态

──────────

否

↓

危险状态

十一、口诀(★★★★★)

银行家:

四步:

口诀。

先算Need

↓

找能完成

↓

归还Allocation

↓

继续循环

一句话:

算 Need,找进程,还资源,再循环。


十二、本课重点(★★★★★)

必须会:

四个量:

名称 含义 公式
Max 最大需求 已知
Allocation 已分配 已知
Need 尚需资源 Max − Allocation
Available 剩余资源 已知/动态更新

必须知道:

安全序列:

就是:

能够:

让:

所有:

进程:

全部:

完成:

的顺序。


必须知道:

更新:

Available:

加的是:

Allocation

不是:

Need。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐