饥饿和死锁
饥饿和死锁是当需要资源的进程被延迟很长时间时发生的情况。但是它们是截然不同的概念。
关于饥饿和死锁的详细信息如下所示:
饥饿
如果一个进程被无限期地推迟,就会发生饥饿。如果进程需要一个执行所需的资源,但从未分配给它,或者由于某种原因从未为该进程提供处理器,则可能会发生这种情况。
饥饿的一些常见原因如下:
- 如果由于资源分配决策错误,一个进程从未获得执行所需的资源,则可能发生饥饿。
- 如果高优先级进程持续独占处理器,则低优先级进程可能永远等待。
- 如果资源不足以满足每个进程的需求,则可能发生饥饿。
- 如果使用随机进程选择,则由于未被选中,一个进程可能会等待很长时间。
可以在系统中实现的一些用于处理饥饿的解决方案如下:
- 可以使用独立的管理器来分配资源。此资源管理器公平地分配资源并试图避免饥饿。
- 应避免随机选择进程进行资源分配或处理器分配,因为它们会助长饥饿。
- 资源分配的优先级方案应包含诸如老化之类的概念,其中进程的优先级随着其等待时间的增加而增加。这可以避免饥饿。
死锁
当两个或多个进程需要某些资源来完成其执行,而这些资源被其他进程持有时,就会发生死锁。
在上图中,进程 1 持有资源 1 并需要获取资源 2。同样,进程 2 持有资源 2 并需要获取资源 1。进程 1 和进程 2 处于死锁状态,因为它们各自都需要对方的资源才能完成其执行,但它们都不愿意释放其资源。
只有当四个 Coffman 条件都成立时,才会发生死锁。这些条件不一定是互斥的。它们如下所示:
- 互斥
互斥意味着应该有一个资源,一次只能由一个进程持有。这意味着资源应该是不可共享的。
- 持有并等待
一个进程可以持有多个资源,并且仍然可以向持有这些资源的其他进程请求更多资源。
- 不可抢占
资源不能被强制从进程中抢占。进程只能自愿释放资源。
- 循环等待
一个进程正在等待第二个进程持有的资源,而第二个进程正在等待第三个进程持有的资源,依此类推,直到最后一个进程正在等待第一个进程持有的资源。这形成了一个循环链。
广告