1、死锁的概念
在多道批处理系统,由于多个进程的并发执行,改善了系统资源的利用率和提高了系统的并发处理能力,然而多个进程的并发执行也带来了新的问题——死锁,死锁是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程将无法向前推进。
通过实例来了解死锁现象:
先看生活中的一个实例,在一条河上有一座桥,桥面很窄,只能容纳一辆汽车通行。如果有两辆汽车分别从桥的左右两端驶上该桥,则会出现下述的冲突情况。此时,左边的汽车占有了桥面左边的一段,要想过桥还需等待右边的汽车让出桥面右边的一段;右边的汽车占有了桥面右边的一段,要想过桥还需等待左边的汽车让出桥面左边的一段。此时,若左右两边的汽车都只能向前行驶,则两辆汽车都无法过桥。 在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态
死锁产生的原因
对系统资源的竞争,系统中拥有不可剥夺资源,如磁带机、打印机,只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,也会导致死锁。信号量使用不当也会造成死锁,不是因为竞争同一资源,而是在等待对方的资源导致死锁。
死锁产生的必要条件:
1、互斥条件 进程要求对所分配资源进行排他性控制,即在一段时间内某段资源仅为一个进程所占有
2、不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得资源的进程自己来释放。(主动释放)
3、请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4、循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。
死锁的处理策略
如何预防死锁?
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的想象
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。
死循环:某进程执行过程中一直跳不出某个循环的现象。死锁和饥饿问题是由于操作系统分配资源得策略不合理导致得,而死循环是由于代码逻辑的错误导致的。
产生死锁的必要条件:
1、互斥条件,只有对必须互斥使用的资源的争抢才会导致死锁2、不剥夺条件:进程所获得的资源在未使用完前,不能由其他进程强行夺走,只能主动释放
3、请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
4、循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
死锁的处理策略:不允许死锁发生:预防死锁(静态策略)、避免死锁(动态策略)
允许死锁: 死锁的检测和解除
1、预防死锁: 把互斥资源改造成可同时使用的资源,如SPOOLing技术把独占设备在逻辑上改造成共享设备。破坏不剥夺条件:破坏请求和保持条件:采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行后,这些资源就一直归他所有,该进程就不会再请求别的任何资源了
2、避免死锁:什么是安全序列在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求什么是系统的不安全状态,与死锁有何联系如何避免系统进入不安全状态----银行家算法在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态,如果进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待
3、死锁的检测和解除如果系统发生了死锁,系统提供了两个算法:
死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁用某种数据结构来保存资源的请求和分配信息提供一种算法,利用上述信息来检测系统是否已进入死锁状态
进程结点:对应一个进程
资源结点:对应一类资源,一类资源可以有多个两种边:
进程结点到资源结点:表示进程想申请几个资源(请求边)
资源结点到进程结点:表示已经为进程分配了几个资源(分配边)
如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时不会阻塞,可以顺利的执行下去如果最终能够消除所有边,这个图可完全简化,此时一定没有发生死锁死锁解除算法: 当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来
解除死锁的主要方法有:1、资源剥夺法 2、撤销进程法3、进程回退法