作業系統 第二章 3 程序同步
1、程序同步:
使併發執行的諸程序之間能有效地共享資源和相互合作,從而使程式的執行具有可再現性。
多個相互合作的程序,在一些關鍵點上可能需要互相等待或互相交換資訊,這種相互制約關係稱為程序同步關係
互斥:當一個程序進入臨界區使用臨界資源時,另一個程序必須等待,直到佔用臨界資源的程序退出臨界區,我們稱程序之間的這種相互制約關係為“互斥”。
2、臨界區:
每個程序中訪問臨界資源的那段程式碼叫臨界區。 為了正確同步,對臨界區的程式碼要增加控制。
進入區:對欲訪問的臨界資源進行檢。若此刻未被訪問,設正在訪問的標誌 。不被打斷,防止同步中的問題出現。
臨界區:訪問臨界資源的程式碼。
退出區:將正在訪問的標誌恢復為未被訪問的標誌
剩餘區:其餘部分
3、臨界資源:
一次僅允許一個程序使用的資源。
ep:
1+1不等於2的問題:
共享資源x應按臨界資源處理,
一個程序還沒用完前不能讓其他程序使用
4、同步機制原則
- 空閒讓進:資源使用最基本原則
- 忙則等待:保證互斥
- 有限等待:合適時被喚醒防止死等
- 讓權等待:能主動釋放CPU防止忙等
5、舉個栗子
6、同步控制關鍵:
不應被打斷(原語,OS核心態執行),不被打斷的進行標誌值的判斷和修改
7、訊號量機制
7.1 整型訊號量
* P操作 wait(S):
S=S-1;
* V操作 signal(S): S=S+1;
s是整型訊號量,只能用於wait、signal,不能s=s+1,但可以賦值。s的值不會小於等於-2.
ep:
初始化s=1;
1)程式1:s=1,執行wait(s),s=1,s不符合while,不執行空操作,往下執行s--,—> s=0 —> 使用R
2)設此時程式2也申請使用R :s=0,符合while —> 空操作,不能使用R
3)當程式2時間片耗完,則會轉到程式1 —>執行signal —> s=s+1=1
4)程式1,執行完轉回接著執行程式2,—>執行程式2的while —> 條件不符合while —>執行s-- —>使用R —>執行signal
整型訊號量的wait操作,當s ≤0時,當前程序會佔著CPU不斷測試; 訊號量原語不能被打斷,這個佔有CPU的程序會一直不斷的佔據CPU迴圈下去,陷入忙等。
整型資訊量可以控制同步,符合“有限等待”原則,不符合“讓權等待”原則,效率低,使用使用用記錄型訊號量。
7.2 記錄型訊號量
P操作 wait(): S.value = S.value - 1;
if S.value < 0 then block(S.L)
V操作 signal(): S.value = S.value + 1;
if S.value <= 0 then wakeup(S.L)
ep:
初始化s.value=1;
1)程式1:s=1,執行wait(s),s.value=s.value-1=0,不符合if,不執行if,往下執行使用R
2)設此時程式2也申請使用R :執行wait—> s.value=s.value-1=-1,符合 if條件—> 被block,不能使用R —>跳回程式1
3)程式1:執行signal (s.value=s.value+1=0) —>符合if條件 —> wakeup(s.l)—> 轉回執行程式2
4) 轉回接著執行程式2(因為是if,使用轉回執行程式2,直接執行if下一條指令),—>使用R —>執行signal(s.value=1,不符if,執行結束)
8、訊號量
只能被訊號量原語操作(wait、signal),在原語內通過判斷,控制是否操作,起程式控制作用,用於程序控制的變數。