死锁概述

来源:互联网 发布:网页版淘宝的微淘 编辑:程序博客网 时间:2024/06/03 16:30
什么是死锁?
把多个进程因抢占资源,或者彼此间通信造成的一种僵局,在没有外力推动的作用下进程不能继续运行下去的这种状态称为死锁。

比如,有两个进程p1和p2,他们准备写两个文件f1和f2,两个进程并发运行:
如果p1先打开f1和f2,然后p2才去打开f1和f2,这时文件也已经被打开,p2会被阻塞。当p1完成写入时而关闭f1和f2,此时p2会有阻塞状态转为就绪状态,会重新去打开f1和f2,此时p1,p2正常运行。
如果p2先打开f1和f2,p1和p2同样可以正常运行。
如果p1在打开f1的时候p2打开了f2,这时当p1尝试去打开f2时,会因为f2已经打开而将p1阻塞,当p2尝试去打开f1时,会因为f1已经被打开而将p2阻塞,它们只能等待对方释放自己所需要的资源,但是谁也无法运行,造成两个进程将会无限期的进程等待,形成死锁 。

产生死锁的必要条件:
互斥条件:资源只能被一个进程所使用,若有其他进程请求资源,只能进行等待,直到占有资源的进程释放资源。
请求和保持:进程已经保持至少一个资源,但是又提出了对新资源的请求。
不可抢占:进程在获得资源时,资源不能被抢夺,只能由进程自己释放。
循环等待:在发生死锁时必然存在一条循环等待链,在这条链上的进程都在等待这条链上其他进程所占有的资源。

避免死锁:
在资源的动态分配中,防止系统进入不安全状态,以避免死锁的发生。
原理:
在避免死锁的方法中,把系统分为安全状态和不安全状态。当系统处于安全状态时,可避免死锁的发生,当系统处于不安全状态时,可能导致死锁的发生。
一个系统在开始时肯定处于安全状态,当一个进程向其申请资源时,系统会进行计算,如果把资源分配给进程会导致系统由安全状态变为不安全状态,系统会取消资源分配。只有当进程分配资源后系统仍然处于安全状态,才会将资源真正分配给进程。

银行家算法是一种常见的避免死锁的方法:
        所谓银行家算法,是指在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。
按照银行家算法的思想,当进程请求资源时,系统将按如下原则分配系统资源:
(1) 当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程。
(2) 进程可以分期请求资源,当请求的总数不能超过最大需求量。
(3) 当系统现有的资源不能满足进程尚需资源数时,对进程的请求可以推迟分配,但总能使进程在有限的时间里得到资源。
(4) 当系统现有的资源能满足进程尚需资源数时,必须测试系统现存的资源能否满足该进程尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配