11、互斥实现方法
互斥的实现既可以用软件方法,也可以用硬件方法
(1)软件方法
算法1:设置一个公用的整型变量turn,用来允许进入临界区的进程标识。若turn为0,则允许进程P0进入临界区;否则循环检查该变量,知道turn变为本进程标识;在退出区,修改允许进程的标识turn为1.进程p1的散发于此类似。两个进程的程序结构如下:
int turn = 0;
P0:{
Do{
while(turn!=0); //当turn不为0时循环检查,直到为0(进入区)
进程P0的临界区代码CS0 //临界区
turn = 1; //退出区
进程P0的其他代码;
}
while(true) //循环执行这段代码
}
P1:{
Do{
while(turn!=1); //进入区
进程P1的临界区代码CS1 //临界区
turn = 0; //退出区
进程P1的其他代码;
}
while(true) //循环执行这段代码
}
此方法可以保证互斥访问临界资源,但存在的问题是强制两个进程以交替次序进入临界区,很容易造成资源利用不充分。例如,当进程P0退出临界区后将turn置为1,一边允许进程P1进入临界区,但如果进程P1暂时并未要求访问该临界资源,而P0又想再次访问临界资源,则他将无法进入临界区。可见,此算法不能保证实现“空闲让进”准则。
算法2:
设置标志数组flag[]标识进程是否在临界区中执行,初始值为佳。在每个进程访问临界资源前,先检查另一个进程是否在临界区中,若不在,则修改本进程的临界区标志位真并进入临界区,在退出区修改本进程临界区标志为佳。两进程的程序结构如下:
enum boolean(false,true); //设置数组元素类型
boolean flag[2]={false,false}; //设置标志数组
P0:{
Do{
while flag[1]; //flag[0]为真表示P1在访问临界区,P0等待(进入区)
flag[0] = true; //进入区
进程P0的临界区代码CS0 //临界区
flag[0]=false; //退出区
进程P0的其他代码;
}
while(true)
}
P1:{
Do{
while flag[0]; //flag[0]为真表示P1在访问临界区,P0等待(进入区)
flag[1] = true; //进入区
进程P0的临界区代码CS0