【发布时间】: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