使用信号量的主要原因是为了防止生产者-消费者问题。 但是我不知道如果一个进程在执行等待操作时被抢占,而另一个进程也在执行等待操作,将会发生什么情况。
让我们来 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();
}
}
信号量变量也不是关键节变量,因为它在两个或多个进程中很常见吗?我们如何防止这种比赛状况?
答案 0 :(得分:1)
您是正确的,如果信号量操作的代码如上所述,那么确实存在这样的风险,如果在执行操作的过程中抢占了线程,则可能发生不良情况。实际上这不是问题的原因是,信号量操作的实际实现比您提供的要复杂得多。
例如,信号量的某些实现将从物理上禁用计算机上的中断机制开始,以确保在执行操作期间无法抢占当前线程。其他则位于使用类似技术防止抢占的其他同步原语之上。其他人除了禁用中断外,还可以使用其他机制,以确保在执行所需的同步过程中不会中途停止进程,或者至少确保对可以发生抢占的任何地方进行了适当标记,并具有相同的作用。经过深思熟虑。
希望这会有所帮助!