通过平等协商方式实现进程互斥的最初办法是软件办法。其基本思路是在进入区检查和设置一些标志,如果已经有进程在临界区,则在进入区通过循环检查进行等待;在退出区修改标志。其中的主要问题是设置什么标志和如何检查标志。下面讨论几种软件方法实现软件互斥算法。
算法1 :单标志算法
while(turn!= i);
临界区
turn = j;
剩余区
算法1可以保证任何时刻最多只有一个进程在临界区。但他的缺点是强制轮流进入临界区,没有考虑进程的实际需求。这种算法容易造成资源的利用不充分。
算法2 :双标志、先检查算法
为了克服算法1的缺点,可考虑修改临界区标志的设置
while( flag [j]);
flag[i] = TRUE;
临界区
flag[i] = FLASE;
剩余区
算法2的优点是克服了算法1的缺点,两个进程不用交替进入,可连续使用。但由于使用多个标志,算法又产生了新问题,即进程Pi和Pj可能同时进入临界区,从而违反了最多只有一个进程在临界区的要求。
算法3 :双标志、后检查算法
为了解决算法2的新问题,有两种选择:一是保证检查和修改操作间不出现间隔,一是修改表标志含义。第一种使用软件无法做到。采用第二种方法
flag[i] = TRUE;
while(flag[j]);
临界区
flag[i] = FALSE;
剩余区
算法3可防止两个进程同时进入临界区,但它的缺点是Pi和Pj可能都进不了临界区。
算法4 :先修改、后检查、后修改者等待算法
算法4的基本思想是结合算法1和算法3。
flag[i] = TRUE;turn =j;
while(flag[j]&&turn =j);
flag[i] = FALSE;
算法4可完全正常工作,即实现同步机制要求的四条准则中的前两条:空闲则入、忙则等待。