併發性:互斥和同步、死鎖和飢餓
阿新 • • 發佈:2018-12-29
一、與併發相關的關鍵術語:
- 原子操作:要保證指令的序列作為一個組來操作執行,要麼都不執行;要麼執行要直接執行到指令完畢,中間不能中斷
- 臨界區:是一段程式碼,在這段程式碼中程序將訪問共享資源,當有一個程序在這段程式碼中執行時,其他程序不能在這段程式碼中執行
- 死鎖:兩個或兩個以上的程序因其中的每個程序都在等待其他程序做完某些事情而不能繼續執行,這種情形稱為死鎖
- 互斥:當一個程序在臨界區訪問共享資源時,其他程序不能進入該臨界區訪問任何共享資源,這種情形稱為互斥
- 同步:同步是在互斥的基礎上(大多數情況),通過對其他機制實現訪問者對資源的有序訪問
- 飢餓:指一個可執行的程序儘管能繼續執行,但被排程程式無限期地忽視,而不能排程執行的情形
- 競爭條件:多個執行緒或程序在讀寫一個共享資料時,結果依賴於它們執行的相對時間,這種情形稱為競爭條件
二、併發的原理
在單處理器多道程式設計系統中,程序被交替執行,表現出一種併發執行的外部特徵。即使不能實現真正的並行處理,並且在程序間來回切換也需要一定的開銷,交替執行在處理效率和程式結構上還是帶來了重要的好處。在多處理器系統中,不僅可以交替執行程序,而且可以重疊執行程序。
三、程序的互動
我們可以根據程序相互之間知道對方是否存在的程度,對程序的互動方式進行分類:
- 程序之間不知道對方的存在
- 程序間接知道對方的存在(如共享物件)
- 程序直接知道對方的存在(他們有可用的通訊原語)
四、互斥
互斥的要求:
- 必須強制實施互斥:在與相同資源或共享物件的臨界區有關的所有程序中,一次只允許一個程序進入臨界區
- 一個在非臨界區停止的程序不能干涉其他程序
- 決不允許出現需要訪問臨界區的程序被無限延遲的情況,即不會死鎖或飢餓
- 當沒有程序在臨界區時,任何需要進入臨界區的程序必須能夠立即進入
- 對相關程序耳朵執行速度和數目沒有任何要求和限制
- 一個程序駐留在臨界區中的時間必須是有限的
實現互斥的幾種方法:中斷禁用;專用機器指令;訊號量;管程;訊息傳遞
- 中斷禁用
只適用於單處理器,而且該方法代價非常高,執行效率低下 - 專用機器指令
比較和交換指令,適用於單處理器或共享記憶體的多處理器
非常簡單且易於證明
但是使用了忙等待(消耗 CPU 時間)可能飢餓和死鎖 - 訊號量
P、V操作:
P、V操作必須成對出現,處理互斥時出現在同一程序中,處理同步時出現在不同程序中
同步 P 操作先於互斥 P 操作的呼叫,V 的順序無關緊要
互斥訊號量一般初始值為 1 - 管程
區域性資料變數只能被管程的過程訪問,任何外部程式都不能訪問
一個程序通過呼叫管程的一個過程進入管程
在任何時候,只能有一個程序在管程中執行,呼叫管程的任何其他程序都被阻塞,以等待管程可用 - 訊息傳遞
訊息傳遞有一個優點:它可在分散式系統、共享記憶體的多處理系統和單處理系統中實現
訊息傳遞的實際功能以一對原語的形式提供:send 與 recrvive
一般使用無阻塞 send 和 阻塞 receive 這一組搭配
五、死鎖
資源通常可以分為兩類:可重用資源和可消耗資源。
可重用資源:指一次只能供一個程序安全地使用,並且不會由於使用而耗盡的資源。
可消耗資源:可以被建立和銷燬的資源。通常對某種型別可消耗資源的數目沒有限制,一個無阻塞的生產程序可以建立任意數目的這類資源。當消費程序得到一個資源時,該資源就不再存在了。
死鎖的原因:競爭資源,程序推進順序不當。
死鎖的條件:
- 互斥(必要條件):一次只有一個程序可以使用一個資源
- 佔有且等待(必要條件):當一個程序等待其他程序時,繼續佔有已經分配的資源
- 不可搶佔(必要條件):不能搶佔程序已經佔有的資源
- 迴圈等待(非必要條件):存在一個封閉的程序鏈,使得每個程序至少佔有此鏈中下一個程序所需要的一個資源
死鎖預防:試圖設計一種系統來排除發生死鎖的可能性。
間接的死鎖預防方法:防止三個必要條件的任何一個發生。
直接的死鎖預防方法:防止迴圈等待的發生
死鎖避免:兩種死鎖避免方法。
- 如果一個程序的請求會導致死鎖,則不啟動此程序
- 如果一個程序增加的資源請求會導致死鎖,則不允許此分配(銀行家演算法)
優點:不需要死鎖預防中的搶佔和回滾程序,比死鎖預防限制少
缺點:
- 必須事先宣告每個程序請求的最大資源
- 執行順序不能有任何同步限制
- 分配資源數目必須固定
- 在佔有資源時,程序不能退出
死鎖檢測:檢測時機:
- 當程序因申請資源而等待時檢測死鎖(系統開銷大)
- 定時檢測
- 系統資源利用率下降時檢測
檢測時機處決於:死鎖發生的頻率,死鎖影響的程序數量。