单选题 关于临界问题的一个算法(假设只有进程P0和P1可能会进入临界区)如下(i为0或1代表进程P0或者P1):
repeat
retry:
if(turn!=-1)turn=i;
if(turn!=i)go to retry;
turn=-1;
临界区;
turn=0;
其他区域;
until false;
该算法______。
  • 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; 其他区域; until false; P1: repeat retry: if(turn !=-1) turn=1; ③ if(turn!=1) go to retry; ④ turn=-1; ⑥ 临界区; turn=0; 其他区域; until false; 入口码最容易出错的地方就是在两个进程同时申请进入临界区的时候。若此时两个进程同时申请资源,此时turn的值是0,按照①②③④⑤⑥的顺序执行,两个进程同时进入临界区。再分析“饥饿”问题。因为入口码的判断条件是turn!=-1,否则进程被阻塞,而只有在有进程进入临界区的情况下turn的值才会是-1,所以没有进程会被饿死。