這是最簡單的同步機制。 這是一個在使用者模式下實現的軟體機制。 這是一個繁忙的等待解決方案,可用於兩個以上的進程。
在這個機制中,使用了鎖變數lockis
。 兩個鎖定值是可能的,可以是0
或1
。鎖定值0
表示臨界區域是空的,而鎖定值1
表示它被占用。
想要進入臨時部分的進程首先檢查鎖定變數的值。 如果它是0
,那麼它將鎖的值設定為1
並進入臨界區,否則等待。
該機制的虛擬碼如下所示。
Entry Section →
While (lock! = 0);
Lock = 1;
//Critical Section
Exit Section →
Lock =0;
如果我們看一下虛擬碼,發現程式碼中有三個部分。 入口部分,臨界區和退出部分。
最初鎖定變數的值為0。需要進入臨界區的進程進入入口區並檢查while迴圈中提供的條件。
該進程將無限等待,直到鎖定值為1(while迴圈暗示該值)。 因為在第一次臨界區是空的,因此該過程將通過將鎖變數設定為1而進入臨界區。
當進程從臨界區退出時,在退出部分,它將鎖的值重新指定為0。
每個同步機制是根據四個條件來判斷的。
在四個引數中,互斥和進度必須由任何解決方案提供。在上述條件的基礎上分析這個機制。
在某些情況下,鎖定變數機制不提供互斥。 這可以通過作業系統檢視I.E,檢視虛擬碼來更好地描述。 程式的組合程式碼。 讓我們將程式碼轉換為組合語言。
考慮一下有兩個進程P1和P2。 過程P1想要執行其臨界區。 P1進入入口部分。 由於鎖的值為0,因此P1將其值從0更改為1並進入臨界區。
同時,P1被CPU搶占,P2被安排。 現在臨界區沒有其他進程,並且鎖變數的值為0。 P2還想執行其臨界區。 它通過將lock變數設定為1進入臨界區。
現在,CPU將P1的狀態從等待改為執行。 P1尚未完成其臨界區。 P1已經檢查了鎖定變數的值,並且在先前檢查它時記得其值為0。 因此,它也會進入臨界區而不檢查鎖定變數的更新值。
現在,在臨界區有兩個進程。 根據相互排斥的條件,臨界區中的一個以上的過程不得同時出現。 因此,鎖定變數機制不能保證互斥。
鎖變數機制的問題在於,同時,多個進程可以看到空標籤,並且在臨界區中可以輸入多個進程。 因此,鎖變數不提供互斥,這就是為什麼它不能被普遍使用。
因為這種方法在基本步驟上失敗了; 因此,沒有必要談談要實現的其他條件。