PV 操作經典例題---三個進程之間的同步


問題:

  總共有 讀入、執行、打印 三個進程,試用PV操作描述讀入B1打印B2的同步過程。

問題解讀:

  這個問題就是說了這樣一件事:一個輸入B1,被操作之后,成為B2,將B2打印。怎樣用PV操作來說這件事。那么新的問題來了:啥是個PV操作?

  就拿這道題來解釋PV操作吧,我想打印一個值,前提條件是這個值存在吧,如果不存在,那么打印這個動作就不應該被執行,不能說啥也沒有在那瞎打印吧。那么怎樣才能讓它不執行呢?

  這就需要引入信號量機制了:

  • 當一個操作的信號量為負數的話,就會掛起等待,不執行。
  • 當一個操作的信號量為0或者正數的時候,就可以執行。
  • P操作會使信號量 -1,V操作會使信號量 +1。

解決問題:

  按理說,我有三個操作,讀入(Reader)、執行(Executer)、打印(Printer),應該對應設置三個信號量R、E、P,對應PV操作流程如下圖所示:

 

解釋上圖的步驟:

  首先,將輸入信號量R初始化為1,保證讀入進程Reader能夠啟動。

  如果這時候沒有從Reader進程開始執行,而是試圖執行Executer或者Printer進程,由於信號量E、P初始值都是0,而且一上來就是P操作,所以會使信號量E、P成為 -1,這樣進程將會掛起等待,不執行。

  所以,能執行的進程只有讀入進程Reader。

  接着看,執行P(R),會使信號量R-1得0,執行輸入B1操作,這時候B1已經被輸入了,繼續執行V(E)操作來喚醒Executer進程,再往下就是執行V(R)操作來再次喚醒讀入進程。這就有Bug了,因為剛剛輸入的B1還不一定被Executer進程處理了呢,就喚醒了下次的讀入,這就有可能出現第二次的讀入內容將第一次的讀入內容覆蓋,導致結果錯誤。

  為了避免這樣的Bug發生,我們需要引入第四個信號量N,即Next輸入信號量,並且初始化為0。

  現在總共就有四個信號量了,分別是輸入信號量R=1,Next輸入信號量N=0,B1存在信號量E=0,B2存在信號量P=0,對應PV操作流程如下圖所示:

 

解釋上圖的步驟:

  在三個信號量的基礎之上,加入了Next輸入信號量N,並初始化為0。

  當Reader進程執行到P(N)的時候,由於N的初始信號量為0,對N進行一次P操作,N-1 = -1,Reader進程將被掛起等待,無法繼續執行。等到Executer進程執行完輸出B2的時候,下一步執行V(N),對N進行一次V操作,N+1 = 0,Reader進程將被喚醒。這樣,在將B1執行的結果B2輸出之后,才允許第二次輸入,可以避免因第二次輸入覆蓋第一次輸入而導致結果錯誤的Bug。

 


  這里我再給出老師課堂上給出的答案,我個人認為兩個版本的差別不是很大,所以這個就不再一步一步解釋了:

 

 

結尾:

  在課堂上我給出了我的解法思路,結果一下課問同學們理解不理解我的思路?結果是問一個一個不懂,很是郁悶。遂作此文。其實我覺得我那個版本還存在問題,但是由於是自己想出來的,思維定式,一時半會找不出來,希望看懂的同學給指點指點,定當感激。

 


操作系統老師課堂語錄收集:

1、師父領進門,修行靠個人。

2、學生的主業就是上課,所以你們沒事就都來上課啊。

3、編故事也是一種能力,描述能力。

4、非我族類,其心必異。

5、要想有秩序,必須有規則。

6、千萬不要等着,掌握了70%就上,做着做着就到90%了。

7、有時候方法簡單一點,你就會忽略這實際上是一種方法;有時候方法復雜一點,多想幾步,這個方法就上升成為一種策略了。

8、我那時候的操作系統老師對我們講:操作系統這門課你們現在學是學不懂的,等畢業你就懂了。

9、一等人才制定游戲規則,二等人才執行游戲規則,三等人才玩游戲。

10、要想有說服力,需要用量化。

未完待續......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM