死锁概述
一. 死锁的定义
如果一组进程中每一个进程都在等待仅由该组中的其它进程才能引发的事件,那么该组进程是死锁的。
在一组进程发生死锁的情况下,该组死锁进程中的每一个进程都在等待另一个死锁进程占有的资源。也就是说,每个进程等待的事件都是该组其他进程释放所占的资源。但由于该组进程都已无法运行,因此他们谁也不能释放资源,致使没有一个进程能被唤醒。这样这组进程只能无限期的等待下去。
二. 资源问题
(死锁的起因,通常是源于多个进程对资源的争夺)
可重用性资源
1) 每一个可重用性资源只能分配给一个进程使用,不允许多个进程共享
2) 进程在使用资源时需按照顺序—>请求资源—>使用资源—>释放资源
3) 系统中每一类可重用性资源单元数目相对固定,进程运行期间既不能删除也不能创建。消耗性资源
在进程运行过程中动态的创建出和消耗的,通常是由生产者进程创建,由消费者进程消费。可抢占性资源
在某个进程获得这类资源以后,该资源可以被其他进程或者系统抢占。例如,优先级高的进程可以抢占优先级低的进程的处理机。- 不可抢占性资源
一旦系统吧资源分配给这个进程,就不能强行收回,只能等进程自己自行释放。
三.计算机系统中的死锁
竞争不可抢占资源引起的死锁
加入系统中有两个进程p1,p2,他们都准备去写两个文件f1,f2。如果p1,p2并发进行,p1先打开f1,然后打开f2,而p2也是先打开f1然后打开f2,这样由于p2先打开所以p2会阻塞,直到p1得到释放p2才会执行操作。同样p2先打开f1,然后打开f2,而p1先打开f1,然后打开f2也会正常运行下去。但是当 p1打开f1后再打开f2,而p2先打开f2后再打开f1,这样两个进程都会因为文件而阻塞,他们都希望对方释放掉文件,可是谁都不会释放。继而形成死锁。竞争可消耗资源引起的死锁
假如有三个进程— p1,p2,p3.
p1会产生消息m1,可以send给p2,同时他要接受来自p3的消息m3.
p2会产生消息m2,可以send给p3,同时他要接受来自p1的消息m1.
p3会产生消息m3,可以send给p1,同时他要接受来自p2的消息m2.
顺序如下:
p1: ……send(p2,m1); receive(p3,m3);……
p2: ……send(p3,m2); receive(p1,m1);……
p3: ……send(p1,m3); receive(p2,m2);……
但若改变三个进程先执行receive后send
p1: ……receive(p3,m3); send(p2,m1);……
p2: ……receive(p1,m1); send(p3,m2);……
p3: ……receive(p2,m2); send(p1,m3); ……
这三个进程永远阻塞在他们receive上面,于是发生死锁。进程推进顺序不当引起死锁
在进程运行过程中,对资源的申请和释放顺序是否合法,也是是否会发生死锁的一个重要原因。
四.产生死锁的必要条件
产生死锁必须同时具备以下四个必要条件,只要其中一个不成立那么死锁就不会发生。
互斥条件
在进程运行的一段时间内,某资源只能被一个进程占用,如果其他进程想请求该资源,那么必须等待,直至该资源的进程用毕释放。请求和保持条件
进程已经至少保持了一个资源,但又提出了新的资源请求。不可抢占资源
进程已获得的资源在未用完之前不得被抢占,只能自己运行完释放。循环等待条件
在发生死锁时,必然存在进程 — 资源循环链。进程集合{p0,p1,p2,p3,…..pn}中p0正在等待p1,占用的资源,p1正在等待p2占用的资源……..pn正在等待p0占用的资源。
五. 处理死锁
预防死锁
1)破坏请求和保持条件
进程只获得初期所需全部资源便开始运行,运行过程中再逐步释放已分配的资源,然后再请求新的所需资源。
2)破坏不可抢占条件
当一个进程已经能够保持了某些不可抢占资源的进程又提出了新的请求而得不到满足时,它必须释放已经保持额所有资源。待以后重新申请。
3)破坏“循环等待条件”避免死锁
1)银行家算法避免死锁
2)保证安全状态检测死锁
解除死锁