操作系统第五次作业6
1 第一个著名的正确解决两个进程的临界区问题的软件方法是Dekker 设计的
两个进程 P0 和 P1 共享以下变量:booleanflag[2];/*initiallyfalse*/intturn;进程 Pi(i==0 或 1)的结构见图 6
25,另一个进程是 Pj(j==0 或1)
试证明这个算法满足临界区问题的所有三个要求
答:临界区的问题的解答必须满足以下三个条件:1)互斥:如果进程 Pi 在其临界区内执行,那么其他进程都不能在其临界区内执行
2)有空让进:如果没有进程在其临界区内执行且有进程需进入临界区,那么只有那些不在剩余区内执行的进程可参加选择,以确定谁能下一个进入临界区,且这种选择不能无限推迟
3)有限等待:从一个进程做出进入其临界区的请求,直到该请求允许为止,其他进程被允许进入其临界区的次数有上限
为了表述方便,接下来用 0,1 来代替 i,j;首先两个进程共享以下变量:booleanflag[2];/*initiallyfalse*/intturn;flag 用来记录谁要访问临界区,就让对应的 flag 二 true(例如 P0要访问临界区,就让 flag[0]=true),相当于“举手示意我要访问”初始值为 0 表示一开始没人要访问
trun 用于标识当前允许谁进入,turn=O 则 P0 可进入,turn=1 则P1 可进入
接下来看进程 P0 的逻辑do{flag[O]=true;〃首先 P0 举手示意我要访问 while(flag[1]){〃看看 P1是否也举手了讦(turn==1){〃如果 P1 也举手了,那么就看看到底轮到谁flag[O]=false;〃如果确实轮到 P1,那么 P0 先把手放下(让 P1先)while(turn==1);//donothing//只要还是 P1 的时间,P0 就不举手,一直等flag[