程序同步包括程序的互斥和程序的同步兩個方面,是作業系統管理共享資源的一種手段。從考試情況來看,許多考生對這部分知識掌握的不好,理解的不透。用pv 操作解決程序同步問題時首先應確定問題是屬於程序互斥還是程序同步,或是互斥與同步的混合問題。然後根據共享資源的數量以及使用共享資源的規則正確的定義訊號量及其初值。然後決定在不同訊號量上應實施的p操作和v操作,用這些p操作和v操作保證併發程序正確地使用共享資源。下面我們就一些考題做一些分析,讓考生在分析中理解程序同步,掌握程序同步。
用pv操作實現程序的互斥
用pv操作實現程序的互斥,只要用乙個訊號量與一組相關臨界區聯絡起來,訊號量的初值定義為「1」。每個程序要進入臨界區之前呼叫p操作,測試自己是否可以立即進入臨界區;執行完臨界區的程式段後,呼叫v操作表示自己退出臨界區。
例題:觀察者和報告者是兩個併發執行的程序,觀察者不斷觀察並對通過的卡車計數,報告者定時的將觀察者的計數值列印,兩個程序併發執行的程式如下:
begin
count:integer;
count:=0;
cobegin
process observer
begin
l1: observe a car;/*觀察到一輛卡車*/
count:=count+1;
goto l1
end;
process reporter
begin
l2:print count;
count:=0;
goto l2
end;
coend;
end;
請用pv操作進行管理使其不產生與時間有關的錯誤。
分析:觀察者和報告者共享了變數count,觀察者程序的臨界區是「count:=count+1」,報告者程序的臨界區是「print count; count:=0」。按給出的程式,對臨界區的執行沒有限制,當它們併發執行時對共享變數count會出現如下三種操作序列:
count:=count+1; print count;count:=0;
print count;count:=count+1;count:=0;
print count;count:=0;count:=count+1;
按第一、二種序列執行時,總能把觀察者在一段時間裡觀察到的卡車數正確列印出來,然後再重新開始計數。而按第二種序列執行時,在列印了某段時間裡觀察到的卡車數後,觀察者又觀察到有一輛卡車通過作count+1,但由於接下去執行的是count:=0,以後觀察者將從「0」開始計數,於是列印出來的count值的總和將比實際觀察到的卡車數少。這種與時間有關的錯誤是因為它們同時在臨界區執行,兩個程序交替地訪問了共享變數count而造成地。用pv操作管理時。只要保證互斥進入臨界區即可。
解答:begin
count:integer;
s:semaphore;
count:=0;s:=1;
cobegin
process observer
begin
l1: observe a car;/*觀察到一輛卡車*/
p(s);
count:=count+1;
v(s);
goto l1
end;
process reporter
begin
l2:p(s);
print count;
count:=0;
v(s);
goto l2
end;
coend;
end;
用pv操作實現程序的同步
用pv操作實現程序的同步時應定義一組訊號量,其中每個訊號量與乙個訊息對應,根據各個訊息量的物理含意確定初值。程序通過呼叫p操作來測定自己需要的訊息是否到達,通過呼叫v操作把其它程序需要的訊息傳送出去。
例題:三個程序a、b、c ,共享兩個緩衝器b1和b2。緩衝器b1中可存放n件產品,緩衝器b2中可存放m件產品。程序a每次生產一件產品並將其存入緩衝器b1中;程序b每次從緩衝器b1中取出一件產品後再把它傳送到緩衝器b2中;程序c每次從緩衝器b2中取出一件產品去消費。為防止把產品存入已滿的緩衝器、或從空的緩衝器取產品、或重複取產品,試用pv操作實現它們之間的相互制約。
分析:程序b是從b1中取出產品後傳送到b2中。故程序b即是消費者又是生產者。程序a和程序b共享緩衝器b1,它們之間需要同步,應定義一對訊號量s1和s2來實現程序a和b之間的訊息傳送。程序b和程序c共享緩衝器b2,也要定義一對訊號量s3和s4來實現同步。程序b從緩衝器b1中取出一件產品後應立即呼叫v操作,通知程序a在緩衝器b1中增加了乙個可存產品的單元,由於緩衝器b1和b2的容量不相等,所以程序b在把取出的產品存入緩衝器b2之前應呼叫p操作來測試緩衝器b2中是否有可存放產品的空單元。未了保證正確的存產品和取產品,可用指標r1、r2和t1、t2分別指出緩衝器中當前可存放產品和取產品的相對位置,每次存或取之後要修改指標值,使其指向下乙個相對位置。
解答:begin s1,s2,s3,s4:semaphore;
r1,r2,t1,t2:integer;
s1:=n;s2:=0;s3:=m;s4:=0;
r1:=r2:=t1:=t2:=0;
cobegin
process a
begin
l1:produce a product;/*生產一件產品*/
p(s1);
b1[r1]:=poduct;
r1:=(r1+1) mod n;
v(s2);
goto l1
end;
process b
begin
l2: p(s2);
x:=b1[t1];
t1:=(t1+1) mod n;
v(s1);
p(s3);
b2[r2]:=x;
r2:=(r2+1) mod m;
v(s4);
goto l2
end;
process c
begin
l3: p(s4);
y:=b2[t2];
t2:=(t2+1) mod m;
v(s3);
consume;/*消費產品*/
goto l3
end;
coend;
end;
用pv操作實現程序同步與互斥的混合問題
有了上面的分析後,下面來考慮程序同步與互斥的混合問題。
例題:有四個程序r1,r2,w1,w2,它們共享可以存放乙個數的緩衝器b。程序r1每次把從鍵盤上讀出的乙個數存到緩衝器b中,供程序w1列印輸出;程序r2每次從磁碟上讀乙個數存放到緩衝器b中,供程序w2列印輸出。為防止資料的丟失和重複列印,問怎樣用pv操作來協調這四個程序的併發執行。
分析:程序r1和r2各自生產不同的產品要存入共享的緩衝器b中,由於b中每次只能存入乙個數,因此,程序r1和r2在存數時必須互斥。程序r1和r2在把數存入b中後應分別傳送訊息通知程序w1和w2;程序w1和w2在取出數之後應發出緩衝器b中又允許存放乙個新數的訊息。故程序r1與w1、程序r2與w2之間要同步。下面來考慮定義訊號量。首先應定義乙個是否允許程序r1或r2存入緩衝器b的訊號量s,初值為「1」;其次,程序r1和r2分別要向程序w1和w2傳送訊息,要有兩個訊號量s1和s2來表示相應的訊息,初值為「0」。然後程序w1或w2在取出緩衝器b中的數之後只需發出「允許存放乙個新數」的訊息,通過呼叫v(s)即可,不必增加新的訊號量。
解答:begin s ,s1,s2: semaphore;
s:=1;s1:=s2:=0;
cobegin
process r1
begin
l1:從鍵盤讀乙個數x1;
p(s);
b:=x1;
v(s1);
goto l1
end;
process r2
begin
l2: 從鍵盤讀乙個數x2;
p(s);
b:=x2;
v(s);
goto l2
endprocess w1
begin
l3:p(s1);
y:=b;
v(s);
列印y中的數;
goto l3
end;
process w2
begin
l4: p(s2);
z: =b;
v(s);
列印z中的數;
goto l4
end;
coend;
end;
作業系統中的程序同步
在進行多執行緒執行過程中,對於共享資源的訪問會出現不可知的異常。臨界區 臨界區就是為了避免這種異常的發生,當乙個執行緒進入臨界區的時候,就定義乙個標誌,表示現在臨界區正在被訪問,其他執行緒只能等待。但是臨界區的實現還是沒有辦法完全避免多個執行緒同時訪問臨界區而產生的異常。只是異常發生的概率會小很多。...
作業系統 程序同步
臨界資源 critical resouce 臨界區 critical section 硬體同步機制 訊號量機制 訊號量的應用 管程3使用多道批處理系統不僅能有效的改善資源的利用率,還可以顯著地提高系統的吞吐量,但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保...
作業系統 程序同步
引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 1,兩種形式的制約關係 a 間接相互制約 ab兩程序爭用一台印表機 b 直接相互制約 a程序放資料 緩衝區 b程序從緩衝區取資料 2,臨界資源 硬體臨界資源 軟體臨界資源 印表機,磁帶機,緩衝區。3,臨界...