麵包房演算法在程序同步中的應用


在討論程序同步中的麵包房演算法之前,您需要先了解“程序同步”、“臨界區”和“程序間通訊”這些術語。

什麼是程序同步?

在多程序系統中,程序同步是一種協調多個程序執行的方法,它確保所有程序以受控且可預測的方式訪問共享資源。

程序同步的主要目標是避免系統中的競爭條件問題。儘管如此,它還可以解決併發系統中許多其他與同步相關的的問題。因此,程序同步確保多個程序訪問共享資源時不會相互干擾。它還可以防止由於併發訪問導致資料不一致的可能性。

程序同步中的臨界區

在程序同步中,臨界區是程式中必須一次只由一個程序獨佔執行的部分。在臨界區中,共享資源(例如硬體裝置、資料結構、變數等)必須在併發程序之間同步,以確保一致性。

我們使用不同的程序同步技術,如訊號量、互斥鎖等,來確保一次只有一個程序訪問臨界區。這些同步技術提供互斥訪問,並確保一次只有一個程序可以進入臨界區。

什麼是程序間通訊 (IPC)?

程序間通訊是一種允許在計算機上執行的不同程序相互通訊並共享資料和資源的技術。在多程序系統中,程序間通訊是現代作業系統的重要組成部分。

有各種方法可以實現程序間通訊,例如共享記憶體、套接字、管道、訊息佇列和遠端過程呼叫 (RPC)。每種方法都有其自身的優缺點,方法的選擇取決於應用程式的需求。

瞭解了這些基本術語之後,現在讓我們討論程序同步中的麵包房演算法。

麵包房演算法在程序同步中的應用

麵包房演算法是一種簡單的程序同步演算法,用於防止程式或作業系統臨界區中的競爭條件問題。

麵包房演算法是一種互斥演算法。因此,它允許多個程序以正確的方式訪問程式的臨界區。該演算法透過為每個請求訪問臨界區的程序分配一個唯一的編號來執行。

麵包房演算法基於先進先出 (FIFO) 的原則。因此,編號最小的程序優先訪問臨界區。如果兩個或多個程序被分配了相同的編號,則程序ID較低的程序優先。

在此演算法中,維護兩個陣列,一個數組是標誌,指示程序當前正在請求進入臨界區;另一個數組是編號,指示程序請求進入臨界區的順序。

當一個程序請求訪問臨界區時,它首先將其標誌設定為 true,然後選擇陣列中最大的數字,並將其加一來獲得自己的唯一編號。然後,此程序等待獲得對臨界區的訪問許可權。

當程序進入臨界區後,其標誌將設定為 false,這表示此程序不再需要訪問臨界區。因此,程序釋放其編號,以便其他程序可以使用它。

從根本上說,程序同步中的麵包房演算法確保沒有兩個程序可以同時訪問臨界區。然而,麵包房演算法並非沒有飢餓問題,即在此演算法中,如果分配的編號過高,程序可能不得不無限期地等待。

麵包房演算法資料結構

choosing [0 … n-1] number [0 … n-1] While (true){
   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 and (number [j], j) < (number [i], i)
      {};
   }
   critical section number [i] = 0; remainder section
}

說明 - 以上程式碼的執行解釋如下:

最初,程序將其“choosing”變數設定為 true,表示它打算進入臨界區。之後,根據其他程序分配給它一個最大編號。“choosing”變數隨後設定為 false,表示它已分配了一個編號。這是麵包房演算法最重要的部分。

程式碼前三行的目的是,如果一個程序正在修改其編號,則此時不允許其他程序檢查其現已失效的舊編號。之後,檢查程序的編號,編號最小或程序 ID 最小的程序進入臨界區。

結論

總之,麵包房演算法是一種簡單有效的程序同步演算法,可用於多程序系統中同步對程式碼中臨界區的訪問。此演算法的實現簡單易懂,不需要複雜的資料結構和硬體支援。

麵包房演算法確保所有程序都有公平的機會訪問臨界區。麵包房演算法的另一個主要優點是可擴充套件性,這意味著它可以處理任意數量的程序而不會降低效能。因此,麵包房演算法是一種高效可靠的互斥演算法,用於程序同步以避免臨界區問題。

更新於:2023年4月4日

2000+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告