题
在多重任务的系统,一些异常情况,防止进展的执行进程或螺纹。我会提到这两个进程和线只是作为"过程"。这两个条件是所谓的死锁和活锁。
前者是指进程,这是阻止彼此,因而防止无论是从执行。后者是指进程,防止每一个其他进展,但实际上并不阻止执行。例如,他们可能会不断地造成彼此的回滚交易,既不是永远能够完成它们。
另一种情况被称为资源匮乏,其中的一个或多个有限资源,需要所取得的进展的进程,已经耗尽,由它们并不能恢复,除非该进程取得进展。这也是一个特殊的情况下生活锁。
我想知道是否有任何其他定义,特别是学之一,对于"饥饿"这不限于"资源饥饿".参考文献特别值得欢迎的。
而且,不,这不是家庭作业。:-)
解决方案
我不会说的资源,饥饿是一种特殊情况的一个活锁.通常为:
在一个活锁,无线取得进展,但他们继续执行。(在的僵局,他们甚至不保持执行)
当饥饿,一些螺纹(s)做得进展和一些线(s)没有执行。
一个很好的解释: http://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html.但我理解的选择的术语可能有所不同。
当涉及到饥饿、定义我听到的是:
假设是,可以指定的一个无限的路径的执行(交错)符合的假设(semaphore义、操作系统的调度程序的行为...)这样的,thread 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(),调查()等。
(2)在一些非运作状进行计算。
饥饿在(1)是饿的在资源(互斥、缓冲器等)。
饥饿在(2)是饿的在中央处理器-你能把它作为一个资源。如果发生这种情况,问题是调度程序。
禾田
其他提示
想象一下,你在一个队列是在餐厅,为此,孕妇可优先购买食物。还有的只是一大堆到达所有的时间孕妇。
您很快就会挨饿。 ;)
现在想象你是一个低优先级的进程和孕妇优先级较高的。 =)
其中饥饿或“不定阻塞”谈论优先级调度算法时通常出现的另一个领域。优先级调度算法留下一些低优先级的进程无限期等待的可能性。较高优先级进程的源源不断可以防止以往获得运行低优先级进程。
在优先调度的情况下,溶液是“老化”。老化是逐渐增加的,在该系统等待很长的时间进程的优先级的技术。
饥饿是简单地当一个进程或服务没有被服务,即使当在系统上没有死锁。
这是我刚由只为清楚的目的的例子。
设想一下,控制计算机访问WAN或类似的东西的算法。该算法可以有一个说,一个政策“提供给那些将使用更少的带宽电脑优先通行。”,那将似乎是一个正确的政策,但后来发生了什么,当一台计算机需要访问网络的FTP上传将地方送几个GB。单独使用此政策,该计算机会饿死,因为算法绝不会选择计算机,以后还会有其他的总要求电脑较小的带宽使用率。
这就是所谓的饥饿。
工作也是一种资源的。当在生产者 - 消费者设置的工作分配是不公平的(或理想),某些线程可能得不到足够的工作项,以使他们忙碌所有的时间。
有一个过程并没有得到资源或资源更长的时间。这不是一个僵局,因为一个S过程没有问题运行/。 老化可以被用来解决这个问题,一个老化因子用于每个请求。