一、概念
死锁是指在一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引起的事件,而无限期地僵持下去的局面。在多任务环境中,由于资源分配不当,导致两个或多个进程在等待对方释放资源时陷入无限等待的状态,这就是死锁。
二、产生因素
- 系统资源有限:当系统中多个进程共享资源时,如打印机、公用队列等,其数目不足以满足所有进程的需求,会引起进程对资源的竞争而产生死锁。
- 并发进程间的推进顺序不当:进程在运行过程中,请求和释放资源的顺序不当,也会产生进程死锁。
- 资源分配策略:资源的分配策略也可能导致死锁的发生,如资源的分配是否公平、是否遵循一定的顺序等。
三、必要条件
产生死锁必须同时满足以下四个必要条件:
- 互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内某资源仅能被一个进程占用。如果此时还有其他进程请求该资源,那么请求的进程只能等待,直到占有资源的进程用毕释放。
- 占有和等待条件:进程已经持有至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己已获得的资源保持不放。
- 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能由获得该资源的进程自己释放。
- 环路等待条件:在发生死锁时,必然存在一个进程-资源的环形链,即进程集合中的进程形成一种头尾相接的环形等待资源关系。
四、死锁的处理策略
死锁预防:
- 破坏互斥条件:允许资源同时被多个进程访问,但这对于某些资源(如打印机)来说是不可能的。
- 破坏占有和等待条件:实行资源预先分配策略,即进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程所需的全部资源时,才一次性将所申请的资源全部分配给该进程。但是,这样会导致资源利用率降低,并可能导致饥饿现象。
- 破坏不剥夺条件:当一个进程占有了一部分资源,在申请新的资源而得不到满足时,必须释放所有占有的资源以便让其他进程使用。但这种方法实现起来比较困难,且可能导致工作失效、增加系统开销。
- 破坏环路等待条件:采用资源有序分配法,对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源。这种策略可以破坏环路等待条件,从而预防死锁的发生。
死锁避免:
死锁避免方法允许系统中同时存在死锁的三个必要条件,即互斥、占有且等待和非抢占。每当进程提出资源申请时,系统分析满足该资源请求时系统是否会发生死锁,若不会发生则实施分配,否则拒绝分配。银行家算法就是一种避免死锁的方法,它模拟银行家贷款的策略来分配系统资源,以确保系统始终处于安全状态。死锁检测与解除:
死锁检测和解除对资源分配不加任何限制,也不采取死锁避免措施。系统定时运行一个“死锁检测”程序,如果检测到系统发生了死锁,再采取措施解除它。解除死锁的方法包括立即结束所有进程的执行并重新启动操作系统、剥夺陷于死锁的进程占用的资源但不撤销它直到死锁解除、撤销陷于死锁的所有进程并解除死锁继续运行等。此外,还可以使用进程-资源分配图来检测系统是否处于死锁状态,并采取相应的措施来解除死锁。
五、总结
死锁是操作系统中一个复杂且重要的问题。为了避免和解决死锁问题,我们需要深入理解死锁的产生原因和必要条件,并采取相应的预防、避免、检测和解除策略。在实际应用中,我们需要根据系统的具体需求和特点选择合适的策略来确保系统的稳定性和可靠性。
结语
艺术并非模仿生活
而是生活在模仿艺术
!!!