2017-07-30 31 views
2

假设线程S称为semaphore.signal(),而线程W1,W2正在等待该信号量。信号量和上下文开关之间的相互作用

我知道信号量语义没有提供关于三个线程将被调度的顺序的保证。但是,为了理解性能影响,我想弄清典型实现的行为。

具体(常用信号量的实现):

  1. 都将W1和W2 获得CPU 被唤醒,其中一人立即发现,它必须再次阻止,因此要回睡觉?

  2. S会从semaphore.signal()呼叫返回睡眠之前?或者只要它没有拨打signal(),它会保持在CPU上?

回答

0

您的问题未指定。从W1

一个线程,W2将通过旗语信号设定准备好了,叫它“W”

会怎么样这是不清楚,因为你不够指定的调度器/调度程序配置和状态。

如果有空闲的内核可用,S可能会继续运行,并且W可能会被分派到备用内核中。

如果没有可用的内核可用,W可以抢占S:W被分派到正在运行S的核心,并且S设置就绪,等待内核运行。

如果没有可用的内核,内核可能会抢占另一个内核上运行的另一个线程,从而支持W.因此,S和W都将运行。

具体做法是:

都将W1和W2获得CPU被唤醒,其中一人 立即发现,它必须再次阻止,因此要回 睡觉?

为什么任何操作系统会这样做?这是一堆无益的额外工作。信号量接收到一个信号,所以一个线程出列并设置就绪。另一个仍然被阻塞,并在信号量线程队列中等待另一个信号。没有必要“唤醒”。

在S从信号灯返回之前将会睡眠() 调用?或者只要在没有signal()调用的情况下保持 ,它会一直保持在CPU上?

信号线程S不需要离开运行状态。如果OS内核调度算法和状态可以在另一个内核上运行W,则S可以继续运行。如果S被W抢占,那么它不再运行,并且卡在内核就绪队列中,等待内核可用。 W可能已经准备就绪,不会被派遣,S可能会继续。