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

前者是指相互阻塞的进程,因此阻止了两者的执行。后者是指互相阻止进度但实际上不阻止执行的进程。例如,它们可能会不断导致彼此回滚事务,而这两个事务都无法完成。

另一种情况称为资源匮乏,其中过程的进度所需要的一个或多个有限资源已被它们耗尽,除非进程继续进行,否则无法恢复。这也是活锁的一种特殊情况。

我想知道对于“饥饿”是否还有其他定义,特别是学术上的定义,而不仅限于“资源饥饿”。特别欢迎引用。

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

最佳答案

我不会说资源匮乏是活锁的特例。通常:

  • 在 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://en.wikipedia.org/wiki/Dining_philosophers_problem)

  • 有关更多详细信息,我全力推荐《信号量小书》(免费):http://www.greenteapress.com/semaphores/

    您在问是否每个饥饿都是由等待某些资源引起的。我会说-是的。

    线程可以被挂起:

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

    (2)在一些非阻塞操作上-例如执行计算。

    挨饿(1)就是挨饿资源(互斥体,缓冲区等)。

    挨饿(2)挨饿CPU-您可以将其视为资源。如果发生这种情况,则问题出在调度程序上。

    高温超导

    关于theory - 什么是饥饿?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1162587/

    10-09 16:28