Dan*_*ral 42 theory multitasking
在多任务系统中,某些异常情况会阻止执行进程或线程的进度.我将这两个进程和线程简称为"进程".其中两个条件称为死锁和活锁.
前者指的是相互阻塞的进程,从而阻止了执行.后者指的是阻止彼此前进的过程,但实际上并不阻止执行.例如,他们可能会不断地让对方回滚交易,也无法完成它们.
另一个条件被称为资源饥饿,其中进程进展所需的一个或多个有限资源已被其耗尽,并且除非进程进展,否则无法恢复.这也是活锁的一个特例.
我想知道是否有任何其他定义,特别是学术定义,对于"饥饿",不仅限于"资源饥饿".特别欢迎参考文献.
而且,不,这不是功课.:-)
Sam*_*ijo 63
想象一下,你正在排队购买餐厅的食物,孕妇优先考虑.而且只有一大堆孕妇一直到来.
你很快就会挨饿.;)
现在想象你是一个低优先级的过程,孕妇是优先考虑的过程.=)
sdc*_*vvc 31
我不会说资源饥饿是活锁的一个特例.通常:
在一个活锁中,没有线程可以取得进展,但它们会继续执行.(在僵局中,他们甚至不继续执行)
当饥饿时,一些线程正在进行并且一些线程没有执行.
一个很好的解释:http://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html.但我理解术语的选择可能会有所不同.
当谈到饥饿时,我听到的定义是:
假设可以指定与假设(信号量语义,OS调度程序行为......)一致的无限执行路径(交错),使得线程T暂停等待某些资源并且从不恢复,即使它可能无限次多次.然后T被称为饥饿.
但这种做法并不符合这一点.假设两个线程在无限循环中执行批评部分.您的同步代码允许第一个线程每小时进入一次评论部分.它饿死了吗?两个线程都被允许进展,但第一个线程正在缓慢地进行其工作.
最简单的饥饿来源是弱信号量.如果您正在使用行为相似的同步原语(或构建自己的原语),则会导致饥饿.
众所周知饥饿的经典问题:
读者 - 作家问题.可以同步线程,使得(1)读者能够使作者饿死(2)作者将能够使读者饿死(3)不会发生饥饿(参见http://en.wikipedia. org/wiki/Readers-writers_problem)
餐饮哲学家(http://en.wikipedia.org/wiki/Dining_philosophers_problem)
有关详细信息,我衷心推荐The Semaphores(免费):http://www.greenteapress.com/semaphores/.
你在问每个饥饿是否是由等待一些资源造成的.我会说 - 是的.
线程可以暂停:
(1)在某些阻塞系统调用上 - 等待/获取互斥锁,信号量,条件变量; write(),poll()等
(2)关于某些非阻塞操作 - 如执行计算.
在(1)上饿死正在匮乏资源(互斥,缓冲等).
在(2)上挨饿是在CPU上挨饿 - 你可以将它视为一种资源.如果它发生,问题在于调度程序.
HTH
Uma*_*air 12
在讨论优先级调度算法时,通常会出现饥饿或"无限期阻塞"的另一个领域.优先级调度算法有可能使某些低优先级进程无限期地等待.稳定的优先级较高的进程可以防止低优先级进程运行.
在优先级调度程序的情况下,解决方案是"老化".老化是逐渐增加在系统中等待很长时间的进程的优先级的技术.
即使系统上没有死锁,Starvation也只是在没有服务进程或服务时.
这是我刚刚为澄清目的而编写的一个例子.
想象一下,一种控制计算机访问WAN等算法的算法.此算法可能有一个策略,说"提供对使用较少带宽的计算机的优先权访问.",这似乎是一个正确的策略,但是当一台计算机想要访问网络进行ftp上传时会发生什么在某处发送几GB.仅凭此策略,该计算机将会饿死,因为该算法永远不会选择该计算机,因为总会有其他计算机请求更小的带宽使用.
这被称为饥饿.