Multithreading 信号量和上下文开关之间的交互

Multithreading 信号量和上下文开关之间的交互,multithreading,operating-system,semaphore,scheduling,Multithreading,Operating System,Semaphore,Scheduling,假设线程S调用了semaphore.signal(),而线程W1、W2正在等待该信号量 我知道信号量语义不能保证三个线程的调度顺序。然而,为了理解性能含义,我想了解典型实现的行为 具体而言(对于常用的信号量实现): W1和W2是否都会唤醒CPU,其中一个会立即发现它必须再次阻塞,从而重新进入睡眠状态 在从semaphore.signal()调用返回之前,S是否会处于睡眠状态?或者,它是否会在CPU上停留,就像它在没有信号()调用的情况下停留一样长 你的问题没有具体说明 来自W1、W2的一个线程将

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

我知道信号量语义不能保证三个线程的调度顺序。然而,为了理解性能含义,我想了解典型实现的行为

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

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

  • 在从
    semaphore.signal()调用返回之前,S是否会处于睡眠状态?或者,它是否会在CPU上停留,就像它在没有
    信号()调用的情况下停留一样长


  • 你的问题没有具体说明

    来自W1、W2的一个线程将被信号量信号设置为就绪,称之为“W”

    由于没有充分指定调度程序/调度程序的配置和状态,因此不清楚之后会发生什么

    如果有可用的空闲堆芯,S可以继续运行,W可以调度到备用堆芯

    如果没有可用的可用内核,W可以抢占S:W被调度到运行S的内核上,S设置就绪,等待在其上运行内核

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

    具体而言:

    W1和W2是否都会唤醒CPU,其中一个会被唤醒 立即发现它必须再次阻塞,从而返回 睡觉

    为什么任何操作系统都会这样做?这是一大堆徒劳无益的额外工作。信号量接收到一个信号,因此一个线程将退出队列并准备就绪。另一个保持阻塞状态,并在信号量线程队列中等待另一个信号。没有必要“唤醒它”

    在从信号量返回之前,将使S处于睡眠状态。signal() 呼叫或者它会在CPU上停留的时间和它本应该停留的时间一样长 没有signal()调用

    不要求信令线程S离开运行状态。如果操作系统内核调度算法和状态可以在另一个内核上运行W,那么S可以继续运行。如果S被W抢占,那么它将不再运行,并被卡在内核就绪队列中,等待内核变得可用。W可能只是准备就绪,而不是调度,S可能会继续运行