本文讨论了操作系统中的死锁问题,探讨了死锁发生的条件和系统模型。通过资源类型、进程资源分配图和死锁特征的介绍,阐述了死锁产生的原因和可能性。最后强调了死锁发生的必要条件,并指出即使满足这些条件也不一定导致死锁的发生。
一组阻塞的进程持有一种资源,并等待获取另一个进程所占有的一个资源。这导致它们无法继续执行,进入一种僵局状态。
例如,系统有 2 个磁带驱动器,进程 P1 和进程 P2 各持有一个,但都需要另一个。
为什么会发生死锁?由于进程的并发执行抢占资源。
资源类型 R1,R2,…,Rm
每个资源类型 Ri 有 Wi 个实例
每个进程可使用的资源如下:
可重复使用的资源
使用资源
资源分配图
一组顶点 V 和边 E 的集合,V 有两种类型、E 有两种指向:
资源分配实例:无死锁、有环有死锁、有环无死锁
基本情况
如果图中不包含循环:没有死锁。
如果图中包含循环:
无环一定不会死锁,但有环不一定死锁,即有环是死锁的必要不充分条件。
死锁出现时,一定出现以下四个条件,但出现以下四个条件不一定发生死锁:
系统忽略死锁是因为检查并避免死锁的代价太大,因此忽略并让应用程序(程序员)保证不会发生死锁。
死锁预防(Deadlock Prevention)至少会打破死锁的四个必要条件中的一个,以确保系统不会进入死锁状态。
打破互斥:共享资源不是必须的,必须占用非共享资源
打破持有并等待:必须保证当一个进程请求的资源拿不到时,它不再持有任何其他资源
打破无抢占:进程可以抢占其他进程的资源,如何抢占?比如 kill 掉这个进程(暴力了哈)
打破循环等待:对所有资源类型进行排序,并要求每个进程按照资源的递增顺序进行申请(这样就不会产生循环了)
死锁避免 需要系统具有一些额外的先验信息提供。
最简单有效的先验信息获取方法是:要求每个 进程声明 它可能需要的每个类型资源的最大数目。
资源的分配状态是通过 限定提供与分配 的资源数量以及进程的最大需求量。
死锁避免 算法动态检查 的资源分配状态,以确保永远不会出现一个环形等待状态。
当一个进程请求可用资源时,系统必须判断立即分配是否能使系统处于安全状态。
系统处于安全状态是指:针对所有进程存在一个安全有序序列 {P1, P2, …, Pj, …, Pi, …, Pn}。针对每个 Pi 要求的资源,能够由当前可用的资源 + 所有 Pj 持有的资源来满足。
如果系统处于安全状态:无死锁,处于不安全状态:可能死锁。避免死锁:确保系统永远不会进入不安全状态。