剛才讀書的時候看到了進程互斥的實現方法這一章,想到之前面試的時候被問到這一部分的內容,今天來整理總結一下。
-
軟件方法
- 單標志法
- 算法思想:兩個進程在訪問完臨界區后會把使用臨界區的權限轉交給另一個進程。也就是說每一個進程進入臨界區的權限只能被另一個進程賦予。
- 算法實現:
- 單標志法
-
-
- 該算法可以實現“同一時刻最多只允許一個進程訪問臨界區”。
- 單標志法存在的主要問題是:違背“空閑讓進”原則。因為如果是允許P1進入臨界區,但是P1一直不訪問臨界資源,那么雖然這個時候臨界區是空閑的,但是並不允許P0訪問。
-
-
- 雙標志先檢查法
- 算法思想:設置一個布爾型數組flag[],數組中各元素用來標記各進程想要進入臨界區的意思,比如“flag[0] = ture”意味着0號進程P0想要進入臨界區。每個進程進入臨界區之前先檢查當前有沒有別的想要進入臨界區的進程,如果沒有則把自身對應的標志falg[i]設為true,之后開始訪問臨界區。
- 算法實現:
- 雙標志先檢查法
-
-
- 雙標志法的主要問題是:違反“忙則等待”原則。其原因在於,進入區的“檢查”和“上鎖”兩個處理不是一氣呵成的。
- 雙標志后檢查法
- 算法思想:雙標志先檢查法的改進版。因為雙標志先檢查法存在的問題是“檢查”和“上鎖”不是一氣呵成的,因此導致了同時進入臨界區的問題。為了避免上述問題,人們想到了先“上鎖”后“檢查”的方法。
- 算法實現:
-
-
-
- 雙標志后檢查法雖然解決了“忙則等待”的問題,但是又違背了“空閑讓進”和“有限等待”原則,因此會導致各進程長期無法訪問臨界資源從而產生“飢餓”現象。
- Peterson算法
- 算法思想:結合雙標志法、單標志法的思想。單標志法存在的問題是,當前進程沒有使用臨界資源的意願,但是卻得到了使用臨界資源的權利,從而導致另一個想要使用臨界資源的進程沒辦法訪問正在空閑着的臨界資源。而雙標志后檢查法中當兩個進程都表達了想要使用臨界資源的意願后,由於雙方都不想放棄使用的意願,從而都沒辦法使用臨界資源。Peterson算法結合這兩種算法,只有當進程有想要使用臨界資源的意願時,才允許該進程進入臨界區(解決單標志法的不足);兩個進程在使用臨界資源之前先表達“謙讓”,最后一個表達“謙讓”進程放棄使用的權利(解決雙標志后檢查法的不足)。
- 算法實現:
-
-
-
- Peterson算法用軟件方法解決了進程互斥問題,遵循了空閑讓進、忙則等待、有限等待三個原則,但是依然未遵循讓權等待的原則。
-
-
硬件實現方法
- 中斷屏蔽方法
- 原理:利用“開/關中斷指令”實現(與原語的實現思想相同,即在某進程開始訪問臨界資源區到結束訪問為止都不允許被中斷,也就不能發生進程切換,因此也不可能發生兩個進程同時訪問臨界區的情況)
- 方法:
- 中斷屏蔽方法
-
-
- 優點:簡單、高效
- 缺點:不適用於多處理機;只適用於操作系統內核進程,不適用於用戶進程(因為開/關中斷指令只能在內核態運行)
- TestAndSet指令
-
-
-
- 原理:TS(或TSL)指令是硬件實現的,執行過程不能被中斷,只能一氣呵成。
- 方法:
-
-
-
- 優點:實現簡單,無需像軟件方法嚴格檢查是否有邏輯漏洞;適用於多處理機環境。
- 缺點:不滿足“讓權等待”原則,暫時無法進入臨界區的進程會占用CPU並循環執行TSL指令,從而導致“忙等”。
- Swap指令
-
-
-
- 原理:硬件實現,一氣呵成
- 方法:
-
-
-
- 優點:同TSL。
- 缺點:同TSL。
-
-
信號量機制
之前提到的兩種方法都無法實現“讓權等待”的原則,1965年,Dijkstra提出了信號量機制來解決這一問題。
信號量:就是一個變量,可以用信號量來表示系統中某種資源的數量。
原語:是一種特殊的程序段,其執行只能一氣呵成,不能被打斷。
-
- 整型信號量
- 定義:用一個整數型的變量作為信號量,用來表示系統中某種資源的數量。
- 實現方法:
- 整型信號量
-
-
- 缺點:仍然不能夠滿足“讓權等待”原則,會發生“忙等”。
- 記錄型信號量
- 定義:用記錄型數據結構表示的信號量。
- 實現方法:
-