实现临界区互斥的基本方法:
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;//剩余区
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!