僵局 Opera系统:什么是循环等待(示例)

什么是死锁?
僵局 这种情况发生在 操作系统 当一个进程因为另一个等待进程占用了所需的资源而进入等待状态时,就会发生死锁。死锁是多处理中常见的问题,其中多个进程共享一种互斥的资源,这种资源被称为软锁或软件锁。
当发生死锁时,所有相关进程都无法继续运行,因此受影响的工作会停止,直到操作系统介入。
死锁示例
- 现实世界中的例子就是单向行驶的交通。
- 在这里,桥梁被视为一种资源。
- 因此,当发生死锁时,可以通过一辆车倒车(抢占资源并回滚)来解决。
- 如果出现死锁情况,可能需要几辆车倒车。
- 所以,饥荒是有可能发生的。
死锁示例
什么是循环等待?
一个进程正在等待第二个进程持有的资源,而第二个进程又在等待第三个进程持有的资源,以此类推。这种情况一直持续到最后一个进程正在等待第一个进程持有的资源为止。这就形成了一个循环链。
例如,进程 A 在请求资源 A 时被分配了资源 B。同样,进程 B 在请求资源 B 时也被分配了资源 A。这就形成了一个循环等待。
循环等待示例
例如,一台计算机有三个U盘和三个进程。这三个进程分别占用一个U盘。因此,当每个进程请求使用另一个U盘时,就会出现死锁,因为每个进程都在等待当前正在使用的U盘被释放。这就形成了一个循环锁。
循环等待示例
操作系统中的死锁检测
资源调度器可以检测到死锁的发生。资源调度器帮助操作系统保持资源稳定运行。 track 是分配给不同进程的所有资源的总和。一旦检测到死锁,可以通过抢占资源、回滚进程或终止一个或多个死锁进程来解决。
操作系统中的死锁预防
预防死锁至关重要。系统会在执行每个事务之前进行检查,确保其不会导致死锁。即使是将来可能导致死锁的小操作,也绝不会被允许执行。
死锁预防是一系列确保四个必要条件中至少一个无法成立的方法。
无抢占
只有持有该资源的进程在完成其任务后,才能自愿释放该资源。
- 如果一个进程正在占用一些资源,而该进程请求的另一个资源无法立即分配给它,则该进程的所有资源都将被释放。
- 被抢占的资源会被添加到进程正在等待的资源列表中。
- 只有当进程能够重新获得其旧资源以及它正在请求的新资源时,该进程才会重新启动。
相互排斥
互斥(Mutual Exclusion)是互斥锁(Mutex)的全称。它是一种特殊的二进制互斥锁。 信号 它用于控制对共享资源的访问。它包含一个优先级继承机制,以避免长时间的优先级反转问题,并尽可能缩短高优先级任务的阻塞时间。
共享资源(例如只读文件)永远不会导致死锁,但打印机和磁带驱动器等资源需要单个进程独占访问。
持有并等待
在这种情况下,必须停止进程占用一个或多个资源,同时等待一个或多个其他资源。
循环等待
这种方法强制所有资源类型遵循完全有序的顺序。循环等待预防还要求每个进程按照枚举递增的顺序请求资源。
避免死锁 Algorithms
与其在死锁发生后才采取行动,不如防患于未然。避免死锁需要额外的信息,例如资源的使用方式。死锁避免模型是一种有效的方法,其中每个进程声明其可能需要的每种类型资源的最大数量。
躲避 Algorithms
死锁避免算法动态评估资源分配状态,从而避免出现循环等待的情况。
对于资源类型的单个实例:
- 使用资源分配图。
- 图中的环是导致死锁的必要且充分条件。
对于同一资源类型的多个实例:
- 循环是导致死锁的必要条件,但并非充分条件。
- 使用 银行家算法.
饥饿和死锁之间的区别
以下是死锁和饥饿之间的一些重要区别:
| 僵局 | 饥饿 |
|---|---|
| 当其中一个进程被阻塞时,就会发生死锁情况。 | 饥饿是指所有低优先级进程都被阻塞,而高优先级进程却能执行的情况。 |
| 死锁是一个无限的过程。 | 饥饿是一段漫长的等待,但并非无限的过程。 |
| 任何死锁都必然伴随着饥饿现象。 | 并非每次饥荒都会陷入僵局。 |
| 死锁是由互斥、持有等待、无抢占和循环等待同时发生引起的。 | 这是由于优先级排序混乱和资源管理不善造成的。 |
死锁的优点
以下是使用死锁处理方法的优点:
- 这种情况适用于执行单次突发活动的进程。
- 死锁不需要抢占。
- 对于状态可以轻松保存和恢复的资源,这是一种便捷的方法。
- 可以通过编译时检查来强制执行。
- 由于问题在系统设计中已经解决,因此无需运行时计算。
死锁的缺点
以下是使用死锁处理方法的缺点:
- 它会延迟流程启动。
- 流程必须提前了解其未来的资源需求。
- 它抢占先机的次数比必要的要多。
- 它不允许递增资源请求。
- 它存在固有的抢占损失。


