操作系統筆記:書Page188第50題

參考文獻:[1]費翔林, 駱斌. 操作系統教程(第五版) [M]. 北京:高等教育出版社,2014. 

題目:某寺廟有小和尚和老和尚若干,水缸一隻,由小和尚提水入缸供老和尚飲用。水缸可容水10桶,水取自同一口水井中。水井徑窄,每次僅能容納一隻水桶取水,水桶總數爲三個。每次放入、取出的水量僅爲1桶,而且不能同時進行。規定取水、提水都需要用桶。試用一種同步工具寫出小和尚和老和尚放入水、取水的活動過程。




解:


  1. 題意解讀:

    • 首先要清楚這是一個大方向上是同步,同步中又有互斥的問題。
    • 同步:所謂同步,是指散佈在不同進程之間的若干程序片斷,它們的運行必須嚴格按照規定的、某種先後次序來運行,這種先後次序依賴於要完成的特定的任務。(書上P129頁第2段一個意思)顯然,小和尚提水給老和尚喝,肯定得小和尚提水的進程先完成,老和尚取水的進程才能進行(規定的、某種先後次序來運行)。而同步資源當然就是缸裏的10桶水了,所以設 semaphore empty=10,full=0;(empty對應小和尚要提多少桶才能加滿缸,full對應老和尚可以取多少桶水)。
    • 互斥:所謂互斥,是指散佈在不同進程之間的若干程序片斷,當某個進程運行其中一個程序片段時,其它進程就不能運行它們之中的任一程序片段,只能等到該進程運行完這個程序片段後纔可以運行。(書上P128頁第5段一個意思)在這裏有三個互斥資源:桶、井、缸。設 semaphore S桶=3,S缸=1,S井=1;(S桶:有3只桶能用;S缸:有一隻缸能用;S井:有一口井能用)。
  2. PV操作模擬過程僞代碼:

semaphore empty=10,full=0; //同步資源
semaphore S井=S缸=1,S桶=3; //互斥資源
cobegin:
    Process_老和尚:
    {
      L1:P(full); //缸內的水減1桶
          P(S桶); //拿桶
          P(S缸); //佔缸
          取水;
          V(S缸); //還缸
          V(S桶); //還桶
          V(empty); //缸還能盛下的水加1桶
          goto L1;
    }

    Process_小和尚:
    {
      L2:P(empty); //缸內能盛下的水減1桶
          P(S桶); //拿桶
          P(S井); //佔井
          P(S缸); //佔缸
          倒水;
          V(S井); //還井
          V(S缸); //還缸
          V(S桶); //還桶
          V(full); //缸還內的水加1桶
          goto L2;
    }
coend;

  • 總結:

    1. PV操作用於互斥時,位於同一進程內。(看上面的S桶、S缸、S井)
    2. PV操作用於同步時,交錯出現於兩個合作的進程內。(empty、full)
    3. 多個P操作次序不可顛倒,否則可能產生死鎖。(比如Process_老和尚中,S桶和S缸換一下,當老和尚把缸佔了,小和尚把3只桶全拿去打水了,就會出現死鎖)
    4. 多個V操作次序可任意。
    5. 如果既有同步,又有互斥信號,則同步在前,互斥在後。(看上面P(full)/P(empty)都是第一個,比如P(empty)在後面,那麼當缸裏不能再盛水時,小和尚也要去打水)

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章