举例说明,P、V操作为什么要求设计成原语(即对同一信号量上的操作必须互斥)。 P(S)操作: S.value一一; if(S.value

admin2018-08-12  37

问题 举例说明,P、V操作为什么要求设计成原语(即对同一信号量上的操作必须互斥)。
    P(S)操作:
         S.value一一;
         if(S.value<0){
               Add this process to S.L;
               Block();
         }
    V(S)操作:
         S.value++;
         if(S.value<=0){
              Remove a process P from S.L;
              Wakeup(P);
         }

选项

答案例如,用P、V操作来实现进程对临界资源互斥使用。此时,只需定义一个信号量S,其初值{1,NULL},并在临界区前执行P(S)操作,而在临界区后执行V(S)操作。此时P、V操作不设计成原语,那么在执行P、V操作时进程可以被中断。由于在初始状态下临界资源空闲,故应允许第一个申请临界资源的进程进入临界区使用临界资源,但如果该进程在执行到P操作的语句S.value一一后(此时S.value的值为0)便被另一个进程中断,而那个进程也企图通过执行P(S)操作进入临界区,则第二个进程也必须执行语句S.value一一,从而将S.value的值为一1,并由于S.value<0而被阻塞,而第一个进程再次获得CPU后也同样由于S.value<0而被阻塞,这就造成了临界资源虽然空闲但进程却申请不到临界资源的情况,也就是说,此时的P、V操作已无法满足同步机制的要求。同样,一个执行P(S)操作的进程被中断后另一进程去执行V(S)操作,一个执行V(S)操作的进程被中断后而另一个进程去执行P(S)或V(S)操作,都将发生混乱而难以实现进程同步。因此,P、V操作必须设计成原语的方式。

解析
转载请注明原文地址:https://jikaoti.com/ti/9wfjFFFM
0

最新回复(0)