单选题22.关于临界问题的一个算法(假设只有进程P0和P1可能会进入该临界区)如下(i为0或1): repeat retry: if(turn!=一1) turn=i; if(turn!=i) go to retry; turn=-1; 临界区; turn=0; 其他区域, until false; 该算法( )。
【正确答案】
B
【答案解析】进程并发时容易产生争夺资源现象,必须在入口码处能够阻止进程同时进入临界区。要求根据给出的入口码和出口码判断程序是否正确,此类出题方式较常见。此类题目要想得出正确答案,关键是找出程序的错误。根据条件可先写出每个进程的执行代码,注意程序中i的取值应与进程P{的取值相同: P0:repeat retry:if(turn!=一1) turn=0; ① if(turn!=0) goto 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,所以没有进程会被饿死。