第七章 死锁
基础知识
死锁
集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。
死锁的必要条件
如果在一个系统中下面4个条件同时满足,那么会引起死锁:互斥、占有并等待、非抢占、循环等待。
资源分配图(RAG)
如果图中不包含环——无死锁。
如果图形包含一个环:
如果每个资源类型只有一个实例,那么死锁。
如果每个资源类型有多个实例,可能死锁。
死锁处理方法
可以使用协议以预防或避免死锁,确保系统不会进入死锁状态。
可允许系统进入死锁状态,然后检测它,并加以恢复。
可忽视这个问题,认为死锁不可能在系统内发生。
死锁预防:用一组方法来确保至少一个导致死锁的必要条件不成立。
死锁避免:要求操作系统事先得到有关进程申请资源和使用资源的额外信息,有了这些额外信息,系统可判断是否让该进程等待。
死锁预防
通过限制资源申请的方法来预防死锁,副作用是降低备使用率和系统吞吐率。
互斥:通常不能通过否定互斥条件来预防死锁。
占有并等待:当一个进程申请资源时,不能占有其他资源。
非抢占:可以订以下协议,当一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都可以被抢占。
循环等待:对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。
死锁避免
获得以后如何申请资源的附加信息。
安全状态一定不会死锁,不安全状态可能导致死锁。
资源分配图算法:
申请边:进程指向资源的实线边。
分配边:资源指向进程的实线边。
需求边:进程指向资源的虚线边。
有环存在:不安全状态;没有环存在:安全状态。
银行家算法:
Available:每种资源的现有实例的数量
Max:每个进程的最大需求
Allocation:每个进程现在所分配的各种资源类型的实例数量
Need:每个进程还需要的剩余的资源(还未发出请求)
Request:所请求分配的资源(已经发出请求)
Need = Max – Allocation
死锁检测
在资源分配图中,删除所有资源类型的节点,合并适当边,就可以得到等待图。
当且仅当等待图中有一个环,系统中存在死锁。
课后作业
7.1
a.互斥:只有一辆车占据道路的一个位置。占有并等待:一辆车占据道路的一个位置并等待前进。非抢占:一辆车不能从当前位置挪开。循环等待:所有的后一辆车都在等待前一辆车。
b.如果在路口的车不会立即走完那么就不进入路口。
7.2
互斥:一个筷子同一时刻只能被一个哲学家所使用。占有并等待:一个哲学家占有一只筷子并等待另一只筷子空闲。非抢占:哲学家不能强行拿走已经被其他哲学家拿走的筷子。循环等待:所有哲学家都在循环等待筷子。
筷子可以被共享。一个哲学家得不到其他筷子则放弃手中的筷子。哲学家可以强行拿走被其他哲学家长时间占用的筷子。实施编号筷子,总是获得较低编号的筷子,之后才能获得较高的编号的筷子。
7.3
这个方法定义的范围过大,缩小范围会更好。
7.4
a.死锁避免方法要追踪当前资源分配,增加了运行时开销。
b.死锁避免方法比静态地防止死锁产生的方法允许更多并发资源,所以系统吞吐量大。
7.6
三个进程共享四个资源,必定至少有一个进程有两个资源,这个进程可以执行完毕并释放资源,其他进程也可执行完毕,故不会死锁。
7.8
当哲学家申请一只筷子的时候,如果没有其他哲学家有两只筷子或者是桌子上仅剩一只筷子,则不允许申请。
7.11
a.
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
b.
安全。P0和P3可以运行,运行完毕释放出资源其他进程可以运行。
c.
可以。Avaliable(1,5,2,0)>Request(0,4,2,0),所以可以运行。
思考题:
1. 死锁的概念:
死锁是指一组处于等待(阻塞)状态的进程,每一个进程持有其他进程所需要的资源,而又等待使用其他进程所拥有的资源,致使这组进程互相等待,均无法向前推进。
2. 死锁的四个必要条件:
互斥、占有并等待、非抢占、循环等待
3. 对于死锁问题,可以考虑哪些方法予以解决:
可用协议以预防或避免死锁,确保系统不会进入死锁状态。
可允许系统进入死锁状态,然后检测它,并加以恢复。
可忽视这个问题,认为死锁不可能在系统内发生。
4. 以哲学家就餐为例,说明如何预防死锁:
筷子可以被共享。一个哲学家得不到其他筷子则放弃手中的筷子。哲学家可以强行拿走被其他哲学家长时间占用的筷子。实施编号筷子,总是获得较低编号的筷子,之后才能获得较高的编号的筷子。
5. 避免死锁的方法:
通过限制资源申请的方法来预防死锁。获得以后如何申请资源的附加信息。