鎖定變數機制


這是最簡單的同步機制。 這是一個在使用者模式下實現的軟體機制。 這是一個繁忙的等待解決方案,可用於兩個以上的進程。

在這個機制中,使用了鎖變數lockis。 兩個鎖定值是可能的,可以是01。鎖定值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,檢視虛擬碼來更好地描述。 程式的組合程式碼。 讓我們將程式碼轉換為組合語言。

  1. Load Lock, R0
  2. CMP R0, #0
  3. JNZ Step 1
  4. Store #1, Lock
  5. Store #0, Lock

考慮一下有兩個進程P1和P2。 過程P1想要執行其臨界區。 P1進入入口部分。 由於鎖的值為0,因此P1將其值從0更改為1並進入臨界區。

同時,P1被CPU搶占,P2被安排。 現在臨界區沒有其他進程,並且鎖變數的值為0。 P2還想執行其臨界區。 它通過將lock變數設定為1進入臨界區。

現在,CPU將P1的狀態從等待改為執行。 P1尚未完成其臨界區。 P1已經檢查了鎖定變數的值,並且在先前檢查它時記得其值為0。 因此,它也會進入臨界區而不檢查鎖定變數的更新值。

現在,在臨界區有兩個進程。 根據相互排斥的條件,臨界區中的一個以上的過程不得同時出現。 因此,鎖定變數機制不能保證互斥。

鎖變數機制的問題在於,同時,多個進程可以看到空標籤,並且在臨界區中可以輸入多個進程。 因此,鎖變數不提供互斥,這就是為什麼它不能被普遍使用。

因為這種方法在基本步驟上失敗了; 因此,沒有必要談談要實現的其他條件。