1. 程式人生 > >作業系統第二章第三節

作業系統第二章第三節

程序同步

-理解同步的含義 -訊號量機制控制程序同步 -管程

程序間有什麼相互影響? 兩種制約關係: 間接相互制約關係:主要源於資源共享,表現為 程序A—印表機資源—程序B(互斥) 直接相互制約關係:主要源於程序合作,表現為 程序A寫緩衝—程序B讀緩衝(有序)

1.程序同步的基本概念 (1)程序同步的主要任務:使併發執行的諸程序之間能有效地共享資源和相互合作,從而使程式的執行具有可再現性。 (2)臨界資源(一次僅允許一個程序使用的資源。) 互斥:在作業系統中,當一個程序進入臨界區使用臨界資源時,另一個程序必須等待,直到佔用臨界資源的程序退出臨界區,我們稱程序之間的這種相互制約關係為“互斥”。 同步:多個相互合作的程序,在一些關鍵點上可能需要互相等待或互相交換資訊,這種相互制約關係稱為程序同步關係。可理解為“有序”。 如:生產和消費的“有序”關係靠對counter的正確判斷達到,而對counter的修改必須“互斥”修改。 (3)臨界區 每個程序中訪問臨界資源的那段程式碼叫臨界區。 為了正確同步,對臨界區的程式碼要增加控制 進入區:對欲訪問的臨界資源進行檢。若此刻未被訪問,設正在訪問的標誌 臨界區:訪問臨界資源的程式碼。 退出區:將正在訪問的標誌恢復為未被訪問的標誌 剩餘區:其餘部分 (4)同步機制應遵循的規則 實現互斥的方法應符合如下每條原則 空閒讓進:資源使用最基本原則 忙則等待:保證互斥 有限等待:合適時被喚醒防止死等 讓權等待:能主動釋放CPU防止忙等 同步控制的關鍵:主要涉及”判斷”和”修改標誌”操作 -不應被打斷(原語,OS核心態執行) -如何制定一種寫法,使標誌的使用適用於各種具體應用情況? 硬體同步機制 ①關中斷:進入鎖測試前關閉中斷,直到完成鎖測試並上鎖後才能開啟中斷。程序在臨界區執行期間,系統不響應中斷,從而不引發排程。 缺點:濫用風險;關中斷時間過長會影響效率,限制CPU交叉執行能力;不適用於多CPU系統 ②Test-and-Set指令 boolean TS(boolean *lock) { Boolean old; old=*lock; *lock=TRUE; return old; } *一個不可分割的原語 ///////////////////////////////////////////////////// 為一個臨界資源設定一布林變數lock,初值為false do{ … while TS(&lock) ; critical section; lock=FALSE; remainder section; }while(TRUE); ③利用Swap指令實現程序互斥 對換指令(intel 80x86中稱XCHG指令),用於交換兩個位元組的內容 void swap(boolean *a, boolean *b) {boolean temp; temp=*a; *a=*b; *b=temp; } ////////////////////////////////////////////////////// 為臨界資源設定一個全域性布林變數lock=false。每個程序一個區域性布林變數key。 do{ key=TRUE; do{ swap(&lock,&key); }while(key!=FALSE); 臨界區操作; lock=FALSE; 剩餘區; }while(TRUE);

2.訊號量機制 (1)整型訊號量 最初的訊號量機制,兩個原子操作對一個共享整型量進行操作。 訊號量定義為一個整型量; 根據初始情況賦相應的值; 僅能通過兩個原子操作來訪問。 P操作 wait(S): While S<=0 do no-op; S:=S-1; V操作 signal(S): S:=S+1;