作業系統之併發性:互斥和同步1
併發是所有問題的基礎,也是操系統設計的基礎。併發包括很多設計問題,如程序間通訊、資源共享與競爭、多個程序活動的同步以及分配給程序的處理器時間等(P140)
多處理器環境,分散式處理器環境,
一. 處理器的多道程式設計
1.單處理器的多道程式設計:程序交替執行,表現出一種併發的外部特徵。即使不能真正並行處理,並且在程序間切換也需要一定開銷,交替執行在處理效率和程式結構上還是帶來了好處。
2.多處理器系統環境:不僅可以交替執行程序,還可以重疊執行。
二.關於併發
併發發生場景
併發會在以下三種不同的上下文中出現:多個應用程式,結構化應用程式,作業系統結構。
併發產生的基本需求
支援併發程序的基本需求是加強互斥能力。也就是說,當一個程序被授予互斥能力時,那麼在其活動期間,它具有排斥所有其他程序的能力。
互斥解決方案:訊號量,管程,訊息傳遞
三.產生併發的原理
多道程式設計系統的一個基本特性:程序的相對執行速度不可預測,取決於其他程序活動、作業系統中斷方式以及作業系統的排程策略。
多道程式設計系統特性引發相關問題:
1.全域性資源的共享充滿危險(不同的讀寫執行順序非常關鍵)
2.作業系統很難對資源進行最優化分配(容易發生死鎖)
3.定位程式設計錯誤困難(結果不確定性與不可再現)
相關例子
共享變數的問題例子:問題的本質在於共享全域性變數。多個程序訪問這個全域性變數,如果一個程序修改了它,然後被中斷,另一個程序可能在第一個程序使用它的值之前又修改了這個變數。
兩類問題:
1.在單處理器系統的情況下,出現問題的原因是中斷可能會在程序中的任何地方停止指令的執行;
2.在多處理器系統的情況下,不僅同樣的條件可以引發問題,而且當兩個程序同事執行並且都試圖訪問同一個全域性變數時,也會引發問題。
解決思路:控制對共享變數的訪問。上面的例子說明,如果需要保護共享的全域性變數(及其他共享的全域性資源),唯一的辦法是控制訪問該變數的程式碼。如果我們定義了一條規則,一次只允許一個程序進入 echo,並且只有在 echo 過程允許結束後,他才對另一個程序是可用的,那麼剛才討論的那類問題就不會發生了。
四. 競爭條件
競爭條件發生在多個程序或執行緒讀寫資料時,其最終的結果依賴於多個程序的指令執行順序。
作業系統關注的問題
- 作業系統必須能夠跟蹤不同的程序;
- 作業系統必須為每個活躍的程序分配和釋放各種資源;
- 作業系統必須包含每個程序的資料和物理資源,避免其他程序的無意干涉;
- 一個程序的功能和輸出結果必須與其相對於其他併發程序的執行速度無關。
五.程序的互動
三種方式:
- 程序之間相互不知道對方的存在(競爭情況);
- 程序通過共享某些物件的方式間接知道對方的存在(合作行為);
- 程序之間知道對方的存在(這些程序可以通過程序ID互相通訊即合作行為)。
1.程序間的資源競爭
當併發程序競爭使用同一組員時,他們之間會發生衝突。競爭程序間沒有任何資訊交換,但是一個程序的執行可能會影響到競爭程序的行為。
競爭程序面臨的三個控制問題:
a)互斥的要求:競爭程序僅可以訪問一個臨界資源(一次僅有一個程序可以訪問臨界資源),併發機制必須滿足一次只有一個程序可以訪問臨界資源這個規則。假設兩個或更多的程序需要訪問一個不可共享的資源,我們把這類資源稱為臨界資源,使用臨界資源的那一部分程式稱為程式的臨界區。
b)死鎖 :如果競爭程序需要唯一的訪問多於一個資源,並且當一個程序控制著一個程序,且在等待另一個程序,死鎖可能發生。
c)飢餓:一組程序的一個可能會無限期地拒絕進入到一個需要資源,因為其他成員組成壟斷這個資源。
2.程序間通過共享合作
多個程序可能訪問一個共享變數、共享檔案或資料庫,程序可能使用並修改共享變數而並不涉及其他程序,但卻知道其他程序也可能訪問同一個資料。因此,這些程序必須合作,以確保它們共享的資料得到正確的管理。
由於資料儲存在資源中,因此再次涉及有關互斥、死鎖和飢餓等控制問題。唯一的卻別是可以以兩種不同的模式(讀和寫)訪問資料項,並且只有寫操作必須保持互斥。
對於資料一致性的要求,在通過共享進行合作的情況下,臨界區的概念是非常重要的。
3.程序間通過通訊合作
當程序通過通訊進行合作時,各個程序都與其他程序進行連線,通訊提供了同步和協調各種活動的方法。
六. 互斥問題
實現互斥的互斥要求
- 必須強制實施互斥:在具有關於相同資源或共享物件的臨界區的所有程序中,一次只允許一個程序進入臨界區。
- 一個在臨界區停止的程序必須不干涉其他程序。
- 絕不允許出現一個需要訪問臨界區的程序被無限延遲的情況,即不會餓死或飢餓。
- 當沒有程序在臨界區中時,任何需要進入臨界區的程序必須能夠立即進入。
- 對相關程序的速度和處理器的數目沒有任何要求和限制。
- 一個程序駐留在臨界區中的時間是有限的。
為滿足互斥條件的幾種方法
- 軟體方法:讓由併發執行的程序擔負實現互斥的責任,這類程序,不論是系統程式還是應用程式,都需要與另一個程序合作,二不需要程式設計語言或作業系統通過任何支援來實施互斥。
- 第二種方法涉及專門的機器指令。
- 在作業系統貨程式設計語言中提供某種級別的支援。