在多任务系统中,某些异常情况会阻止执行进程或线程的进度。我将这两个进程和线程简称为“进程”。其中两个条件称为死锁和实时锁定。
前者指的是相互阻塞的进程,从而阻止执行。后者指的是阻止彼此前进的过程,但实际上并不阻止执行。例如,他们可能会不断地让对方回滚交易,也无法完成交易。
另一种情况称为资源饥饿,其中进程进展所需的一个或多个有限资源已被其耗尽,除非进程进展,否则无法恢复。这也是活锁的一个特例。
我想知道是否有任何其他定义,特别是学术定义,对于“饥饿”,不仅限于“资源饥饿”。特别欢迎参考文献。
而且,不,这不是家庭作业。 : - )
答案 0 :(得分:56)
想象一下,你正在排队购买餐馆的食物,孕妇优先考虑。而且只有一大堆孕妇一直到来。
你很快就会挨饿。 ;)
现在想象一下你是一个低优先级的过程,孕妇是优先考虑的过程。 =)
答案 1 :(得分:30)
我不会说资源饥饿是活锁的特例。一般:
在活锁中,没有任何线程可以继续进行,但它们会继续执行。 (陷入僵局,他们甚至不继续执行)
当饥饿时,某些线程正在取得进展,而某些线程没有执行。
一个很好的解释: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)
有关详情,我全心全意地推荐信息量小书(免费):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)
流程不会长时间获取资源或资源。这不是死锁,因为一个进程运行没有问题。 老化可用于解决此问题,每个请求都使用老化因子。