死锁的定义:
一组进程中,每个进程都无限等待该组进程中另一进程所占有的资源,因而永远无法得到资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
死锁的四个条件:
1、互斥使用(资源独占:打印机,十字路口)
一个资源每次只能给一个进程使用
2、占有且等待(请求和保持,部分分配:十字路口)
进程在申请新的资源的同时保持对原有资源的占有
3、不可抢占(不可剥夺:十字路口)
资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
4、循环等待(十字路口)
存在一个进程等待队列{p1,p2,...,pn},
其中p1等待p2占有的资源,p2等待p3占有的资源,...,pn等待p1占有的资源,形成一个进程等待环路
死锁的预防:破坏产生死锁的四个条件之一
1、破坏“互斥使用/资源独占”条件
资源转换技术:把独占资源变成共享资源(spooling技术的引入,设计一个“守护进程/线程”负责管理打印机)
2、破坏“占有且等待”条件
方案1、要求每个进程在运行前必须一次性申请它所要求的所有资源。问题:资源利用率低;饥饿 现象。
方案2、允许进程动态申请资源的前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态前,释放已占有的全部资源,若需要再重新申请。
3、破坏“不可抢占”条件
实现方案:可以通过操作系统抢占这一资源(两个进程优先级不同)
局限性:适用于状态易于保存和恢复的资源
cpu、内存(ram)
4、破坏“循环等待”条件
通过定义资源类型的线性顺序实现
实施方案:资源有序分配法(哲学家就餐问题)
解决死锁的方法
1、不考虑此问题(鸵鸟算法)
2、死锁预防:静态策略:设计合适的资源分配算法,不让死锁发生
3、死锁避免:动态策略:以不让死锁发生为目标,跟踪并评估资源分配过程,根据评估结果决策是否分配(银行家算法)
定义:在系统运行的过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统发生死锁或可能发生死锁,则不予分配,否则予以分配。
安全序列:一个进程序列{p1,..pn}是安全的,如果对于每一个进程pi1(1<= i <= n):
它以后还需要的资源量不超过系统当前剩余资源量与所有进程pj(j
则称系统处于安全状态
4、让死锁发生:死锁的检测与解除
检测的时机:1、当进程资源请求得不到满足而等待时检测死锁。2、定时检测。3、系统资源利用率下降时检测死锁。
死锁的解除:(前两个消耗资源大)
1、撤销所有死锁进程
2、进程回退(roll back)再启动
3、按照某种原则逐一撤销死锁进程,直到...
4、按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前的对应状态),直到...
一种简单的死锁检测算法
设置一张资源分配表、设置一张进程等待表,记录进程与要申请资源之间的关系,若出现环路则产生死锁。