死锁
死锁
死锁的概念
死锁、饥饿、死循环的区别
死锁产生的必要条件
什么时候会发生死锁
死锁处理的策略
死锁的处理策略–预防死锁
破坏互斥条件
- 并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件。
破坏不剥夺条件
破坏请求和保持条件
- 可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源。
- 缺点:有些资源可能只需要用很短的事件,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。
破坏循环等待条件
- 可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。
- 原理分析:一个进程只有占有小编号的资源时,才有资格申请更大的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。
- 缺点:
- 不方便增加新的设备,因为可能需要重新分配所有的编号。
- 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费。
- 必须按规定次序申请资源,用户编程麻烦。
死锁的处理策略–避免死锁(银行家算法)
安全序列、不安全序列、死锁的联系
- 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全状态可以有多个。
- 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
- 如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)。
- 因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。
银行家算法
死锁的检测和解除
死锁的检测
死锁的解除
题目总结
- 死锁避免是指在资源动态分配过程中用某些算法加以限制,防止系统进入不安全状态从而避免死锁的发生。
- 资源有序分配策略可以限制循环等待条件的发生。
- 解除死锁的方法有:
- 剥夺资源法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。
- 撤销进程法:强制撤销部分甚至全部死锁进程并剥夺这些进程的资源
- 资源有序分配算法为死锁预防策略。
- 多道程序技术要求进程间能实现并发,需要实现进程调度以保证CPU的工作效率,而并发性的实现需要中断功能的支持。
- 进程指向资源的有向边称为申请边,资源指向进程的有向边称为分配边。矩形框表示资源,其中的圆点表示资源的数目。圆圈结点表示进程。
- 死锁的四个必要条件中,无法破坏的是资源互斥,也就是说,在任何时候,每个资源只能被一个进程占用。由于资源的本质是稀缺的,资源只能供一个进程独占,因此互斥是无法破坏的。
- 死锁定理是用于检测死锁的方法。
- 银行家算法是避免死锁的算法,用于计算动态资源分配的安全性以避免系统进入死锁状态,不能用于判断系统是否处于死锁。
- 在死锁的检测和解除中,系统为进程分配资源时不采取任何措施,但提供死锁的检测和解除手段。
- 在多进程的并发系统中,肯定不会因竞争CPU而产生死锁。死锁通常发生在多个进程竞争有限的非抢占资源时,而CPU是一种抢占资源,可以从一个进程中抢占并分配给另一个进程。
死锁
https://lzyjx.github.io.git/2023/05/13/死锁/