#學志#進程同步的TestAndSet的理解

do{
     waiting[i] = true                 // 表示進程Pi處於等待獲取鎖的狀態
     key = true;
     while(waiting[i]&&key)
          key=TestAndSet(&lock);       //  如果進程Pi搶到了鎖,記錄key=false
     waiting[i]=false;
 
     critical section
 
     j=(i+1)%n;
     while(j!=i && !waiting[j])            // 進程Pi處於等待獲取鎖的狀態
         j = (j+1)%n;
     if(j==i)
          lock = false;
     else
          waiting[j] = false;
 
      remainder section
}while(1);



解釋:

臨界區條件1:互斥
     第一個進入的進程Pi要等執行了
TestAndSet之後才能進入,這時
Pi的key=false,其他進程key=true;
     後續進入的進程Pi,只有在其他
進程將waiting[i]設爲false之後,才
可能進入
 
 
臨界區條件2:空閒讓進
     初始,key和所有的waiting[i]都爲
True,lock=false,因此首次執行
TestAndSet的進程會進入臨界區
     當進入臨界區的進程Pi執行完
臨界區操作之後,在退出區,通過
While循環掃描當前處於等待狀態的
進程j (j!=i),
-如果找到j,那麼waiting[j]被設爲false,
  Pj會隨後進入臨界區
-如果沒有找到j,那麼lock被置爲false
總之,只要臨界區資源空閒,想進入
臨界區的進程(其waiting[j]=true)都
會被放進臨界區

 
 
臨界區條件3:有限等待
     每個進程退出臨界區的時候,
總會按順序執行一個掃描,
這個循環掃描的過程保證一個進程
最多等待n-1次即可進入臨界區操作

發佈了25 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章