先发制人的调度会导致饥饿吗?

时间:2015-03-20 03:28:56

标签: java operating-system

这对我来说有点违反直觉。是不是已经进行了抢占式调度,以便所有进程都可以获得cpu的份额?那么这个调度方案下会有饥饿吗?如果是这样,怎么样?

此外,有人可以展示一个简单的伪代码,告诉我如何编写代码,以显示工作中的饥饿属性。

3 个答案:

答案 0 :(得分:3)

先发制人的安排会导致饥饿吗?

是的,先发制人的安排可能会导致饥饿。

让我们看看最长的剩余时间第一个方案。这是先发制人的安排。在任何时间点,如果任何具有更大执行时间或更长剩余时间的进程到达,处理器将切换到该进程暂停当前正在进行的进程。对于执行时间较短的进程,会发生进程饥饿。

有时候,先发制人的计划不会导致饥饿。

让我们以循环调度算法为例。 Round Robin算法是一种先发制人的算法,因为调度程序会在时间配额到期后强制进程退出CPU。

与SJF或SRTF不同,处理器不会停留在任何进程中。就像一个永无止境的过程不会结束,但其他过程仍然会运行。所以它解决了饥饿问题。

关于循环算法的更多细节:http://en.wikipedia.org/wiki/Round-robin_scheduling

RR算法的实施:Implementing round robin scheduling algorithm in Java

如果您有任何进一步的查询,请进行评论。

谢谢,

Bhavik

答案 1 :(得分:1)

先发制人的调度只意味着现在正在运行的任何东西都可以停止运行其他东西。强调可以停止。它可能永远不会停止,也可能永远不会停止运行。 正如您所问,我将尝试描述可能导致饥饿的抢占式调度算法的伪代码:

P = running processes list q = quantum while P is not empty: t_0 <- infinity for each p in P: t <- p.totalTime if t < t_0: t_0 <- t p <- process with running time t_0 run p for quantum q

现在假设可以随时将进程添加到列表P.如果你继续添加小进程,它们将始终在任何其他大进程之前执行,从而导致饥饿。

该算法是SJF(最短作业优先)的先发制人形式。你可以推断并制作一个只是从不运行给定过程的先发制人算法;相反,如果这是剩下的唯一进程,则算法只是在循环中等待,直到出现新的东西。它不是一个好的算法,但它是先发制人并导致饥饿。

实际上,如果你停下来思考,你唯一可以获得饥饿的方法就是先发制人的计划。你不能在非抢先计划中获得饥饿,因为它们都会一直运行到最后,你无法添加任何工作。抢先式计划实际上并不是为所有进程提供CPU的份额,而是为了使您的系统更强响应。因此,智能抢占方案是一种通过不给予I / O有限进程太多关注来增加响应性的方案,例如在等待某些输入时停止它们。

答案 2 :(得分:0)

抢占式调度是指进程从运行状态切换到就绪状态,或者从等待状态切换到就绪状态。

有关更多详细信息,请查看:https://www.geeksforgeeks.org/preemptive-and-non-preemptive-scheduling

让我们以优先级调度(抢占式)为例,在这种调度中,先是高优先级进程到达,然后是运行进程,然后是高优先级进程获得对cpu的访问权,而低优先级进程则从运行状态切换到等待状态。较低优先级的进程可能不会从等待状态切换到运行状态,因为每当较高优先级的进程到达时,它都会访问cpu。因此,较低优先级的进程可能在任何时间都不会执行,这称为饥饿。 >

在最短的剩余时间中,首先执行相对于具有较高突发时间的进程而言具有较低突发时间(cpu访问时间)的进程。每当具有较低突发时间的进程到达时,如果当前正在运行的进程具有较高的突发时间,则当前正在运行的进程从运行状态切换到等待状态,而具有较小突发时间的进程切换到运行状态。在这种情况下,具有较高突发时间的进程有可能不会执行或不从等待状态切换到运行状态,这称为饥饿。

饥饿意味着进程不得不由于另一个进程而无限期地等待。并且从上述情况我们可以看出,某些进程由于另一个进程而必须等待,因此,这就是抢先式调度可能导致饥饿的原因。