什么是饥饿?

Dan*_*ral 42 theory multitasking

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

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

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

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

而且,不,这不是功课.:-)

Sam*_*ijo 63

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

你很快就会挨饿.;)

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

  • 荒谬但最好的解释 (9认同)

sdc*_*vvc 31

我不会说资源饥饿是活锁的一个特例.通常:

  • 在一个活锁中,没有线程可以取得进展,但它们会继续执行.(在僵局中,他们甚至不继续执行)

  • 当饥饿时,一些线程正在进行并且一些线程没有执行.

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

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

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

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

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

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

有关详细信息,我衷心推荐The Semaphores(免费):http://www.greenteapress.com/semaphores/.

你在问每个饥饿是否是由等待一些资源造成的.我会说 - 是的.

线程可以暂停:

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

(2)关于某些非阻塞操作 - 如执行计算.

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

在(2)上挨饿是在CPU上挨饿 - 你可以将它视为一种资源.如果它发生,问题在于调度程序.

HTH


Uma*_*air 12

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

在优先级调度程序的情况下,解决方案是"老化".老化是逐渐增加在系统中等待很长时间的进程的优先级的技术.


Fre*_*ddy 7

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

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

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

这被称为饥饿.