Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Operating system 如果进程在执行等待和信号操作时抢占,会发生什么情况?_Operating System_Mutex_Semaphore_Producer Consumer - Fatal编程技术网

Operating system 如果进程在执行等待和信号操作时抢占,会发生什么情况?

Operating system 如果进程在执行等待和信号操作时抢占,会发生什么情况?,operating-system,mutex,semaphore,producer-consumer,Operating System,Mutex,Semaphore,Producer Consumer,使用信号量的主要原因是为了防止生产者-消费者问题。 但我想知道如果一个进程在执行等待操作时被抢占,而另一个进程也执行等待操作,会发生什么情况 让我们坐飞机吧 S值为1。 如果在执行Wait()时,S值作为1加载到寄存器reg,该怎么办。 现在S值递减。 现在reg是0。 现在,如果另一个进程想要执行等待以访问关键部分 它将S值视为1。 加载注册表为1。 再次递减。 注册号是0 现在这两个过程都进入了关键阶段 等待函数的代码为 Down(Semaphore S){ S.value=S.value-

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

让我们坐飞机吧 S值为1。 如果在执行Wait()时,S值作为1加载到寄存器reg,该怎么办。 现在S值递减。 现在reg是0。 现在,如果另一个进程想要执行等待以访问关键部分 它将S值视为1。 加载注册表为1。 再次递减。 注册号是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();
}
}
Down(信号量S){
S.value=S.value-1;

如果(S.value

您是正确的,如果信号量操作的代码是如上所述,如果在执行操作的过程中线程被抢占,确实存在可能发生坏的风险。在实践中这不是一个问题的原因是信号量操作的实际实现更多地涉及T。韩:你给了我什么

例如,信号量的一些实现将从物理上禁用机器上的中断机制开始,以确保当前线程在操作执行期间不可能被抢占。其他的是在使用类似技术防止抢占的其他同步原语之上分层的。其他的可能是使用其他机制,除了禁用中断,具有相同的效果,确保在执行所需同步的过程中途不能停止进程,或者至少确保可以抢占任何先发制人的地方被标记和正确地考虑。
希望这能有所帮助!

根据定义,这不能发生在信号量上。如果它可以发生,就像您的示例代码一样,它就不是信号量。