作業系統筆記2.3
2.3 程序同步(訊號量)
1) 整型訊號量 訊號量定義為一個整型量; 根據初始情況賦相應的值; 僅能通過兩個原子操作來訪問。 P操作 wait(S): While S<=0 do no-op; S:=S-1; V操作 signal(S): S:=S+1; 2)記錄型訊號量 整型訊號量符合“有限等待”原則 signal釋放資源後,當CPU被分配給等待程序後,等待程序仍可繼續執行,可以符合“有限等待”。 但整型訊號量不符合“讓權等待”原則 整型訊號量的wait操作,當s ≤0時,當前程序會佔著CPU不斷測試; 訊號量原語不能被打斷,這個佔有CPU的程序會一直不斷的佔據CPU迴圈下去,陷入忙等。
- P、V操作也有所變化 不僅修改資源數,還要處理程序的阻塞、喚醒等操作。先修改資源數,再判斷處理。
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) 3)用訊號量實現司機和售票員的同步。 4)AND型訊號量 出現原因:一些應用往往需要兩個或多個共享資源,而不是前述的一個資源。程序同時要求的共享資源越多,發生死鎖可能性越大。
解決思想: 一次性分配給程序所需資源,用完一起釋放。Wait操作時對它所有需要的資源都要判斷,有AND條件,故稱“AND同步”、“同時wait”。 Swait(S1, S2, …, Sn) if (S1 >=1 and … and Sn>=1 )then for i:=1 to n do Si:= Si -1 ; endfor else 將程序阻塞在第一個不能滿足資源訊號量的佇列中。 endif Ssignal(S1, S2, …, Sn) for i:=1 to n do Si:= Si +1 ; 喚醒所以與si相關的阻塞程序 endfor 5)訊號量集
訊號量題目做題一般方法: 1.分析問題,找出同步、互斥關係 2.根據資源設定訊號量變數 3.寫出程式碼過程,並注意P、V操作的位置 4.檢查程式碼,模擬機器執行,體驗訊號量的變化和程式執行過程是否正確。