实现临界区互斥的基本方法: 1、 软件实现:在进入区设置和检查一些标志来标明是否有进程在临界区中。如果有,则在进入区通过循环检查进行等待,进程离开临界区后则在推出区修改标志。 1.1算法一:单标志法。该算法设置一个公用整型变量turn,用于指示被允许进入临界区的进程编号,即若turn=0,则允许P0进程进入临界区。该算法可确保每次只允许一个进程进入临界区。但两个进程必须交替进入临界区,如果某个进不再进入临界区了,那么另一个进程也将无法进入临界区,违背了“空闲让进”,容易造成资源利用不充分。 假如,P0顺利进入临界区并从临界区离开,那么此时临界区是空闲的,但P1并没有进入临界区的打算,turn=1,一直成立,P0就无法再次进入临界区了。例程如下: P0进程: While(turn!=0);//进入区 Critical section;//临界区 Turn=1;退出区 Remainder section;//剩余区 P1进程: While(turn!=1);//进入区 Critical section;//临界区 Turn=0;//退出区 Remainder section;//剩余区 1.2算法2:双标志法先检查。该算法的基本思想是在每一个进程访问临界区资源前,先查看一下临界资源是否正被访问,若正被访问,该进程需等待;否则,进程才进入自己的临界区。为此,设置了一个数据flag[i],如第i个元素值为FALSE,表示Pi进程未进入临界区,值为TRUE,表示Pi进程进入临界区。描述代码如下: Pi进程: While(flag[j]);//进入区 Flag[i]=TRUE;//进入区 Critical section;//临界区 Flag[i]=FALSE;//退出区 Remainder section;//剩余区 Pj进程: While(flag[i]);//进入区 Flag[j]=TRUE;//进入区 Critical section;//临界区 Flag[j]=FALSE;//退出区 Remainder section;//剩余区 优点:不用进行交替进入,可连续使用 缺点:Pi和Pj可能同时进入临界区,违背了“忙则等待”原则。 1.3算法3:双标志法后检查。先设置自己标志为TRUE后,再检测对方状态标志,若对方标志为TURE,则进程等待,否则进入临界区。描述代码如下: Pi进程: Flag[i]=TRUE;//进入区 While(flag[j]);//进入区 Critical section;//临界区 Flag[i]=FALSE;//退出区 Remainder section;//剩余区 缺点:由于同时分别把自己的标志值flag设置为TRUE,双方互相谦让,结果谁也进不了临界区,从而导致“饥饿””现象 1.4算法4:为防止两个进程为进入临界区而无限等待,又设置遍历turn,每个进程在先设置自己标志后再设置turn标志。这时,再同时检测另一个进程状态标志和不允许进入标志,保证当两个进程同时要求进入临界区,只允许一个进程进入临界区。描述代码如下 Pi进程: Flag[i]=TRUE;turn=j; //进入区 While(flag[j]&&turnj); //进入区 Critical section; //临界区 Flag[i]=false; //退出区 Remainder section; //剩余区 Pj进程: Flag[j]=TRUE;turn=i; //进入区 While(flag[i]&&turni); //进入区 Critical section; //临界区 Flag[j]=false; //退出区 Remainder section;//剩余区
13临界区互斥的软件实现方法
关注
打赏