您现在的位置:学赛首页 > 研究生院 > 软件学院 > 正文
操作系统第四章-进程同步与通信[3]
http://www.educity.cn 作者:研究生院 来源:学赛网 2008年4月22日 发表评论 进入社区

  进程p1的临界区代码cs1 ;

  flag[1]=false ;

  进程p1的其他代码;

  }

  算法2存在的问题

  此算法解决了空闲让进的问题,但有可能两个进程同时进入临界区。

  当两个进程都未进入临界区时,它们各自的访问标志值都为false,若此时刚好两个进程同时都想进入临界区,并且都发现对方标志值为false,于是两个进程同时进入了各自的临界区,这就违背了临界区的访问原则忙则等待。

  算法3的思想

  本算法仍然设置标志数组flag[ ],但标志用来表示进程是否希望进入临界区。在每个进程访问临界资源之前,先将自己的标志设置为真,表示进程希望进入临界区,然后再检查另一个进程的标志。若另一个进程的标志为真,则进程等待;否则进入临界区。

  算法3的描述

  enum boolean {false,true};

  boolean flag[2]={false,false};

  p0: while (true)

  {

  flag[0]=true;

  while flag[1];

  进程p0的临界区代码cs0 ;

  flag[0]=false;

  进程p0的其他代码;

  }

  算法3的描述(续)

  p1: while (true)

  {

  flag[1]=true;

  while flag[0];

  进程p1的临界区代码cs1 ;

  flag[1]=false;

  进程p1的其他代码;

  }

  算法3存在的问题

  该算法可以有效地防止两个进程同时进入临界区,但存在两个进程都进不了临界区的问题。

  当两个进程同时想进入临界区时,它们分别将自己的标志位设置为true,并且同时去检查对方的状态,发现对方也要进入临界区,于是双方互相谦让,结果谁也进不了临界区。

  算法4的思想

  本算法的基本思想是算法3和算法1的结合。是一个正确的算法。

  标志数组flag[ ]表示进程是否希望进入临界区或是否正在临界区中执行。还设置了一个turn变量,用于指示允许进入临界区的进程标识。

  算法4的描述

  enum boolean {false,true};

  boolean flag[2] ={false,false}; int turn;

  p0: while (true)

  {

  flag[0]=true; turn=1;

  while (flag[1] && turn = = 1);

  进程p0的临界区代码cs0 ;

  flag[0]=false ;

[1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]  [10]