信号量和上下文切换之间的交互



假设线程 S 调用semaphore.signal(),而线程 W1、W2 正在等待该信号量。

我知道信号量语义不能保证调度三个线程的顺序。但是,为了理解性能影响,我想弄清楚典型实现的行为。

具体来说(对于常用的信号量实现(:

  1. W1 和 W2 是否会唤醒CPU,其中一个会立即发现它必须再次阻塞,从而重新进入睡眠状态?

  2. 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 可能会继续运行。

最新更新