1.理解生產者和消費者問題
沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?
出現結果不唯一:假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作;同時消費者取走一樣產品,擬執行產品數減一操作;假如兩者交替執行加一或減一操作,取決於其執行速度,產品數為9或7,但正確為8.
出現永遠等待:假如消費者讀取產品數為0時,排程程式暫停消費者程序,讓生產者程序執行,生產者加入乙個產品,將產品數加一,它便呼叫wakeup()函式來喚醒消費者;但是消費者未睡眠,則喚醒訊號丟失,當消費者下次執行時,因已檢測到產品數為0,於是去睡眠,當生產者將緩衝區填滿後也去睡眠,這就會造成永遠等待。
用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。
2.哲學家吃麵問題
semaphore fork[5];
for(int i=0; i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( )
coend
4.理髮師問題
int waiting=0, chairs=n;
semaphore customers=0,barbers=0,mutex=1;
cobegin
process barbers() }
process customer_i() {
p(mutex);
if(waitingwaiting++;
v(customers);
v(mutex);
p(barbers):
get_haircut();
else
v(mutex);
coend
5.在一間酒吧裡有三個**愛好者佇列,第一隊的**愛好者只有隨身聽,第二隊只有**磁帶,第三隊只有電池。而要聽**就必須隨身聽、**磁帶和電池這三種物品俱全。酒吧老闆一次**這三種物品中的任意兩種。當一名**愛好者得到這三種物品並聽完一首樂曲後,酒吧老闆才能再一次**這三種物品中的任意兩種。於是第二名**愛好者得到這三種物品,並開始聽樂曲。全部買賣就這樣進行下去。試用p,v操作正確解決這一買賣。
semaphore muext=1;
cobegin
process boss(){
p(muext);
/*老闆任意**兩種*/
v(muext);
process musiclovers_i() {
while(ture){
p(muext);
listening();
v(muext);
coend
6.某銀行有人民幣儲蓄業務,由n個儲蓄員負責。每個顧客進入銀行後先取乙個號,並且等著叫號。當乙個儲蓄人員空閒下來,就叫下乙個號。請用p,v操作正確編寫儲蓄人員和顧客程序的程式。
semaphore customers=0,clerk=0,mutex=n;
int waiting=0;
cobegin
process clerk() {
while(ture){
p(customers);
p(mutex);
waiting--;
v(clerk);
v(mutex);
service();
process customer_i() {
p(mutex);
waiting++;
v(customers);
v(mutex);
p(clerk):
get_service();
coend
7.下面是兩個併發執行的程序。它們能正確執行嗎?若不能請舉例說明,並改正之。(5分)
parbegin
var x:integer;
process p1 process p2
var y,z:integer: var t,u:integer;
begin begin
x:=1; x:=0:
y:=0: t=0;
if x≥l then y:=y十1; if x≤l then t:=t+2;
z:=y; u:=t;
end; end;
parend.
解答:不能
parbegin
var x:integer; var s:semaphore:=1;
process p1 process p2
var y,z:integer ; var ,tu:integer ;
begin begin
p(s); p(s);
x:=1; x:=0;
y:=0; t:=0;
if x>=1 then y:=y+1; if x<=1 then t:=t+2
v(s); v(s);
z:=y; u:=t;
end end
parend
8.九、在乙個盒子裡,混裝了相等數量的黑棋子和白棋子,現要用自動分揀系統把黑棋子和白棋子分開,該系統由兩個併發執行的程序p1和p2組成,其中程序p1專門揀黑子,程序p2專門揀白子。規定兩個程序輪流揀子且每個程序每次只揀乙個子。當乙個程序在揀子時不允許另乙個程序去揀子,並設p1先揀。請用p,v操作管理這兩個併發程序,使其能正確實現上述功能。
semaphore s1=1,s2=0;
cobegin {
process p1
begin
repeat
p(s1);
揀黑子;
v(s2);
until false;
endprocess p2
begin
repeat
p(s2);
揀白子;
v(s1);
until false;
endcoend
用訊號量程序同步與互斥
1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品...
用訊號量程序同步與互斥
1.理解生產者和消費者問題 1 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品數減一操作 假如兩者交替執行加一或減一操作,取決於其...
程序同步與互斥 POSIX有名訊號量
在 posix 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。前面我們學習了無名訊號量的使用 詳情請看 無名訊號...