【问题标题】:Will semaphore mechanism cause deadlock?信号量机制会导致死锁吗?
【发布时间】:2014-04-24 08:54:36
【问题描述】:

由于信号量机制使用两个队列:

  • 阻塞队列
  • 就绪队列

在两种可能的情况下:

如果①信号量的信号为负(相当大),

②提供所需资源的必要进程被阻塞,会不会出现死锁?


例如,我们有三个进程在阻塞队列中,但信号为负五(s = -5),这些进程会永远阻塞在队列中吗?

在第二种情况下,如果进程P1、P2、P3依赖于P4的结果,而P4被阻塞在队列中(有可能吗?),那么我们没有办法通过semSignal()增加信号量吗?表示死锁?

【问题讨论】:

  • '信号量的信号为负' - 怎么会这样?信号量计数是正整数或零。我不明白 - 一些实现细节?负整数索引等待队列?
  • @MartinJames 当信号量为负时,该机制会阻塞相关进程。好像是-5,它会阻塞一个“阻塞队列”中的5个进程;在信号量设置为正之前,进程不会被放入“就绪队列”。每个 semWait() 从 semaphore 中减去 1,semSignal() 将其增加 1。
  • 我从 William Stallings 的“操作系统”一书中得到了这个,没有实现细节。我检查了很多次,我认为我的概念没有太大的错误。
  • 您误解了这本书或这本书是错误的。如果有五个线程正在等待一个信号量,那是因为信号量计数为零。如果此时信号量发出信号,则其中一个等待线程将变为就绪状态,并且计数将保持为零。不存在存在等待线程并且一个信号没有使其中一个准备就绪的情况。如果有一些同步原语/对象的行为与您描述的一样,则它不是信号量。
  • 我可以接受可能为负数的整数计数是概念化和/或实现计数的一种方式。根据信号释放等待线程的条件是“count0 after increment”。

标签: operating-system deadlock semaphore


【解决方案1】:

例如,我们在块队列中有三个进程,但信号是 负五(s = -5),进程是否会永远阻塞在 排队?

如果您接受信号量计数变为负数的概念,即。负值表示等待线程的数量,如果只有三个线程在等待,则计数不能变为-5。如果发生这种情况,您的信号量实现就会失败。

在第二种情况下,如果进程 P1、P2、P3 依赖于 P4 的结果,并且 P4 被阻塞在队列中(有可能吗?),所以我们无能为力 怎么通过semSignal()增加信号量,说明死锁了?

我不明白这种情况。它没有描述死锁。如果 P4 卡在某个队列上,这就是四个线程都被阻塞而无法前进的原因,那么你应该首先弄清楚 P4 卡住的原因。

如果 P4 正在等待来自 p1、p2 和/或 p3 的某些信号,则可能会发生死锁。

在我能想到的所有情况下,增加额外的信号量单元以试图摆脱僵局将是对泄漏核反应堆的创可贴。

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多