关于临界问题的一个算法(假设只有进程P0和P1可能会进入该临界区)如下(i为0或1): repeat retry: if(turn!=-1)turn=i; if(turn!=i)go to retry; turn=-1; 临

admin2019-02-24  36

问题 关于临界问题的一个算法(假设只有进程P0和P1可能会进入该临界区)如下(i为0或1):
repeat
retry:
    if(turn!=-1)turn=i;
    if(turn!=i)go to retry;
    turn=-1;
    临界区;
    turn=0;
    其他区域;
unti1false;
该算法(    )。

选项 A、不能保持进程互斥进入临界区,会出现“饥饿”
B、不能保持进程互斥进入临界区,不会出现“饥饿”
C、保证进程互斥进入临界区,会出现“饥饿”
D、保证进程互斥进入临界区,不会出现“饥饿”

答案B

解析 进程并发时容易产生争夺资源现象,必须在入口码处能够阻止进程同时进入临界区。要求根据给出的入口码和出口码判断程序是否正确,此类出题方式较常见。此类题目要想得出正确答案,关键是找出程序的错误。根据条件可先写出每个进程的执行代码,注意程序中i的取值应与进程Pi的取值相同:
P0:repeat
retry:if(turn!=-1) turn=0;   ①
  if(turn!=0)go to retry;    ②
  turn=-1;    ⑤
  临界区;
  turn=0;
  其他区域;
unti1 false;
P1:repeat
retry:if(turn!=-1)turn=1;    ③
  if(turn!=1)go to retry;    ④
  turn=-1;    ⑥
  临界区;
  turn=0;
  其他区域;
unti1 false;
    入口码最容易出错的地方就是在两个进程同时申请进入临界区的时候。若此时两个进程同时申请资源,此时turn的值是0,按照①②③④⑤⑥的顺序执行,两个进程同时进入临界区。再讨论“饥饿”问题。因为入口码的判断条件是turn!=-1,否则进程被阻塞,而只有在临界区中存在进程访问的情况下turn的值才会是-1,所以没有进程会被饿死。
转载请注明原文地址:https://jikaoti.com/ti/BvGjFFFM
0

最新回复(0)