什么是饥饿?

时间:2009-07-22 01:22:36

标签: theory multitasking

在多任务系统中,某些异常情况会阻止执行进程或线程的进度。我将这两个进程和线程简称为“进程”。其中两个条件称为死锁和实时锁定。

前者指的是相互阻塞的进程,从而阻止执行。后者指的是阻止彼此前进的过程,但实际上并不阻止执行。例如,他们可能会不断地让对方回滚交易,也无法完成交易。

另一种情况称为资源饥饿,其中进程进展所需的一个或多个有限资源已被其耗尽,除非进程进展,否则无法恢复。这也是活锁的一个特例。

我想知道是否有任何其他定义,特别是学术定义,对于“饥饿”,不仅限于“资源饥饿”。特别欢迎参考文献。

而且,不,这不是家庭作业。 : - )

6 个答案:

答案 0 :(得分:56)

想象一下,你正在排队购买餐馆的食物,孕妇优先考虑。而且只有一大堆孕妇一直到来。

你很快就会挨饿。 ;)

现在想象一下你是一个低优先级的过程,孕妇是优先考虑的过程。 =)

答案 1 :(得分:30)

我不会说资源饥饿是活锁的特例。一般:

  • 在活锁中,没有任何线程可以继续进行,但它们会继续执行。 (陷入僵局,他们甚至不继续执行)

  • 当饥饿时,某些线程正在取得进展,而某些线程没有执行。

一个很好的解释:http://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html。但我理解术语的选择可能会有所不同。

当谈到饥饿时,我听到的定义是:

假设可以指定与假设(信号量语义,OS调度程序行为......)一致的无限执行路径(交错),使得线程T暂停等待某些资源并且从不恢复,即使它是可能的无数次。然后T被称为饥饿。

但这种做法并不符合。假设两个线程在无限循环中执行批评部分。您的同步代码允许第一个线程每小时进入一次评论部分。它饿死了吗?两个线程都被允许进展,但第一个线程正在缓慢地进行其工作。

最简单的饥饿来源是弱信号量。如果您正在使用行为相似的同步原语(或构建自己的原语),那么将导致饥饿。

众所周知饥饿的经典问题:

有关详情,我全心全意地推荐信息量小书(免费):http://www.greenteapress.com/semaphores/

您在询问是否每次饥饿都是由等待某些资源引起的。我会说 - 是的。

线程可以暂停:

(1)对某些阻塞系统调用 - 等待/获取互斥锁,信号量,条件变量; write(),poll()等。

(2)关于一些非阻塞操作 - 比如执行计算。

饿死(1)正在匮乏资源(互斥,缓冲等)。

饿死(2)在CPU上挨饿 - 您可以将其视为资源。如果它发生,问题在于调度程序。

HTH

答案 2 :(得分:12)

在讨论优先级调度算法时,通常会出现饥饿或“无限期阻塞”的另一个领域。优先级调度算法有可能使某些低优先级进程无限期地等待。稳定的高优先级流程可以阻止低优先级流程运行。

在优先级调度程序的情况下,解决方案是“老化”。老化是逐步提高在系统中等待很长时间的进程优先级的技术。

答案 3 :(得分:7)

即使系统没有死锁,Starvation也只是在没有服务进程或服务时。

这是我刚刚为澄清目的而编写的一个例子。

想象一种控制计算机访问WAN或类似内容的算法。此算法可能有一个策略,说“提供对使用较少带宽的计算机的优先权访问。”,这似乎是一个正确的策略,但是当一台计算机想要访问网络进行ftp上传时会发生什么在某处发送几GB。仅凭此策略,该计算机将会饿死,因为该算法永远不会选择该计算机,因为总会有其他计算机请求更小的带宽使用。

这叫做饥饿。

答案 4 :(得分:1)

工作也是一种资源。当生产者 - 消费者设置中的工作分配不公平(或理想)时,某些线程可能无法获得足够的工作项来保持它们一直处于忙碌状态。

答案 5 :(得分:0)

流程不会长时间获取资源或资源。这不是死锁,因为一个进程运行没有问题。 老化可用于解决此问题,每个请求都使用老化因子。