6-1進程同步背景
1.生產者消費者問題
採用共享內存解決生產中消費者問題時,N個緩衝區最多隻能用N-1個,如何解決?
2.共享數據的一致性
①對共享數據的併發訪問可能導致數據的不一致性
②要保持數據的一致性,需要一種保證併發進程的正確執行順序的機制。
③競爭條件 race condition
若干併發的進程(線程)都可以訪問和操縱同一共享數據,從而執行結果取決於併發進程對這個數據的訪問次序。爲保證數據的一致性,需有同步機制來保證多個進程對共享數據的互斥訪問。
3.進程間的制約
①進程類型:協作進程,彼此影響;獨立進程,互斥。
②進程間資源的訪問衝突:共享變量的修改衝突;操作順序衝突。
③進程間的制約關係:
間接制約:資源互斥,進程競爭,進程的互斥
直接制約:進行協作,進程的同步
4.進程間的交互關係
互斥:多個進程不能同時使用同一個資源
同步:進程之間協作
死鎖:多個進程互不相讓,都得不到足夠資源
6-2 臨界區
1.臨界區的訪問過程
①對於臨界資源,多個進程必須互斥對它的進行訪問。
②臨界區(critical section):進程中訪問臨界資源的一段代碼。
③實現進程對臨界資源的互斥訪問——各進程互斥地進入自己的臨界區。
④假定一個系統中有n個進程(P0,P1,……,Pn)每個進程。
⑤當一個進程在臨界區中執行時,其他進程都不能進入臨界區。
2.進入區和退出區
①臨界區的執行在時間上互斥,進程必須請求允許進入臨界區。
②進入區(entry section):在進入臨界區之前,檢查可否進入臨界區的一段代碼。如果可進入,通常設置相應“正在訪問臨界區”標誌。
③退出區(exit section):用於將“正在訪問臨界區”標誌清除的一段代碼。
④剩餘區(remainder section):代碼中的其餘部分。
3.臨界區的解決方案——三個要求
①互斥 mutual exclusion
假定進程Pi在其臨界區內執行,其他任何進程將被排斥在自己的臨界區之外。
②有空讓進 progress
臨界區雖沒有進程只想,但有些進程需進入臨界區,不能無限期延長下一個需要臨界區進程的等待時間。
③有限等待 bounded waiting
在一個進程提出進入臨界區的請求和該請求得倒答覆的時間內,其他進程進入臨界區的次數必須是有限的。
4.如何實現進程間的互斥
①兩進程互斥的軟件方法——算法1
設立一個兩進程公用的整型變量turn:描述允許進入臨界區的進程標識。
有兩個進程Pi和Pj,如果turn == j,進程Pi允許在其臨界區執行。
缺點:強制輪流進入臨界區,沒有充分考慮進場的實際需要,容易造成資源利用不充分。進程1讓出臨界區之後,進程2進入臨界區之前,進程1無法再使用臨界區。
②算法2
設立一個標誌數組flag[]:描述進程是否準備進入臨界區,初值均爲FALSE。
優點:不用交替進入,可連續使用。
缺點:兩進程可能都進不了臨界區。
③算法3
turn=j,描述可進入的進程(同時修改標誌),在進入區修改後檢查,並檢查併發修改的先後:
檢查對方的flag,如不在臨界區則自己進入——空閒則進
否則再次檢查turn;先到先入,後到等待。
6-3信號量
OS可從進程管理者的角度處理互斥問題,信號量就是OS提供的管理公有資源的有效手段。
1.信號量——可用資源實體的數量 整型變量
①第一種 經典定義
除初始化外,僅能通過兩個不可分割(原子)的操作訪問。
P(S):
while S<=0 do no-op(等待,存在忙等,自旋鎖);
S--;
V(S):
S++;
②第二種 一種不需要等待的同步工具
P(S):
S--;
if S<0 do block(阻塞)
V(S):
S++;
if S<=0 then wake up(喚醒其他操作)
2.信號量更多知識 Semaphore
①S是臨界區內所使用公用資源有關的信號量。
P(S):表示申請一個資源
V(S):表示釋放一個資源②初始爲非負整數,表示空閒資源總數。
③在信號量經典定義下,S的值不可能爲負。
④後一種定義中:S>=0,可供進程使用的資源數
S<0,絕對值是正在等待進入臨界區的進程數。
3.利用信號量實現互斥
爲臨界資源設置一個互斥信號量,初值爲1。每個進程中將臨界區代碼置於P(S)和V(S)原語之間
P(S):
Critical Section();
V(S);
4.利用信號量來描述前趨關係
6-4 哲學家問題 Dining Philosophers Problems
1.問題
2.解答
可能會出現死鎖,五個人每個人拿起左邊筷子。
3.解決死鎖
①最多允許四個哲學家同時就坐
②同時拿起兩根筷子
③非對稱解決(單數座位號先拿左,雙數先拿右)
6-5生產者消費者問題(有限緩衝區問題)
1.問題描述:若干進程通過有限的共享緩衝區交換數據,“生產者”可不斷寫入,“消費者”不斷讀出,共享緩衝區共有N個;任何時刻只能有一個進程可對共享緩衝區進行操作。
2.採用信號量機制解決
①full是“滿”數目,初值爲0,empty是“空”數目,初值爲N。實際上,full + empty = N
②mutex用於訪問緩衝區時的互斥,初值爲1
③每個進程各個P操作的次序是重要的:先檢查資源數目,再檢查是否互斥——否則可能死鎖(兩種P操作)
6-6 讀寫問題
1.問題描述:對共享資源的讀寫操作,任一時刻“寫者”最多允許一個,而“讀者”允許多個。
①互斥 “讀——寫”
②互斥 “寫——寫”
③允許 “讀——讀”
2.如果讀者來:
①無讀者、寫者,新讀者可以讀。
②有寫者等,但有其他讀者正在讀,則新讀者也可以讀。
③有寫者寫,新讀者等。
3.如果寫者來:
①無讀者,新寫者可以寫。
②有讀者,新寫者等待。
③有其他寫者,新寫者等待。
4.採用信號量機制
①信號量Wmutex表示“允許寫”,初值爲1
②公共變量Rcount表示“正在讀”的進程數,初值爲0
③信號量Rmutex表示Rcount的互斥操作,初值是1
5.PV操作討論總結
1.①S>0 表示有S個資源可用
②S=0 表示無資源可用
③S<0 則|S|表示S等待隊列中的進程個數
④P(S) 表示申請一個資源
⑤V(S) 表示釋放一個資源
⑥信號量初始值應大於0
2.①PV操作必須成對出現,有一個P操作就一定有一個V操作。
②互斥問題:PV操作處於同一進程
同步問題:PV操作不在同一進程。
③對於前後相連的兩個P(S1)和P(S2),順序是至關重要的,同步P操作應該放在互斥P操作之前。
本文知識以及圖片來源:慕課_操作系統原理_田麗華
網址:https://www.icourse163.org/learn/XJTU-1003409001?tid=1206408203#/learn/content