第二章 處理器管理(第二部分)
2.11 進程互斥的軟件實現方法
2.11.1 單標誌法
算法思想:兩個進程早訪問完臨界區後會把使用臨界區的權限轉交給另一個進程。也就是說每個進程進入臨界區的權限只能被另一個進程賦予。
實現同一時刻最多隻允許一個進程訪問臨界區。
主要問題:不遵循“空閒讓進”原則
2.11.2 雙標誌先檢查
算法思想:設置一個布爾型數組flag[],數組中各個元素用來標記各進程想進入臨界區的意願。每個進程再進入臨界區之前先檢查當前有沒有別的進程想進入臨界區,如果沒有,則把自身對應的標誌flag[i]設置爲true,之後開始訪問臨界區。
主要問題:不遵循“忙則等待”原則
2.11.3 雙標誌後檢查
前一個算法的問題是先“檢查”後“上鎖”,但是這兩個操作又無法一氣呵成,因此導致了兩個進程同時進入臨界區的問題。
算法思想:雙標誌先檢查法的改版。先“上鎖”後“檢查”
主要問題:不遵循“空閒讓進、有限等待”原則,可能導致“飢餓”
2.11.4 Peterson算法
算法思想:如果雙方都爭着想進入臨界區,那可以讓進程嘗試主動讓對方先使用臨界區。
**主要問題:**不遵循“讓權等待”原則,會發生“忙等”
2.12 進程互斥的硬件實現方法
2.12.1 中斷屏蔽方法
實現:利用“開/關中斷指令”
優點:簡單、高效
缺點:不適合用於多處理機;只適用於操作系統內核進程,不適用於用戶進程
2.12.2 TestAndSet(TS指令/TSL指令)
簡稱TS指令,也有地方稱爲TestAndSetLock指令,或TSL指令。TSL指令時用硬件實現的,執行的過程不允許被中斷,只能一氣呵成。
實現:old記錄是否已被上鎖;再將lock設爲true;檢查臨界區是否已被上鎖。
優點:實現簡單,無需像軟件實現方法那樣嚴格檢查釋放會有邏輯漏洞,適用於多處理機環境
缺點:不滿足“讓權等待”原則,暫時無法進入臨界區的進程會佔用CPU並循環執行TSL指令,從而導致“忙等”
2.12.3 Swap指令(XCHG指令)
實現:與TSL指令並無太大區別
優點:實現簡單,無需像軟件實現方法那樣嚴格檢查釋放會有邏輯漏洞,適用於多處理機環境
缺點:不滿足“讓權等待”原則,暫時無法進入臨界區的進程會佔用CPU並循環執行TSL指令,從而導致“忙等”
2.13 信號量機制
2.13.1 整型信號量
用一個整數型變量作爲信號量,數值表示某種資源數
整型信號量與普通變量的區別:對信號量只能執行初始化、P、V三種操作
整型信號量存在的問題:不滿足讓權等待原則
2.13.2 記錄型信號量
S.value表示某種資源數,S.L指向等待該資源的隊列
P操作中,一定是先S.value–,之後可能需要執行block原語
V操作中,一定是先S.value++,之後可能需要執行wakeup原語
注意:要能夠自己推斷再什麼條件下需要執行block(當前允許的進程從運行態—>阻塞態)或wakeup(被喚醒進程從阻塞態—>就緒態)
作用:用記錄型信號量實現系統資源的“申請”和“釋放”、進程互斥、進程同步
2.13.3 實現進程互斥
實現進程互斥的步驟:
1、分析併發進程的關鍵活動,劃定臨界區
2、設置互斥信號量mutex。初始值爲1
3、在臨界區之前執行P(mutex)
4、在臨界區之後執行V(mutex)
注意:對不同的臨界資源需要設置不同的互斥信號量。P、V操作必須成對出現。
2.13.4 實現進程同步
讓各併發進程按照要求有序地推進
實現進程同步的步驟:
1、分析什麼地方需要實現“同步關係”,即必須保證“一前一後”執行的兩個操作
2、設置同步信號量S,初始爲0
3、在“前操作”之後執行V(S)
4、在“後操作”之前執行P(S)
2.13.5 實現進程的前驅關係
每一對前驅關係都是一個進程同步問題。
實現步驟:
1、分析問題,畫出前驅圖,把每一對前驅關係都看成一個同步問題
2、爲每一對前驅關係設置同步信號量,初值爲0
3、在“前操作”之後執行V操作
4、在“後操作”之前執行P操作
2.14 生產者消費者問題
2.15 多生產者多消費者
2.16 吸菸者問題
2.17 讀者-寫者問題
2.18 哲學家進餐問題
2.19 管程
2.19.1 引入管程的原因
解決信號量機制編程麻煩、易出錯的問題
2.19.2 管程的定義與基本特徵
管程的定義
管程是一種特殊的軟件模塊,有這些 部分組成:
1、局部與管程的共享數據結構說明
2、對該數據結構進行操作的一組過程
3、對局部於管程的共享數據設置初始值的語句
4、管程有一個名字
基本特徵
1、局部於管程的數據只能被局部於管程的過程所訪問
2、一個進程只有通過調用管程內的過程才能進入管程訪問共享數據
3、每次僅允許一個進程在管程內執行某個內部過程
2.19.3拓展
2.20 死鎖的概念
2.20.1 死鎖的定義
各進程互相等待對方手裏的資源,導致各進程都阻塞,無法向前推進
2.20.2 進程死鎖、飢餓、死循環的區別
2.20.3 死鎖產生的必要條件
產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。
1、互斥條件:只有對必須互斥使用的資源的爭搶纔會導致死鎖
2、不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放
3、請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他進程佔有,此時請求進程被阻塞,但又對自己已有的資源保持不放
4、循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程所請求
注意:發生死鎖時一定有循環等待,但是發生循環等待時未必死鎖。
2.20.4 發生死鎖的時間
1、對系統資源的競爭。各進程對不可剝奪的資源的競爭可能引起死鎖,對可剝奪的資源的競爭是不會引起死鎖的。
2、進程推進順序非法。請求和釋放資源的順序不當,也同樣會導致死鎖。
3、信號量的使用不當也會造成死鎖。
2.20.5 死鎖的處理策略
1、預防死鎖。破壞死鎖產生的四個必要條件中的一個或多個
2、避免死鎖。用某種方法防止進入不安全狀態,從而避免死鎖
銀行家算法
3、死鎖的檢測和解除。允許死鎖的發生,不過操作系統會負責檢測出死鎖的發生,然後採取某種措施解除死鎖。