Lamport面包店算法详解

范例1:

boolean  choosing[n];表示进程是否在取号

int  number[n];记录每个进程取到的号码

这些数据结构分别初始化为false和0,为了方便,定义如下符号:

若a

do
{
             
  choosing[i] = true;
  number[i] = max{number[0],number[1],…,number[n-1]}+1;//选号码
  choosing[i] = false;
  for(j = 0; j     {
    while (choosing[j]);
    while ((number[j] != 0) && (number[j],j)<(number[i],i));
  };

  //临界区
  number[i] = 0;
  //其余部分
}while(1);
理解:

第一个试图进入临界区的进程Pi在没有其它进程竞争时顺利进入其临界区。满足了有空就进的要求。

当有竞争者Pk(i

在Pi进程中j==i时,number[j]==number[i],且j==i所以(number[j],j)<(number[i],i)不成立,退出while语句。j==k时,number[k]==number[i],且k>i所以(number[j],j)<(number[i],i))不成立,退出while语句。对与其它非i和k的j值,number[j]!=0不成立,退出while语句。

在pk进程中j==i时,number[j]

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/coolmousewife/archive/2009/08/19/4464500.aspx

 

范例2:

今天看操作系统书上的面包店算法的时候刚开始没有怎么看懂,于是在网上搜了些信息,读了网上给出的算法加上些许注释终于明白怎么一回事了,代码黏贴如下:

     问答:     在计算机科学文献中的几种互斥算法中,所谓的Lamport面包店算法可以有效地用于多个相互竞争的控制线程,该算法中线程之间的通信只能在共享内存中进行(即,不需要诸如信号量、原子性的set-and-test之类的专门机制)。该算法的基本思想源于面包店,因为面包店需要先取号然后等候叫号。下面给出了该算法的框架,该算法可以使各线程进出临界区而不产生冲突。

     Enter, Number: array [1..N] of integer = {0};
面包店算法
面包店算法
// logic used by each thread面包店算法
面包店算法
// where "(a, b) < (c, d)"
面包店算法
// means "(a < c) or ((a == c) and (b < d))"
  Thread(i) {
   
while (true{
    Enter [i] 
= 1;
    Number[i] 
= 1 + max(Number[1],面包店算法,Number[N]);
    Enter [i] 
= 0;
面包店算法    
for (j=1; j<=N; ++j) {
面包店算法      
while (Enter[j] != 0{
面包店算法        
// wait until thread j receives its number
面包店算法
      }

面包店算法      
while ((Number[j]!=0)
面包店算法         
&& ((Number[j],j) < (Number[i],i))) {
面包店算法        
// wait until threads with smaller numbers
面包店算法        
// or with the same number, but with higher
面包店算法        
// priority, finish their work
面包店算法
      }

面包店算法    }

面包店算法    
// critical section面包店算法
面包店算法
    Number[i] = 0;
面包店算法    
// non-critical section面包店算法
面包店算法
  }

面包店算法}

     相信大家通过上面代码中的注释能够恍然大悟了吧,呵呵。

你可能感兴趣的:(操作系统)