假设线程S称为semaphore.signal()
,而线程W1,W2正在等待该信号量。信号量和上下文开关之间的相互作用
我知道信号量语义没有提供关于三个线程将被调度的顺序的保证。但是,为了理解性能影响,我想弄清典型实现的行为。
具体(常用信号量的实现):
都将W1和W2
获得CPU被唤醒,其中一人立即发现,它必须再次阻止,因此要回睡觉?S会从
semaphore.signal()
呼叫返回睡眠之前?或者只要它没有拨打signal()
,它会保持在CPU上?
假设线程S称为semaphore.signal()
,而线程W1,W2正在等待该信号量。信号量和上下文开关之间的相互作用
我知道信号量语义没有提供关于三个线程将被调度的顺序的保证。但是,为了理解性能影响,我想弄清典型实现的行为。
具体(常用信号量的实现):
都将W1和W2
获得CPU
被唤醒,其中一人立即发现,它必须再次阻止,因此要回睡觉?
S会从semaphore.signal()
呼叫返回睡眠之前?或者只要它没有拨打signal()
,它会保持在CPU上?
您的问题未指定。从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可能会继续。