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

时间:2017-07-30 03:02:44

标签: multithreading operating-system semaphore scheduling

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

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

具体而言(对于常用的信号量实现):

  1. W1和W2 都会让CPU 被唤醒,其中一个会立即发现它必须再次阻塞然后再回到睡眠状态吗?

  2. S会在semaphore.signal()来电回来之前进入睡眠状态吗?或者只要在没有signal()电话的情况下停留在CPU上,它会留在CPU上吗?

1 个答案:

答案 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可能继续运行。