Lamport面包店算法詳解(轉 侵刪)


范例1:

boolean  choosing[n];表示進程是否在取號

int  number[n];記錄每個進程取到的號碼

這些數據結構分別初始化為false和0,為了方便,定義如下符號:

若a<c或a==c和b<d同時成立,(a,b)<(c,d)

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

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

第一個試圖進入臨界區的進程Pi在沒有其它進程競爭時順利進入其臨界區。滿足了有空就進的要求。

當有競爭者Pk(i<k),且選的號碼相同時,比較進程的名稱,通過語句while ((number[j] != 0) && (number[j],j)<(number[i],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]<number[k],且j<k,所以(number[j],j)<(number[i],i))成立,故進程Pk陷在該語句中,直到Pi退出臨界區執行語句number[i]==0時才允許Pk進程進入其臨界區。所以滿足了互斥和有限等待的要求。

 

 

范例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面包店算法
面包店算法  }
面包店算法}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM