《操作系統(tǒng) 作業(yè)答案》由會(huì)員分享,可在線閱讀,更多相關(guān)《操作系統(tǒng) 作業(yè)答案(7頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第九題 設(shè)有兩個(gè)生產(chǎn)者進(jìn)程A、B和一個(gè)銷售者進(jìn)程C,他們共享一個(gè)無限大的倉庫,生產(chǎn)者每次循環(huán)生產(chǎn)一個(gè)產(chǎn)品,然后入庫供銷售;銷售者每次循環(huán)從倉庫中取出一個(gè)產(chǎn)品進(jìn)行銷售。如果不允許同時(shí)入庫,也不允許邊入庫邊出庫;而且要求生產(chǎn)和消費(fèi)A產(chǎn)品和B產(chǎn)品的件數(shù)都滿足以下關(guān)系:-n≤A的件數(shù)-B的件數(shù)≤m,其中n、m是正整數(shù)。
分析:生產(chǎn)者A、B和消費(fèi)者之間不能同時(shí)將產(chǎn)品入庫和出庫,故倉庫是一個(gè)臨界資源。
生產(chǎn)的A、B產(chǎn)品必須滿足:-n≤A的件數(shù)-B的件數(shù)≤m,如練習(xí)5中,同樣的方法管理,分別使用了信號(hào)量SAB和SBA;
倉庫的管理只要求出入庫互斥,由于倉庫無限大入庫只需操作互斥就可以完成,出庫要
2、考慮有無產(chǎn)品,SA對(duì)應(yīng)于倉庫中的A產(chǎn)品量,SB對(duì)應(yīng)于倉庫中的B產(chǎn)品量;
銷售要滿足:-n≤A的件數(shù)-B的件數(shù)≤m,用difference表示A的件數(shù)-B的件數(shù),即difference= A的件數(shù)-B的件數(shù);difference==-n的時(shí)候,不能取產(chǎn)品B,只能取A;difference==m的時(shí)候,不能取產(chǎn)品A,只能取B;-n
3、BA表示當(dāng)前允許B生產(chǎn)的產(chǎn)品數(shù)量,其初值為n;另外,還需設(shè)置一個(gè)整數(shù)difference表示所銷售的A、B產(chǎn)品數(shù)量之差,而為了同步生產(chǎn)者和銷售者并使銷售的A、B產(chǎn)品的件數(shù)-n≤A的件數(shù)-B的件數(shù)≤m,還需要設(shè)置三個(gè)資源信號(hào)量,其中S對(duì)應(yīng)于倉庫中的總的產(chǎn)品量,SA對(duì)應(yīng)于倉庫中的A產(chǎn)品量,SB對(duì)應(yīng)于倉庫中的B產(chǎn)品量,它們的初值都為0.
Semaphore SAB=m,SBA=n,S=0,SA=0,SB=0,mutex=1;
process A( )
{ while(1)
{//生產(chǎn)產(chǎn)品,-n≤A的件數(shù)-B的件數(shù)≤m,方法同第4題
wait(SAB);
Produce a produ
4、ct A;
signal(SBA);
//入庫操作,滿足出入庫操作互斥即可
wait(mutex);
add the product A to the storehouse;
signal(mutex);
signal(SA); //入庫產(chǎn)品A一件,所以給SA增值
signal((S); //入庫產(chǎn)品一件,所以給S增值,S是倉庫中全部產(chǎn)品的數(shù)量
}
}
process B( )
{ while(1)
{//生產(chǎn)產(chǎn)品,-n≤A的件數(shù)-B的件數(shù)≤m,方法同第4題
wait(SBA);
Produce a product B;
signal(SAB);
5、
//入庫操作,滿足出入庫操作互斥即可
wait(mutex);
add the product A to the storehouse;
signal(mutex);
signal(SB); //入庫產(chǎn)品A一件,所以給SA增值
signal((S); //入庫產(chǎn)品一件,所以給S增值,S是倉庫中全部產(chǎn)品的數(shù)量
}
}
process C( )
{ while(1)
{ wait(S); //首先檢查有無產(chǎn)品,無產(chǎn)品阻塞,有產(chǎn)品,下面操作將會(huì)取走一件產(chǎn)品,所以S減1
if(difference<=-n)
{wait(SA); // diffe
6、rence<=-n時(shí)只能取A產(chǎn)品一件,無A產(chǎn)品則需阻塞
//出庫操作,滿足出入庫操作互斥
wait(mutex);
take a product A from storehouse;
signal(mutex);
difference++; //取A產(chǎn)品一件,difference++
}
else if(difference>=m)
{ wait(SB); // difference>=m時(shí)只能取B產(chǎn)品一件,無B產(chǎn)品則需阻塞
//出庫操作,滿足出入庫操作互斥
wait(mutex);
take a product B
7、 from storehouse;
signal(mutex);
difference--; //取B產(chǎn)品一件,difference--
}
else
{ //-n
8、SA減1,這里不可能發(fā)生沒有A產(chǎn)品,進(jìn)程C需要阻塞的情況
wait(SA);
difference++;//取A產(chǎn)品一件,difference++
}
else
{//取的是產(chǎn)品B,則信號(hào)量SB減1,這里不可能發(fā)生沒有B產(chǎn)品,進(jìn)程C需要阻塞的情況
wait(SB);
difference--;//取B產(chǎn)品一件,difference--
}
}
Sell the product;
}
}
main()
{
cobegin{
A();
B();
C();
}
}
9、
例題20解答
本題是一個(gè)有限緩沖區(qū)的生產(chǎn)者消費(fèi)者問題,關(guān)鍵是找到緩沖區(qū)資源,以及誰是生產(chǎn)者、誰是消費(fèi)者。
本題中煙草、紙和火柴應(yīng)該看作是產(chǎn)品,桌子是緩沖區(qū)。問題是有幾種產(chǎn)品。煙草、紙和火柴三種原料又不能簡(jiǎn)單地看成是三種產(chǎn)品,因?yàn)樗鼈儾⒉皇且詥为?dú)的形式被三個(gè)吸煙者進(jìn)程所競(jìng)爭(zhēng)的,而是以固定的組合被三個(gè)進(jìn)程所申請(qǐng)的。因此可以考慮:設(shè)置三個(gè)信號(hào)量r、s和t,分別代表三種原料組合,即r表示煙草和紙,s表示紙和火柴,t表示煙草和火柴,初值均為0;桌面上一次只能放一種組合,可以看作是放一個(gè)產(chǎn)品的緩沖區(qū),設(shè)置信號(hào)量empty初值為1,控制經(jīng)銷商往桌子上放原料;對(duì)于三個(gè)吸煙者的申請(qǐng)動(dòng)作也要加以
10、判斷,用三個(gè)變量smoker1、smoker2、smoker3,初值為false,當(dāng)為true時(shí),表示申請(qǐng)資源,得到資源后置為false。四個(gè)進(jìn)程循環(huán)往復(fù),并發(fā)執(zhí)行。
經(jīng)銷商進(jìn)程:
吸煙者1進(jìn)程:?
吸煙者2進(jìn)程:?
吸煙者3進(jìn)程:
第一題44. a、b兩點(diǎn)之間是一段東西向的單行車道,現(xiàn)要設(shè)計(jì)一個(gè)自動(dòng)管理系統(tǒng),管理規(guī)則如下:當(dāng)a、b之間有車輛在行駛時(shí)同方向的車可以同時(shí)駛?cè)隺b段,但另一方向的車必須在ab段外等待;當(dāng)ab之間無車輛在行駛時(shí),到達(dá)a點(diǎn)(或b點(diǎn))的車輛可以進(jìn)入ab段,但不能從a點(diǎn)和b點(diǎn)同時(shí)駛?cè)耄划?dāng)某方向在ab段駛出
11、了ab段且暫無車輛進(jìn)入ab段時(shí),應(yīng)讓另一方向等待的車輛進(jìn)入ab段行駛。
現(xiàn)定義兩個(gè)計(jì)數(shù)器CountE和CountW分別記錄東行和西行車輛進(jìn)程數(shù)。用PV操作進(jìn)行管理時(shí)的三個(gè)信號(hào)量為S、SE、SW,程序結(jié)構(gòu)如下:
begin
S, SE, SW: semaphore;
CountE, CountW: Integer;
CountE := ____(1)_0___; CountW := ____(2)_0___;
S := ____(3)_1___; SE := ____(4)_1___; SW := ____(5)1____;
cobegin
P
12、rocess EASTi (i=1, 2, 3, …)
begin
____(6)_P(SE)___;
if CountE = 0 then____(7)P(S)____;
CountE := CountE+1;
____(8)_V(SE)___;
pass(ab);
____(9)_P(SE)___;
CountE := CountE-1;
if CountE = 0 then ____(10)_V(S)___;
____(11)_V(SE)___;
end;
Process WEST
13、j(j=1, 2, 3, …)
Begin
____(12)_P(SW)___;
if CountW = 0 then ____(13)_P(S)___;
CountW := CountW+1;
____(14)_V(SW)___;
pass(ba);
____(15)_P(SW)___;
CountW := CountW-1;
if CountW = 0 then ____(16)_V(S)___;
____(17)_V(SW)___;
end;
coend;
end;
44.
14、 (1) 0 (2) 0 (3) 1 (4) 1 (5) 1 (6) P(SE) (7) P(S) (8) V(SE) (9) P(SE) (10) V(S)
(11) V(SE) (12) P(SW) (13) P(S) (14) V(SW) (15) P(SW) (16) V(S) (17) V(SW)
3、如果有三個(gè)進(jìn)程R、W1、W2共享一個(gè)緩沖器B,而B中每次只能存放一個(gè)數(shù)。當(dāng)緩沖器中無數(shù)時(shí),進(jìn)程R可以將從輸入設(shè)備上讀入的數(shù)存放到緩沖器中。若存放到緩沖器中的是奇數(shù),則允許進(jìn)程W1將其取出打??;若存放到緩沖器中的是偶數(shù),則允許進(jìn)程W2將其取出
15、打印。同時(shí)規(guī)定:進(jìn)程R必須等緩沖區(qū)中的數(shù)被取出打印后才能再存放一個(gè)數(shù);進(jìn)程W1或W2對(duì)每次存入緩沖器的數(shù)只能打印一次;W1和W2都不能從空緩沖中取數(shù)。寫出這三個(gè)并發(fā)進(jìn)程能正確工作的程序。
答:S為互斥信號(hào)量,用來對(duì)緩沖器的互斥使用;
SO和SE為資源信號(hào)量,SO表示是否允許進(jìn)程W1打??;SE表示是否允許進(jìn)程W2打印。
semaphore S=1,SO=SE=0;
buffer B;
process R()
{ int x;
while(1)
{從輸入設(shè)備上讀一個(gè)數(shù);
x=接收的數(shù);
wait(S);
B=x;
if B=奇數(shù) then signal(SO);
else signal(SE); }
}
process W1()
{ int y;
while(1)
{ wait(SO);
y=B;
signal(S);
打印y中數(shù);}
}
process W2()
{ int z;
while(1)
{ wait(SE);
z=B;
signal(S);
打印z中數(shù) ;}
}
main()
{cobegin
{ R();
W1();
W2();}
}