操作系统教程OS 孙忠秀

17、死锁(操作系统笔记)

2017-02-17  本文已影响226人  yjaal

一、死锁的基本概念

1.1 死锁的定义

1.2 死锁的产生原因

资源数量有限、锁和信号量错误使用。

1.3 活锁和饥饿

1
说明:

1.4 产生死锁的必要条件

二、资源分配图(RAG:Resource Allocation Graph)

用有向图描述系统资源和进程的状态


2

2.1 资源分配图画法说明

2.2 死锁定理

2.3 资源分配图化简

化简步骤:

三、死锁预防

3.1 解决死锁的方法

3.2 死锁预防(Deadlock Prevention)

3.2.1 破坏“互斥使用/资源独占”条件

3.2.2 破坏“占有且等待”条件

3.2.3 破坏“不可抢占”条件

3.2.4 破坏“循环等待”条件

四、死锁避免

五、死锁避免算法:银行家算法

这是Dijkstra1965年提出的,是仿照银行发放贷款时采取的控制方式而设计的一种死锁避免算法。

当进程Pi提出资源申请时,系统执行下列步骤:
(1)若Request[i] <= Need[i],转(2);否则,报错返回。
(2)若Request[i] <= Available,转(3);否则,报错返回。
(3)假设系统分配了资源,则有:

Available = Available - Request[i];
Allocation[i] = Allocation[i] + Request[i];
Need[i] = Need[i] = Request[i]

若系统新状态是安全的,则分配完成;若系统新状态是不安全的,则恢复原来状态,进程等待。

为了进行安全性检查,定义了数据结构:

Work : ARRAY[1...m] of integer;
Finish : ARRAY[1...n] of Boolean;

安全性检查的步骤:
(1)Work = Available; Finish = false;
(2)寻找满足条件的i

a. Finish[i] == false
b. Need[i] <= Work;

如果不存在,则转(4)
(3)

Work = Work + Allocation[i] ;
Finish[i] = true

转(2)
(4)若对所有i,Finish[i] == true,则系统处于安全状态,否则,系统处于不安全状态。

六、死锁检测与解除

6.1 一个简单的死锁检测算法

5

6.2 死锁的解除

发生死锁后重要的是以最小的代价恢复系统的运行。方法如下:

七、哲学家就餐问题

问题描述:

问题模型:
应用程序中并发线程执行时,协调处理共享资源。

7.1 第一种方案

6
说明:这里将筷子当作一个信号量来处理,饥饿的时候会申请筷子(P操作),当同时等待拿某只筷子的时候会发生死锁。

为防止死锁发生可采取的措施:

7.2 第二种方案

7
说明:这里增加了一个信号量room,即这个桌子上最多允许坐四个人,这样就不会发生死锁。

7.3 第三种方案

8
9
说明:这里使用管程来解决,即哲学家拿筷子的动作是由管程管理,一次只能拿两只筷子。

7.4 第四种方案

10
11
12
上一篇 下一篇

猜你喜欢

热点阅读