假设线程S调用semaphore.signal()
,而线程W1,W2正在等待该信号量。
我知道信号量语义不能保证三个线程的调度顺序。但是,为了理解性能影响,我想弄清楚典型实现的行为。
具体而言(对于常用的信号量实现):
W1和W2 都会让CPU 被唤醒,其中一个会立即发现它必须再次阻塞然后再回到睡眠状态吗?
S会在semaphore.signal()
来电回来之前进入睡眠状态吗?或者只要在没有signal()
电话的情况下停留在CPU上,它会留在CPU上吗?
答案 0 :(得分:0)
您的问题未明确。
来自W1的一个线程,W2将被信号量信号设置为就绪,称之为'W'
之后发生的事情不清楚,因为您没有充分指定调度程序/调度程序配置和状态。
如果有可用的免费核心,S可能会继续运行,W可能会被分派到备用核心。
如果没有可用的可用核心,W可以抢占S:W被分派到运行S的核心,并且S准备就绪,等待核心运行。
如果没有可用的可用核心,内核可能会抢占在另一个核心上运行的另一个线程,有利于W.所以,S和W都会运行。
具体做法是:
W1和W2都会让CPU被唤醒,其中一个 立刻发现它必须再次阻止然后回去 睡觉?
为什么任何操作系统会这样做?这是一堆额外的工作,没有收获。信号量接收到一个信号,因此一个线程出列并准备就绪。另一个仍然被阻塞并在信号量线程队列中等待另一个信号。没有必要'唤醒'。
在从semaphore.signal()返回之前是否会进入睡眠状态 呼叫?或者它会留在CPU上,只要它会留下来 没有signal()调用?
信令线程S不需要离开运行状态。如果OS内核调度算法和状态可以在另一个核上运行W,则S可以继续运行。如果S被W抢占,则它不再运行,并且卡在内核就绪队列中,等待核心变为可用。 W可能只是准备就绪,不会被派遣,S可能继续运行。