軟體設計師考試試題分析一 作業系統

2021-04-15 00:12:51 字數 4614 閱讀 9517

在某超市裡有乙個收銀員,且同時最多允許有n個顧客購物,我們可以將顧客和收銀員看成是兩類不同的程序,且工作流程如下圖所示。為了利用pv操作正確地協調這兩類程序之間的工作,設定了三個訊號量s1、s2和sn,且初值分別為0、0和n。這樣圖中的a應填寫__(24)__,圖中的b1、b2應分別填寫__(25)__,圖中的c1、c2應分別填寫__(26)__。

(24)a. p(s1) b.p(s2) c. p(sn) d. p(sn)、 p(s1)

(25)a.p(sn)、v(s2) b.p(sn)、 v(s1) c. p(s2)、 v(s1) d. v(s1)、 p(s2)

(26) a.p(s1)、v(s2) b.p(sn)、 v(s1) c. p(s2)、 v(s1) d. v(s1)、 p(s2)

答案:(1)c (2)d (3)a

解析:這是一道考查pv操作的題,所以首先得弄清楚那些地方需要互斥、那些地方需要同步。題目中給出了兩類程序:顧客程序與收銀元程序,由於超市是顧客程序之間的公有資源,而且超市裡限制最多允許有n個顧客購物,所以要設定乙個公有訊號量sn,初值是n,顧客程序在進入超市時要執行p(sn),離開超市時要執行v(sn)操作。顧客購物後要到收銀員處付款,因此顧客程序與收銀員程序之間是同步的關係,一次只允許乙個顧客程序付款,整個超市只有乙個收銀員程序收費,所以需要為顧客程序設定乙個私有訊號量s2,為收銀員程序設定乙個私有訊號量s1,由於開始時沒有顧客去付款,收銀員也沒有收費,所以s1和s2的初值為0。當有顧客買完東西去付款時執行v(s1),通知收銀員程序有顧客付款,此時收銀員程序執行p(s1)操作後就可進入收費,收費完成後收銀元程序執行v(s2),以通知顧客收費完畢,此時顧客執行p(s2)就可離開收銀台,在離開超市時需執行v(sn),釋放資源。

併發程序由於共享系統內部資源,因此導致程序執行速度上的制約,這種制約分為:間接制約與直接制約。間接制約引起程序之間的互斥執行,直接制約引起程序間的同步執行。例如乙個家裡如果只有乙個衛生間,衛生間這個公有資源使得每個人只能互斥使用它,這就是間接制約。而直接制約是指併發程序各自執行的結果互為對方的執行條件,例如司機與售票員的關係,當司機到站停車後,售票員才能開門,而只有售票員關門後,司機才能開車,他們之間是同步的。程序的互斥與同步可以很好的通過訊號量和pv原語來實現。通過讀一些同步與互斥的例子,你會體會到pv原語的精妙,也會感到一種樂趣。併發程序的資源競爭不當還會導致死鎖現象。

如何用pv原語實現程序間的互斥與同步

pv原語的含義

p操作和v操作是不可中斷的程式段,稱為原語。pv原語及訊號量的概念都是由荷蘭科學家e.w.dijkstra提出的。訊號量sem是一整數,sem大於等於零時代表可供併發程序使用的資源實體數,但sem小於零時則表示正在等待使用臨界區的程序數。

p原語操作的動作是:

(1) sem減1;

(2) 若sem減1後仍大於或等於零,則程序繼續執行;

(3) 若sem減1後小於零,則該程序被阻塞後進入與該訊號相對應的佇列中,然後轉程序排程。

v原語操作的動作是:

(1) sem加1;

(2) 若相加結果大於零,則程序繼續執行;

(3) 若相加結果小於或等於零,則從該訊號的等待佇列中喚醒一等待程序,然後再返回原程序繼續執行或轉程序排程。

pv操作對於每乙個程序來說,都只能進行一次,而且必須成對使用。在pv原語執行期間不允許有中斷的發生。

用pv原語實現程序的互斥

由於用於互斥的訊號量sem與所有的併發程序有關,所以稱之為公有訊號量。公有訊號量的值反映了公有資源的數量。只要把臨界區置於p(sem) 和v(sem)之間,即可實現程序間的互斥。就象火車中的每節車廂只有乙個衛生間,該車廂的所有旅客共享這個公有資源:衛生間,所以旅客間必須互斥進入衛生間,只要把衛生間放在p(sem) 和v(sem)之間,就可以到達互斥的效果。以下例子說明程序的互斥實現。

例1 生產圍棋的工人不小心把相等數量的黑子和白子混裝載乙個箱子裡,現要用自動分揀系統把黑子和白子分開,該系統由兩個併發執行的程序組成,功能如下:

(1) 程序a專門揀黑子,程序b專門揀白子;

(2) 每個程序每次只揀乙個子,當乙個程序在揀子時不允許另乙個程序去揀子;

分析:第一步:確定程序間的關係。由功能(2)可知程序之間是互斥的關係。第二步:

確定訊號量及其值。由於程序a和程序b要互斥進入箱子去揀棋子,箱子是兩個程序的公有資源,所以設定乙個訊號量s,其值取決於公有資源的數目,由於箱子只有乙個,s的初值就設為1。

實現:begin

s:semaphore;

s:=1;

cobegin

process a

begin

l1: p(s);

揀黑子;

v(s);

goto l1;

end;    

process b

begin

l2:p(s);

揀白子;

v(s);

goto l2;

end;

coend;

end;

判斷程序間是否互斥,關鍵是看程序間是否共享某一公有資源,乙個公有資源與乙個訊號量相對應。確定訊號量的值是乙個關鍵點,它代表了可用資源實體數。如下例項:

例2 某車站售票廳,任何時刻最多可容納20名購票者進入,當售票廳中少於20名購票者時,廳外的購票者可立即進入,否則需要在外面等待。每個購票者可看成乙個程序。

分析:第一步:確定程序間的關係。售票廳是各程序共享的公有資源,當售票廳中多於20名購票者時,廳外的購票者需要在外面等待。所以程序間是互斥的關係。第二步:確定訊號量及其值。只有乙個公有資源:售票廳,所以設定乙個訊號量s。售票廳最多容納20個程序,即可用資源實體數為20,s的初值就設為20。

實現:begin

s:semaphore;

s:=20;

cobegin

process pi(i=1,2,……)

begin

p(s);

進入售票廳;

購票;退出;

v(s);

end;

coend

當購票者進入售票廳前要執行p(s)操作,執行後若s大於或等於零,說明售票廳的人數還未滿可進入。執行後若s小於零,則說明售票廳的人數已滿不能進入。這個實現中同時最多允許20個程序進入售票廳購票,其餘程序只能等待。

用pv原語實現程序的同步

與程序互斥不同,程序同步時的訊號量只與制約程序及被制約程序有關而不是與整組併發程序有關,所以稱該訊號量為私有訊號量。利用pv原語實現程序同步的方法是:首先判斷程序間的關係為同步的,且為各併發程序設定私有訊號量,然後為私有訊號量賦初值,最後利用pv原語和私有訊號量規定各程序的執行順序。下面我們將例1增添乙個條件,使其成為程序間是同步的。

例3 在例1的基礎之上再新增乙個功能:

(3) 當乙個程序揀了乙個棋子(黑子或白子)以後,必讓另乙個程序揀乙個棋子(黑

子或白子)。

分析:第一步:確定程序間的關係。由功能(1)(2)(3)可知,程序間的關係為同步關係。第二步:確定訊號量及其值。程序a和b共享箱子這個公有資源,但規定兩個程序必須輪流去取不同色的棋子,因而相互間要互通訊息。對於程序a可設定乙個私有訊號量s1,該私有訊號量用於判斷程序a是否能去揀黑子,初值為1。對於程序b同樣設定乙個私有訊號量s2,該私有訊號量用於判斷程序b是否能去揀白子,初值為0。當然你也可以設定s1初值為0,s2初值為1。

實現: begin

s1,s2:semaphore;

s1:=1;s2:=0;

cobegin

process a

begin

l1: p(s1);

揀黑子;

v(s2);

goto l1;

end;    

process b

begin

l2:p(s2);

揀白子;

v(s1);

goto l2;

end;

coend;

end;

另外乙個問題就是p原語是不是一定在v原語的前面?回答是否定的。下面看乙個例子。

例4 設在公共汽車上,司機和售票員的活動分別是:司機:啟動車輛,正常行車,到站停車。售票員:上乘客,關車門,售票,開車門,下乘客。用pv操作對其控制。

分析:第一步:確定程序間的關係。司機到站停車後,售票員方可工作。同樣,售票員關車門後,司機才能工作。所以司機與售票員之間是一種同步關係。第二步:確定訊號量及其值。由於司機與售票員之間要互通訊息,司機程序設定乙個私有訊號量run,用於判斷司機能否進行工作,初值為0。售票員程序設定乙個私有訊號量stop,用於判斷是否停車,售票員是否能夠開車門,初值為0。

實現:begin

stop ,run:semaphore

stop:=0;run:=0;

cobegin

driver: begin

l1: p(run);

啟動車輛;

正常行車;

到站停車;

v(stop);

goto  l1;

end;

conductor:begin

l2:上乘客;

關車門;

v(run);

售票;p(stop);

開車門;

下乘客;

goto l2;

end;

coend;

end;

用pv操作還可以實現程序同步與互斥的混合問題,典型的如:多個生產者和多個消費者共享容量為n的快取區。這個例子在很多書中都有介紹,在這裡就不說了。

2010 5 17 軟體設計師下午考試分析

5.17 距離軟考還有3天 斷斷續續的看了乙個月多點的時間 總感覺的複習的有點不足 有些知識點至今沒有看到 心裡沒譜似的 難得有閒暇的時間 今天晚上總結一下 把自己這些天看的知識點做一下整理 晚上在自習室用了 1個小時 10分鐘的時間做了一下 09年下半年上午試題 做題時的感覺還行 晚上回來在網上搜...

軟體設計師考試總結

我們剛開始為了這次考試,自發結成乙個小組。自己卻因為時間安排上的問題與自己的組員嚴重脫節。經過一段時間的自己看書學習,覺得效果很差,就去找師哥師姐幫忙了。慶幸的是在師哥師姐的帶領下自己也算是跟上了隊伍的節奏!個人覺得在其中需要注意的幾點 備考階段 小組學習 在這個階段一定要跟小組一起學習討論,有疑問...

軟體設計師考試 概況

最近正在準備軟考,剛開始接觸軟考的時候,裡面的東西很多,雖然大部分是學過,感覺還是比較雜,於是就總結了下導圖 先上圖 整本書主要描述的就是軟體從無到有的過程,下面一一闡述 指導原則 也可以叫做指導思想,做什麼事情都有自己的指導原則。軟體工程的出現是為了解決軟體危機,使做軟體變成乙個工程去對待。因為在...