設定乙個公用變數turn,若turn=0,則允許p
0p_0
p0程序進入臨界區,若turn=1,則允許p
1p_1
p1程序進入臨界區。
缺點:兩個程序必須交替進入臨界區,違背空閒讓進。
在每個程序訪問臨界資源之前,先檢查臨界資源是否被訪問,若正在被訪問,則程序需要等待,否則程序進入自己的臨界區並設定標誌。
優點:不用交替進入,可連續使用
缺點:檢查對方flag和切換自己的flag有一段時間,可能造成同時進入臨界區,違背忙則等待。
先設定自己的標誌,再檢測對方的標誌,若對方的標誌為true,則等待對方的程序,否則才進入臨界區。
優點:避免同時進入臨界區
缺點:如果兩個程序同時想進入臨界區,都設定了標誌,就導致了雙方都等待對方,結果誰也進不了臨界區,導致了飢餓現象。
每個程序在設定自己的標誌後再設定turn標誌,然後檢測另乙個程序的標誌和turn標誌。
#i程序 #j程序
flag[i]
=true;turn=j; flag[j]
=true;turn=i;
while
(flag[j]
&&turn==j)
;while
(flag[i]
&&turn==i)
;critical section; critical section;
flag[i]
=false; flag[j]
=false;
remainder section; remainder section;
優點:解決了飢餓現象。
缺點:違背讓權等待。
通過硬體支援實現臨界區問題的方法稱為低階方法,或稱元方法。
當乙個程序正在使用處理機執行它的臨界區**時,禁止一切中斷發生(關中斷),在執行完後再開中斷。
缺點:效率低,若乙個程序關中斷後不再開中斷,則系統可能因此終止。
testandset指令:
這條指令是原子指令,不會被中斷,其功能是讀出指定標誌後把該標誌設定為真。
為每個臨界資源設定乙個共享變數lock,true表示被占用,初值為false。
bool testandset
(bool *lock)
while
(testandset
(&lock));
critical section;
lock = false;
remainder section;
swap指令:
這條指令也是原子指令,不會被中斷,功能是交換兩個字的內容。
為每個臨界資源設定乙個共享變數lock,true表示被占用,初值為false。每個程序中再設定乙個區域性變數key,用於和lock交換資訊。
void
swap
(bool *a, bool *b)
key = true;
while
(key != false)
critical section;
lock = false;
remainder section;
硬體方法的優點:適用於任意數目的程序,單處理機或多處理機。
硬體方法的缺點:違反讓權等待,可能導致飢餓現象。
臨界區互斥
在考慮寫 之前應該先考慮我們要用什麼資料結構?以及該資料有什麼意義。p0 p1 在這裡,為了實現互斥使用了乙個共享變數turn。為什麼有效?在任意時刻turn的取值只能為0或1.因此條件while turn x 有且僅有乙個會被滿足,因而使得乙個程序得以訪問臨界區。至於turn被誰修改,什麼時候修改...
14臨界區互斥的硬體實現方法
1 臨界區互斥的硬體實現方法 提供了特殊的硬體指令,允許對乙個字中的內容進行檢測和修正,或者是對兩個字的內容進行交換等。2 中斷遮蔽方法 當乙個程序正在使用處理機執行它的臨界區 時,要防止其他程序再進入其臨界區訪問的最簡單方法是禁止一切中斷的發生。典型模式為 關中斷 臨界區 開中斷 這種方法限制了處...
臨界區的硬體互斥方案
臨界區互斥的硬體解決 基本硬體機制包括禁止中斷 test and set指令 swap指令。1 禁止中斷 這是最簡單的方法,程序一旦進入臨界區就禁止一切中斷,在離開臨界區前放開中斷,但是該方案有如下致命的弱點 將禁止一切中斷的權利賦予普通使用者,若使用者沒有開放中斷,系統的正常執行將受到影響。不適合...