【发布时间】: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