什么是死锁?
死锁是当任何进程进入等待状态时在OS中发生的情况,因为另一个等待进程正在保存所需的资源。死锁是多进程中的常见问题,其中多个进程共享一种特定类型的互斥资源,称为软锁或软件。
死锁示例
- 现实世界中的案例是汽车流量,它仅朝一个方向行驶。
- 这个案例中,桥被视为资源,大家都需要通过桥。
- 因此,当发生死锁时,如果让一辆汽车排队等待,则可以轻松解决(抢先资源和回滚)。
- 如果发生死锁情况,可能必须多排队几辆汽车。
- 因此排队饥饿是可能发生的。
什么是循环等待?
一个进程正在等待第二个进程持有的资源,它也在等待第三个进程等持有的资源。这将一直持续到最后一个进程正在等待第一个进程持有的资源为止。这将创建一个圆形链。
例如,在向进程A请求资源A时为其分配了资源B。以同样的方式,向进程B分配了资源A,并且正在请求资源B。这将创建一个循环等待循环。
循环等待的示例
例如,一台计算机具有三个USB驱动器和三个进程。这三个进程中的每个进程都可以容纳一个USB驱动器。因此,当每个进程请求另一个驱动器时,这三个进程将处于死锁状态,因为每个进程将等待当前正在使用的USB驱动器释放。这将导致循环链。
循环等待示例
死锁检测
资源调度程序可以检测到发生死锁。资源调度程序可帮助OS跟踪分配给不同进程的所有资源。因此,当检测到死锁时,可以使用以下给出的方法解决死锁:
防止死锁:
防止死锁发生之前,这一点很重要。系统在执行每个事务之前都会对其进行检查,以确保它不会导致死锁情况。这样一来,即使很小的变化都会死掉,以至于将来可能导致死锁的操作也永远不会允许进程执行。
这是确保至少一个条件不能成立的一组方法。
没有先发制人的行为:
无抢占-资源只能由持有该资源的进程在完成其任务后自动释放
- 如果持有某些资源的进程请求另一个不能立即分配给它的资源,在这种情况下,所有资源都将被释放。
- 抢占资源需要正在等待的进程的资源列表。
- 仅当该进程可以重新获得其旧资源和所请求的新资源时,它才会重新启动。
- 如果该进程正在请求其他资源,则该资源可用时,会将其提供给请求进程。
- 如果它由等待其他资源的另一个进程持有,我们将其释放并将其交给请求进程。
互斥:
互斥是互斥体的完整形式。它是一种特殊的二进制信号量,用于控制对共享资源的访问。它包括优先级继承机制,以避免扩展优先级反转问题。它允许将当前优先级较高的任务在尽可能短的时间内保持在阻止状态。
诸如只读文件之类的共享资源永远不会导致死锁,但是诸如打印机和磁带驱动器之类的资源需要通过单个进程进行独占访问。
保持并等待:
在这种情况下,必须停止进程保留单个或多个资源,同时等待一个或多个其他资源。
循环等待:
它强加了所有资源类型的总排序。循环等待还要求每个进程以递增的顺序请求资源。
避免死锁
最好避免死锁,而不要在死锁发生后立即采取措施。它需要其他信息,例如应如何使用资源。避免死锁是每个进程声明其可能需要的每种类型的最大资源数的最简单,最有用的模型。
回避算法
避免死锁算法可帮助您动态评估资源分配状态,从而永远不会出现循环等待的情况。
资源类型的单个实例。
- 使用资源分配图
- 周期对于死锁是必要的
资源类型的多个实例。
- 周期对于死锁是必要的,但永远不足。
- 使用银行家的算法
饥饿与僵局之间的区别
这是死锁和饥饿之间的一些重要区别:
僵局 | 饥饿 |
---|---|
当其中一个进程被阻塞时,就会发生死锁情况。 | 饥饿是所有低优先级进程都被阻塞,而高优先级进程执行的情况。 |
死锁是一个无限的过程。 | 饥饿是一个漫长的等待,但不是一个无限的过程。 |
每个死锁总是饥饿。 | 每个饥饿都不一定有僵局。 |
发生死锁,然后互斥,保持并等待。在此,抢占和循环等待不会同时发生。 | 它的发生是由于不受控制的优先级和资源管理。 |
死锁的优点
这是使用死锁方法的优点/好处
- 这种情况适用于执行单个活动突发的流程
- 死锁无需抢先。
- 应用于状态易于保存和恢复的资源的便捷方法
- 可以通过编译时检查来强制执行
- 由于在系统设计中解决了问题,因此无需运行时计算
死锁方法的缺点
这是使用死锁方法的利弊
- 延迟流程启动
- 流程必须知道未来的资源需求
- 抢先次数多于必要
- 禁止增量资源请求
- 固有的抢占损失。
概要:
- 死锁定义:当任何进程进入等待状态时,由于另一个等待进程持有所需资源,这是OS中发生的情况
- 当一个进程正在等待第二个进程持有的资源时,也正在等待第三个进程等持有的资源时,发生循环等待。
- 资源调度程序可以检测到发生死锁。
- 防止死锁发生之前,这一点很重要。
- 只有在资源完成任务后,该进程才能自动释放该资源。
- 互斥是互斥体的完整形式。它是一种特殊的二进制信号量,用于控制对共享资源的访问。
- 保持并等待是一种条件,必须使进程停止等待单个或多个资源,同时等待一个或多个其他资源。
- 避免死锁是每个进程声明其可能需要的每种类型的最大资源数的最简单,最有用的模型。
- 避免死锁算法可帮助您动态评估资源分配状态,从而永远不会出现循环等待的情况。
- 死锁是一个无限的过程,而饥饿是一个漫长的等待,但不是一个无限的过程。