(1)互斥条件(mutual exclusion):资源不能被共享,只能由一个进程使用;算法
(2)请求与保持条件(hold and wait):进程已得到了一部分资源,但因请求其它资源被阻塞时,对已得到的资源保持不放;并发
(3)不可抢占条件(no pre-emption):有些系统资源是不可抢占的,当某个进程已得到这种资源后,系统不能强行收回,只能进程使用完时本身释放;测试
(4)循环等待条件(circular wait):若干个进程造成环形链,每一个都占用对方申请的下一个资源。spa
本身总结:有我的很霸道,拿了东西就不愿还(请求保持),别人还不能抢(不可抢),又不愿和别人共享(互斥),形成了死循环(循环等待)。.net
(1)死锁预防blog
破坏致使死锁必要条件中的任意一个就能够预防死锁,但这种方法破坏了系统的并行性和并发性。例如,要求用户申请资源时一次性申请所须要的所有资源,这就破坏了保持和等待条件;将资源分层,获得上一层资源后,才可以申请下一层资源,它破坏了环路等待条件。预防一般会下降系统的效率。进程
注:死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具有的条件,而不是存在这3个条件就必定产生死锁,那么只要在逻辑上回避了第四个条件就能够避免死锁。ci
(2)死锁避免资源
容许前三个条件存在,但经过合理的资源分配算法来确保永远不会造成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了不死锁,系统动态的肯定是否分配一个资源给请求的进程。方法以下:it
a.若是一个进程的当前请求的资源会致使死锁,系统拒绝启动该进程;
b.若是一个资源的分配会致使下一步的死锁,系统就拒绝本次的分配;
显然要避免死锁,必须事先知道系统拥有的资源数量及其属性,而且死锁避免算法的执行会增长系统的开销,常见算法如:银行家算法。
(3)死锁检测
死锁预防和避免都是事前措施,而死锁的检测则是判断系统是否处于死锁状态,若是是,则执行死锁解除策略。
(4)死锁解除
这是与死锁检测结合使用的,它使用的方式就是剥夺。即将某进程所拥有的资源强行收回,分配给其余的进程。
(1)其中,银行家算法以下:
所谓银行家算法,是指在分配资源以前先看清楚,资源分配后是否会致使系统死锁。若是会死锁,则不分配,不然就分配。
按照银行家算法的思想,当进程请求资源时,系统将按以下原则分配系统资源:
a.当一个进程对资源的最大需求量不超过系统中的资源数时能够接纳该进程。
b.进程能够分期请求资源,当请求的总数不能超过最大需求量。
c.当系统现有的资源不能知足进程尚需资源数时,对进程的请求能够推迟分配,但总能使进程在有限的时间里获得资源。
d.当系统现有的资源能知足进程尚需资源数时,必须测试系统现存的资源可否知足该进程尚需的最大资源数,若能知足则按当前的申请量分配资源,不然也要推迟分配。
(2)其中,鸵鸟算法以下:
忽略死锁。该算法能够应用在极少发生死锁的的状况下。为何叫鸵鸟算法呢,由于传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟以为看不到危险也就没危险了吧。跟掩耳盗铃有点像。
若有不对的地方,很是欢迎给予指导!
——【感谢】资料来源于http://blog.csdn.net/liujianfei526/article/details/51933162