Theory 什么是饥饿?

Theory 什么是饥饿?,theory,multitasking,Theory,Multitasking,在多任务系统中,某些异常情况会阻止进程或线程的执行。我将把进程和线程简单地称为“进程”。其中两种情况称为死锁和活锁 前者指的是相互阻塞的进程,从而阻止其中一个进程执行。后者指的是相互阻止进程进行,但实际上并不阻止执行的进程。例如,它们可能会不断导致彼此回滚事务,但都无法完成它们 另一种情况称为资源匮乏,在这种情况下,进程进行所需的一个或多个有限资源已被耗尽,除非进程进行,否则无法恢复。这也是活锁的一个特例 我想知道,对于“饥饿”是否还有其他定义,特别是学术定义,而不仅仅限于“资源饥饿”。特别欢迎

在多任务系统中,某些异常情况会阻止进程或线程的执行。我将把进程和线程简单地称为“进程”。其中两种情况称为死锁和活锁

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

另一种情况称为资源匮乏,在这种情况下,进程进行所需的一个或多个有限资源已被耗尽,除非进程进行,否则无法恢复。这也是活锁的一个特例

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


而且,不,这不是家庭作业。:-)

工作也是一种资源。当生产者-消费者设置中的工作分配不公平(或不理想)时,某些线程可能无法获得足够的工作项,使其始终处于忙碌状态。

想象一下,您在餐厅排队购买食物,孕妇有优先权。而且总是有一群孕妇来

你很快就会饿死的


现在,假设您是一个低优先级流程,而孕妇是高优先级流程

另一个通常出现饥饿或“无限阻塞”的领域是在讨论优先级调度算法时。优先级调度算法有可能让一些低优先级进程无限期地等待。高优先级进程的稳定流可以阻止低优先级进程运行


对于优先级调度器,解决方案是“老化”。老化是一种逐渐增加在系统中等待很长时间的进程优先级的技术。

饥饿只是当一个进程或服务没有被服务时,即使系统上没有死锁

这是一个我只是为了澄清而编的例子

想象一下,有一种算法控制计算机访问广域网或类似的东西。这个算法可能有一个策略,上面写着“为那些使用较少带宽的计算机提供优先访问权”。这似乎是一个合适的策略,但是当一台计算机想要访问网络进行ftp上传时会发生什么情况,ftp上传会将数GB的数据发送到某个地方。仅使用此策略,该计算机就会饿死,因为算法永远不会选择该计算机,因为总会有其他计算机请求更小的带宽使用


这就是所谓的饥饿。

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

  • 在livelock中,没有线程取得进展,但它们会继续执行。(在死锁中,他们甚至不继续执行)

  • 饥饿时,某些线程确实取得进展,而某些线程没有执行

一个很好的解释:。但我知道术语的选择可能会有所不同

说到饥饿,我听到的定义是:

假设可以指定与假设(信号量语义、操作系统调度程序行为…)一致的无限执行路径(交错),这样线程T在等待某些资源时被挂起,并且永远不会恢复,即使可能无限多次。那就叫做饥饿

但这种做法与此不符。假设两个线程在无限循环中执行相同的临界段。同步代码允许第一个线程每小时进入一次临界区。是饥饿吗?两个线程都可以进行,但第一个线程的工作速度非常缓慢

饥饿最简单的来源是弱信号量。如果您正在使用行为类似的同步原语(或构建自己的原语),那么将导致饥饿

饥饿是众所周知的经典问题:

  • 读者和作者的问题。可以同步线程,以便 (1) 读者将能够使作家挨饿 (2) 作家们将使读者挨饿 (3) 不会发生饥饿 (见附件)

  • 餐饮哲学家()

关于更多细节,我衷心推荐《信号灯小书》(免费):

你在问,是否每一次饥饿都是因为等待某种资源造成的。我会说——是的

线程可以挂起:

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

(2) 在一些非阻塞操作上,比如执行计算

在(1)上饥饿就是在资源(互斥体、缓冲区等)上饥饿

饿死在(2)上就是饿死在CPU上——您可以将其视为一种资源。如果发生这种情况,问题在于调度程序


HTH

一个进程在较长时间内无法获得一个或多个资源。这不是死锁,因为一个进程可以毫无问题地运行。
老化可以用来解决这个问题,每个请求都使用老化因子。

在这个主题上,您还应该检查锁车队,它们非常有趣。而且很恶心。即使是作业,这也是我在电视上见过的最好的书面作业问题。荒谬但最好的解释