两个进程共同操作一个变量引起的问题:
assume counter=0; P1进程和P2进程都进行操作counter--,详细情况就是
P1.register = counter; P1.register = P1.register-1; counter = P1.register; P2.register = counter; P2.register = P2.register -1; counter = P2.register;
这种顺序下是没问题的。最后counter=-2;
但是CPU执行了P1.register = counter; P1.register = P1.register-1; 之后可能会跳转到P2进行继续执行P2.register = counter; P2.register = P2.register -1;counter = P2.register;然后跳转到P1进程,执行counter = P1.register;
最终这种执行顺序的结果就是counter=-1;显然是和我们的预期有差异。
临界区保护原则:
1、互斥进入:如果一个进程在临界区中执行,其他进程不允许进入
2、有空让进:若干进程要求进入空闲临界区时,应尽快使一个进程进入临界区
3、有限等待:从进程发出进入请求到允许进入,不能无限等待
尝试1:轮换法
// P0进程 while(turn != 0); 临界区 turn=1; // P1进程 while(trun != 1); 临界区 turn=0;
不适合原因: P0执行了之后,P1如果没执行过,P0就进不去临界区了,出现死等的情况。