假设线程 S 调用semaphore.signal()
,而线程 W1、W2 正在等待该信号量。
我知道信号量语义不能保证调度三个线程的顺序。但是,为了理解性能影响,我想弄清楚典型实现的行为。
具体来说(对于常用的信号量实现(:
-
W1 和 W2 是否会唤醒
CPU,其中一个会立即发现它必须再次阻塞,从而重新进入睡眠状态? -
S 会在从
semaphore.signal()
呼叫返回之前进入睡眠状态吗?还是它会留在 CPU 上,只要它没有signal()
调用?
您的问题未充分说明。
来自 W1,W2 的一个线程将由信号量信号设置就绪,称为"W">
之后会发生什么尚不清楚,因为您没有充分指定调度程序/调度程序的配置和状态。
如果有可用内核,则 S 可能会继续运行,W 可能会被派送到备用内核上。
如果没有可用的内核,W 可能会抢占 S:W 被调度到运行 S 的内核上,S 设置就绪,等待内核运行。
如果没有可用的可用内核,内核可能会抢占另一个内核上运行的另一个线程,以支持 W。 因此,S 和 W 都将运行。
具体说来:
W1 和 W2 是否会唤醒 CPU,其中一个 立即发现它必须再次阻塞,从而返回 睡觉?
为什么任何操作系统都会这样做? 这是一大堆额外的工作,没有任何收获。 信号量接收一个信号,因此一个线程被取消排队并设置为就绪。 另一个信号仍然被阻塞,并在信号量线程队列中等待另一个信号。 没有必要"唤醒它"。
S 是否会在从信号量返回之前进入睡眠状态.signal(( 叫?还是它会一直留在 CPU 上,只要它会停留 没有信号((调用?
信令线程 S 不需要离开运行状态。如果操作系统内核调度算法和状态可以在另一个内核上运行 W,则 S 可以继续运行。 如果 S 被 W 抢占,则它不再运行,并卡在内核就绪队列中,等待内核可用。W 可能只是准备就绪,而不是被调度,S 可能会继续运行。