【发布时间】:2011-11-05 16:26:54
【问题描述】:
在 William Stallings 的操作系统一书中,他将强信号量定义为具有 FIFO 排队规则的信号量,而将弱信号量定义为无序的信号量。对于强信号量,肯定还有其他排队规则,比如按优先级?或者这不再是一个强信号量,因为饥饿将成为可能? (Stallings 说强信号量不允许饥饿。)强和弱有序/无序或饥饿可能/不可能之间的主要区别是什么?
【问题讨论】:
在 William Stallings 的操作系统一书中,他将强信号量定义为具有 FIFO 排队规则的信号量,而将弱信号量定义为无序的信号量。对于强信号量,肯定还有其他排队规则,比如按优先级?或者这不再是一个强信号量,因为饥饿将成为可能? (Stallings 说强信号量不允许饥饿。)强和弱有序/无序或饥饿可能/不可能之间的主要区别是什么?
【问题讨论】:
是的,一种非 FIFO 非饥饿的可能性(在许多可能性中)是以循环方式选择下一个进程。例如,如果顺序是 1、2、3、4,当 1 持有信号量时,4 然后 3 请求它,那么下一个进程是 3。没有进程 P 饿死,因为在 P 的每个请求之后,在 P 的请求被批准之前,每个其他进程最多有一个临界区。
Google 命中首页中“强信号量”的定义分为“无饥饿”和“先进先出”。哪一个是“正确的”是一个品味问题——鉴于这种混乱(以及在数学写作中普遍过度使用强作为形容词),我可能都不会使用。
【讨论】:
在有关信号量的文献中,我从未见过(据我所知)有人使用 FIFO 或某种形式的排序作为弱/强分类的标准。事实上,无饥饿也并不总是标准。最初的文献(由于Morris('79),Martin and J. R. Burch('85),Udding('86), Friedberg 和 Peterson('87),以及 Haldar 和 Subramanian('88)) 使用了 'P' 和 ' 的某些特征V' 操作来定义弱信号量。有趣的是,所引用研究人员的所有定义最终都暗示在信号量较弱的情况下可能存在饥饿。此外,尽管 FIFO 保证了无饥饿,但在我看来,提及术语 FIFO 或某种形式的排序限制了信号量的行为。一种形式的限制可能是,例如,FIFO 排序意味着信号量附加了某种缓冲区,以便跟踪 'P' 上的阻塞进程/线程手术。对于信号量的硬件实现,这个定义可能过于严格。另一种形式的限制可能是,不是考虑所有可能的排序方案具有相同的有界超车 k (即没有进程将被超车超过 k 次),一个将是仅限于将每个方案视为一种不同类型的信号量。因此,我个人的观点是将弱信号量定义为不保证无饥饿(但保证无死锁)的信号量。但是,如果您更深入地研究研究级活动,那么您可以随意使用更多的数学或/和细粒度定义。
【讨论】:
我认为在队列元素上具有预定义优先级的优先级队列不会造成饥饿。如您所见,它只是一个常规队列,但下一个元素具有最高优先级。因此,如果您使用 FIFO 逻辑实现优先级(首先具有最高优先级),就不会出现饥饿。否则会导致饥饿。
【讨论】: