在多任务系统中,某些异常情况会阻止执行进程或线程的进度。我将把进程和线程简称为“进程”。这些条件中的两个称为死锁和 Activity 锁。
前者是指相互阻塞的进程,因此阻止了两者的执行。后者是指互相阻止进度但实际上不阻止执行的进程。例如,它们可能会不断导致彼此回滚事务,而这两个事务都无法完成。
另一种情况称为资源匮乏,其中过程的进度所需要的一个或多个有限资源已被它们耗尽,除非进程继续进行,否则无法恢复。这也是活锁的一种特殊情况。
我想知道对于“饥饿”是否还有其他定义,特别是学术上的定义,而不仅限于“资源饥饿”。特别欢迎引用。
而且,不,这不是功课。 :-)
最佳答案
我不会说资源匮乏是活锁的特例。通常:
很好的解释: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://www.greenteapress.com/semaphores/。
您在问是否每个饥饿都是由等待某些资源引起的。我会说-是的。
线程可以被挂起:
(1)在某些阻塞的系统调用上-等待/获取互斥量,信号量,条件变量; write(),poll()等。
(2)在一些非阻塞操作上-例如执行计算。
挨饿(1)就是挨饿资源(互斥体,缓冲区等)。
挨饿(2)挨饿CPU-您可以将其视为资源。如果发生这种情况,则问题出在调度程序上。
高温超导
关于theory - 什么是饥饿?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1162587/