操作系统 饥饿和老化
通常,饥饿发生在 优先级调度 或 最短作业优先调度 中。在优先级调度技术中,我们为每个进程分配一定的优先级,并根据该优先级分配CPU,执行该进程。在这里,CPU将分配给优先级最高的进程。即使爆发时间很短,CPU也会分配给优先级最高的进程。
饥饿对操作系统中的进程来说是非常不利的,但我们可以通过老化来解决这个饥饿问题。
什么是饥饿
饥饿 或不确定阻塞是与优先级调度算法相关的现象。在就绪状态下具有低优先级的进程因为其他具有更高优先级的进程在到期处理时间内到来而等待CPU分配。较高优先级的进程可以阻止低优先级进程获得CPU。
例如,以上的图像处理过程比其他进程更早获得CPU。我们可以想象一种情况,只有一个进程具有非常低的优先级(例如127),而我们给予其他进程高优先级。这可能导致低优先级的进程无限期等待CPU,从而导致 饥饿 。
饥饿的原因
操作系统中饥饿的常见原因如下:
- 当发生饥饿时,资源不足,进程的优先级开始降低。
- 如果高优先级进程不断垄断处理器,那么优先级较低的进程可能会永远等待。由于低优先级程序不与任何东西交互,饥饿无法引起死锁。
- 如果使用随机选择的进程,则某个进程可能会因为未被选择而长时间等待。
- 饥饿是摆脱死锁的一个安全方法,因此它对整个系统的影响变得更加重要。
- 如果由于错误的资源分配决策而永远不为进程提供其执行所需的资源,可能会发生饥饿。
- 如果没有足够的资源按需分配给每个进程,可能会发生饥饿。
应对饥饿的解决方案
可以在系统中实施的一些解决方案来处理饥饿,如下所示:
- 可以使用独立的资源管理器来进行资源分配。该资源管理器公平地分配资源并尽量避免饥饿。
- 应避免随机选择进程进行资源分配或处理器分配,因为它们会鼓励饥饿。
- 资源分配的优先级方案应包括老化(Aging)等概念,其中进程的等待时间越长,其优先级越高,这样可以避免饥饿。
饥饿与死锁的区别
以下是操作系统中死锁和饥饿之间的一些区别,例如:
- 当集合中的进程由于某些其他进程占用所需资源而无法继续进行时,就会发生死锁,如下图所示。另一方面,当进程无限期等待获取所需资源时,就会发生饥饿。
- 死锁的另一个名称是 循环等待 。而饥饿的另一个名称是 活锁 。
- 发生死锁时,没有进程可以继续进行,而在饥饿状态下,除受害进程外,其他进程可以继续进行或进行。
什么是操作系统中的老化
在操作系统中,老化是一种用于避免饥饿的调度技术。固定优先级调度是一种调度纪律,其中排队等待利用系统资源的任务被分配每个优先级。高优先级任务被允许在低优先级任务之前访问特定系统资源。
老化是一种逐渐增加等待时间的进程优先级(通过时间片),随着时间的推移,低优先级进程会变成高优先级进程。
该方法的一个缺点是,当排队的高优先级任务很多时,具有较低优先级的任务可能会被饥饿。通过老化(Aging)来逐渐增加任务的优先级,基于其在就绪队列中的等待时间。
问题
在基于优先级的调度算法中,一个主要问题是无限阻塞或饥饿。一个准备运行但等待CPU的进程可以被认为是被阻塞的。优先级调度算法可能会让一些低优先级的进程无限等待。高优先级进程的持续流进可以阻碍低优先级进程获得CPU使用权。
老化的示例
假设一个优先级范围为0-512的系统。在该系统中,0表示最高优先级。
- 增加进程 如果优先级范围从127(低)到0(高),我们可以每15分钟将等待进程的优先级增加1。最终,即使初始优先级为127的进程也不会超过32小时,才会到达优先级为0的过程。
- 降低进程 如果进程P在0分钟时具有优先级数为127,然后每15分钟(时间片),将进程P的优先级数降低1。因此,15分钟后,进程P的优先级将为126。再15分钟后,降低进程P的优先级数1。因此,30分钟后,进程P的优先级将变为125,此过程将继续。当优先级数接近0时,进程P将成为高优先级进程,并且进程P将在很长时间后获得CPU以进行执行。
老化的用途
老化用于确保具有较低优先级的作业最终完成其执行。这种技术可以用于减少低优先级任务的饥饿现象。有许多实现老化的方法,但所有方法都有一个共同的原则,即进程在就绪队列中等待时优先级应增加。优先级的增加可能与进程的等待时间相等也可能不相等。