2012-08-22 13 views
0

下面的程序由3個併發進程和3個的二進制信號量的 旗語的,被初始化爲S0 = 1,S1 = 0 S2 = 0處理P0打印「0」的次數是多少?

過程P0:

while(1) 
{ 
wait (S0); 
print '0'; 
release (S1); 
release (S2); 
} 

過程P1:

wait(S1); 
release (S0); 

方法P2:

wait(S2); 
release (S0); 

處理PO打印'0'多少次?

(A)的至少兩倍(b)中究竟tWlce(c)中究竟三次(d)正好一次

在此我有一個混亂這一進程P1和P2作爲將執行一次或執行之後,他們將繼續一旦他們沒有像循環P0那樣的while循環,他們將只執行一次然後根據我的答案應該是(b),如果他們將再次執行答案將是(A)

請幫助在此先感謝

+0

作業?你爲什麼不嘗試它? – podiluska

+0

聽起來像是功課 – codeling

+0

這不是家庭作業的人,這個問題是從2010年的大門我解決了它,這個問題的解決方案是(A),但我想知道P1和P2如何再次執行,因爲對於(A)他們應該,所以我正在採取另一種情況,我已經給出了上述.. – nirmitkansal

回答

0

我假設等待()減少信號量和塊,如果它變成< = 0,而發佈會增加計數器並喚醒下一個進程。

給定你的代碼,P1和P2執行一次(它們周圍沒有循環)。這意味着它們每個都會觸發一次S0。當每次打印之前等待S0的P0塊將最終打印兩次「0」。

要檢查的另一件事是S0的初始狀態,因爲只有當S0爲0時,P0纔會阻塞。在您的語句中出現這種情況。因此,答案是P0將正好兩次打印0

+0

對,然後反饋。你怎麼知道在P0運行之前P1和P2都不能執行,信號量是二進制的,不能保持多個版本。這會給你'0'一次。根據問題,S0也是1。 –

+0

如果你看看標準的操作系統文獻(Tanenbaum,Stallings),你會發現信號燈通常不是二進制的。 (與互斥/鎖相反)。儘管如此,更多的細節只能由問題的作者給出。 :/ – BjoernD

+1

它在問題中說,二進制信號量。異常?是的,但我從事的是提供的信息,而不是通常甚至規範的信息。在標準意味着具體實施的行業一年後,我學到了一些東西......我怎麼會錯過學術界,哪裏可以引用標準並且是正確的。 –

0

閱讀問題和代碼我也會說(A)。我假設這些流程在完成任務之前不能被搶佔。

它說的初始狀態是S0=1S1=0S2=0,並從我們所知道的P1P2將執行一次。

並行進程可能很複雜,但我試圖描述流程人們會以我想到的方式發現錯誤,沒關係,我也在這裏學習。

現在有幾種情況會根據進程的順序產生不同的結果。

P0 -> P1 -> P0 -> P2 -> P0 = Three times 

P0 -> P1 -> P2 -> P0 = Twice 

P0 -> P2 -> P1 -> P0 = Twice 

這給了我們至少兩次的答案。

編輯:

所有這一切都等待阻塞的假設()下進行,而信號燈== 0和版本()設置信號燈= 1,否則該代碼將只是大多是精神錯亂。

如果進程可以在任何時候中斷,那麼事情會變得有趣。

P0 starts out running because S0=1 at start 
P0 print '0'; 
P0 release(S1); 
-- here S1 may take over or not -- 
P0 release(S2); 
-- here S2 may take over or not -- 
P0 goes back to wait(S0) 
-- here P0 continues or if S1 *and* S2 have not run blocks -- 
-- it may also be that only S1 or S2 ran and now the other will run -- 

現在我試圖找出一種方法來可視化事情如何解決,我沒有找到一種方法把它放在代碼塊中。

如果S1和S2都儘快運行,由於信號是二進制的,並且只能處於兩種狀態之一,P0只會運行兩次,但是如果調度足夠延遲S1或S2直到P0通過等待()再一次P0將運行三次。

但我認爲這個問題是不是意味着有中斷的過程,它只是變得混亂。

+0

1.這個問題從來沒有說明進程不能被中斷 2.你的第一次運行是錯誤的,P0將阻塞wait()函數中的信號量,並且在P1或P2運行之前不會打印任何內容。 – BjoernD

+0

1.你是對的,我應該說明這一點2.現在這是一個解釋問題在這裏,早些時候我將它看作release()將其設置爲1,並且等待()阻止0,但它可能是另一種方式特別是因爲你在答案中說如果S0爲0,S0開始爲1,則P0阻止 –

+0

@r_ahlskog:你的回答是正確的你假設過程不能被打斷是有缺陷的,但是他們**可以被中斷,但是**一個可能的結果**是他們**不會被打斷,並且通過追蹤這種可能性,你顯示出B,C和D不能是正確,現在只需證明A是正確的,不會顯示啞光r什麼命令,P0總是會打印兩次。證明很簡單。它總是打印一次是由S0的開始狀態給出的。然後無論發生什麼事,P1和/或P2都會返回,所以它必須再次打印。總是至少兩次。答案完整。這是A. – indiv

2

最初P0將執行,因爲只有S0=1。它將打印單個0.

現在當S1S2P0發佈時,則可以執行它們中的任何一個。

讓我們假設P1執行並釋放S0(現在S0的值爲1)。

現在有兩種可能性要麼P0P2可以執行。

讓我們P2執行並釋放S0,所以在最後P0執行和打印0(指兩個0的) 但如果P0P2之前執行則共有3 0的將打印(一個在P0,然後時間P2,其發佈S0因此P0再次執行)。

所以完美的答案是至少兩個0。

+0

爲什麼P1和P2中的任何一個將被執行,但不是兩者都有? – Chandeep

0

將溶液進行如下:

  1. 只有過程P0可以先執行。這是因爲進程P0使用的信號量,即S0的初始值爲1.現在,當P0調用S0等待時,S0的值變爲0,這意味着S0已被P0取得。就程序P1和P2而言,當它們分別在S1和S2上等待時,由於信號已經被初始化爲0,所以它們不能繼續,所以它們必須等到S1和S2被釋放!

  2. P0進行第一和打印0。現在,下一個報表發佈S1和S2!當S1被釋放時,過程P1的等待結束,因爲S1的值增加1並被標記爲不被採用。 P1取S1並取S1。流程P2也一樣。

  3. 現在,only one of P1 or P2 can execute, because either of them can be in the critical section at a given time ..假設P2執行。它釋放S0並終止。

  4. 令P1執行下.. P1開始發佈S0和終止。

  5. Now only P0 can execute because its in a while loop whose condition is set to true, which makes it to run always. P0執行打印0秒時間和釋放S1和S2。但是P1和P2已經被終止,所以P0等待永遠釋放S0。

下面是它打印0三次的第二溶液:

  1. P0開始,印刷品0 ADN釋放S1和S2。

  2. 讓P2執行。 P2啓動,釋放S0並終止。此後只能執行P0或P1。

  3. 讓P0執行。第二次打印0並釋放S1和S2。此時只有P1可以執行。

  4. P1開始,釋放S0,P1終止。此時只有P0可以執行,因爲它在條件設置爲true的while循環中!

  5. P0開始,第3次打印0並釋放S1和S2。然後等待有人釋放從未發生過的S0。

所以答案變成正好兩次或正好三次,這也可以說是「atleast twice」!

請告訴我,如果我錯了任何地方!

有關旗語更多的問題,請參照this

0

P0將執行第一因爲只有S0 = 1。因此它會打印0(第一次)。 P0也釋放S1和S2。由於S1 = 1和S2 = 1,因此P1或P2,它們中的任何一個都可以執行。 讓我們假設P1執行並釋放S0(現在S0 = 1的值)。請注意,P1過程已完成。 現在S0 = 1且S2 = 1,因此可以執行P0或執行P2。讓我們檢查兩個條件: -

  1. 讓我們假設P2執行並釋放S0並完成其執行。現在執行P0; S0 = 0並打印0(即秒0)。然後釋放S1和S2。但請注意,P1和P2進程已經完成執行。如果P0嘗試執行,則會進入休眠狀態,因爲S0 = 0。因此,打印的最小次數「0」爲2.

  2. 現在讓我們假設P0執行。因此S0 = 0(由於等待(S0)),它將打印0(秒0)並釋放S1和S2。現在只有P2可以執行,因爲P1已經完成執行,P0因爲S0 = 0而不能執行。現在P2執行並釋放S0(即S0 = 1)並結束其執行。現在P0開始執行並再次打印0(第0個)並釋放S1和S2(注意現在S0 = 0)。 P1和P2已經完成執行,因此P1再次輪到它,但是由於S0 = 0,它進入睡眠狀態。而過程P1和P2可能喚醒P0已經完成了他們execution.Therefore,時代「0」會打印最大數目爲2

參考:http://www.btechonline.org/2013/01/gate-questions-os-synchronization.html

0

最初只有P0可以進去while循環爲S0 = 1,S1 = 0,S2 = 0。P0首先打印'0',然後釋放S1和S2後,P1或P2將執行並釋放S0。所以再次打印0。