1.死锁的定义
由于竞争资源或者通信关系,两个或者多个线程在执行中出现,永远相互等待只能有其他进程发起的事件。
可重用资源:资源不可以被删除且在任何时刻只能有一个进程使用、进程释放资源后、其他资源可重用
硬件:处理器、I/O通道、主妇存储器、设备等
软件:文件、数据库和信号量等数据结构
可能出现死锁
消耗资源:资源创建和销毁。
在I/O缓冲区的中断、信号和消息
可能出现死锁
2.出现死锁的必要条件
互斥:任何时刻只能有一个进程使用一个资源实例。
持有并等待:进程保持持有至少一个资源,并正在等待获取其他进程保持的资源。
非抢占:资源只有在进程使用后自愿放弃
循环等待:
3.死锁处理方法
3.1 死锁预防:保证系统永远不会进入死锁状态
1)互斥
把互斥的共享资源封装成可同时访问
2)持有并等待
进程请求资源时,要求它不持有任何其他资源
仅允许进程在开始执行时,一次请求所有需要的资源
资源利用效率太低
3)非抢占
如果进程请求不能立即分配资源,则释放已占有资源
只有在能够同时获得所有需要资源时,才执行分配操作
4)循环等待
对资源排序,要求进程按顺序请求资源
3.2 死锁避免:在使用之前进行检测,只允许不会出现死锁的进程请求资源
银行家算法:死锁避免的方法
基本思路:我当前的剩余资源能够满足某个进程或者线程未来的需要,并且这种迭代到最后能够满足所有线程的需要。
eg:
第一步:当前最大需求矩阵内没有一个进程大于系统资源向量即可以继续往下,然后减去已经分配的资源矩阵后得到当前资源请求矩阵与当前可用资源向量,我们发现当前可用资源能够支持T2运行并回收T2。
第二步:剩下的资源可以支持T1运行,运行完成后回收。。。。直到收回所有的资源为止。
3.3 死锁检测和恢复:在检测到运行系统进入死锁状态,进行恢复
死锁检测:允许系统进入死锁、维护系统的资源分配图、定期调用死锁检测算法来搜索图中是否存在死锁、出现死锁时,用死锁恢复机制进行恢复。
死锁检测算法:
eg:如图所示我们可以看到通过第一个和第二个矩阵可以看到,T0和T2是可以执行完毕并回收的,当前可用资源数就会增加,直到所有的finish都为true
死锁检测算法的使用:
死锁恢复:进程终止、资源抢占
进程的优先级越小、已经运行时间越短的进程越容易被终止。批处理通常优先被禁止。