死锁
死锁?原因?必要条件?预防?避免?解除/恢复?
参考——https://www.cnblogs.com/bopo/p/9228834.html#_label0
http://www.pianshen.com/article/2656280581/
什么是死锁?
死锁是指多个进程在运行过程中因竞争资源而造成的一种僵局(互相等待),若无外力作用,均无法向前推进。
死锁产生的原因?
1.系统资源的竞争
系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
2.进程运行推进顺序不合适
进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。
死锁产生的4个必要条件?
1.互斥条件
一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一进程所占用。若有其他进程请求该资源,则请求进程只能等待。
2.请求和保持条件
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。【当进程因请求资源而阻塞时,且对已获得的资源保持不放。】
3.不可剥夺条件
进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
4.循环等待条件
若干进程间形成首尾相接、循环等待资源的关系。
以上4个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立。而只要上述条件之一不满足,就不会发生死锁。
死锁的预防?
在程序运行之前预防发生死锁。可以通过破坏死锁产生的4个必要条件预防死锁,由于资源互斥是资源使用的固有特性是无法改变的,主要破坏其他3个条件。
1.破坏“请求和保持”条件
第一种静态分配,即每个进程在开始运行前,就一次性地申请它在整个运行过程中所需要的全部资源。
第二种动态分配,进程只需获得运行初期所需要的资源便开始运行,在运行过程中逐步释放掉分配到的已经使用完的资源,然后再去请求新的资源。
2.破坏“不可剥夺”条件
已持有资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,以后需要使用时再重新申请。
3.破坏“循环等待”条件
采用资源有序分配,其基本思想是将系统中的所有资源顺序编号,将紧缺的、稀少的资源采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的资源才能申请较大编号的资源。【给资源统一编号,进程只能按编号顺序来请求资源。】
死锁的避免?
在程序运行时避免发生死锁。
基本思想:在使用前进行判断,只允许不会产生死锁的进程申请资源。
利用额外的检验信息(动态检查),在分配资源时判断是否会出现死锁,只有不会出现死锁的情况下才分配资源。
具体实现:银行家算法
通过对进程需求、占有和系统拥有资源的实时统计,确保系统在分配给进程资源不会造成死锁。
可利用资源向量Available——系统中各种资源剩余的数目
最大需求矩阵Max——各个进程对各种资源的最大需求量
分配矩阵Allocation——已经分配给各个进程的各种资源的数目
需求矩阵Need——进程仍需要的资源数目
死锁解除/恢复?
1.抢占资源
从一个或多个进程中抢占足够数量的资源分配给死锁进程,解除死锁状态。
2.终止(撤销)进程
终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
a.终止所有死锁进程。
简单粗暴,代价太大,很可能导致一些运行很久的进程终止。
b.逐个终止进程,直至死锁状态解除。
代价也很大,每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。采用最优策略选择一个“代价最小”的进程解除死锁,根据如下方面来决定终止哪个进程:
进程的优先级、已运行时间及运行完成还需要的时间、已占用系统资源、运行完成还需要的资源、终止进程数目、进程是交互还是批处理。