【问题标题】:What happens if a process preempts while executing wait and signal operations?如果一个进程在执行等待和信号操作时抢占了会发生什么?
【发布时间】:2019-11-17 08:58:22
【问题描述】:

使用信号量的主要原因是为了防止生产者-消费者问题。 但是我想知道如果一个进程在执行等待操作时被抢占并且另一个进程也执行等待操作会发生什么。

我们来看看 S 值为 1。 如果在执行 Wait() 时,S 值被加载到寄存器 reg 中为 1。 现在 S 值递减。 现在 reg 为 0。 现在,如果另一个进程想要执行等待访问关键部分 它认为 S 值为 1。 将 reg 加载为 1。 并再次递减。 reg 为 0。

现在两个进程都进入了临界区。

等待函数的代码是

Down(Semaphore S){
S.value=S.value-1;
if(S.value<0)
{
put PCB in suspended list;
sleep;
}
else
return;
}

信号函数的代码是

Signal(Semaphore S){
S.value=S.value+1;
if(S.value<=0)
{
Select a process from suspendend list;
wakeup();
}
}

信号量变量不是一个临界区变量吗,因为它在两个或多个进程中很常见?我们如何防止这种竞争条件?

【问题讨论】:

  • 根据定义,信号量不会发生这种情况。如果它可能发生,就像您的示例代码一样,它不是信号量。

标签: operating-system mutex semaphore producer-consumer


【解决方案1】:

您是正确的,如果信号量操作的代码如上所示,那么如果线程在执行操作的过程中被抢占,则确实存在发生坏事的风险。在实践中这不是问题的原因是信号量操作的实际实现比您给出的要复杂一些。

例如,信号量的一些实现将首先在物理上禁用机器上的中断机制,以确保当前线程在操作执行期间不可能被抢占。其他的则位于使用类似技术来防止抢占的其他同步原语之上。其他人可能会使用其他机制,除了禁用具有相同效果的中断,以确保在执行所需同步的过程中不能中途停止进程,或者至少确保任何可能发生抢占的地方都被标记清楚并且深思熟虑。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2020-02-27
    • 2012-01-17
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多