1. 程式人生 > 其它 >計算機作業系統之期末考試複習——程序的互斥和同步問題

計算機作業系統之期末考試複習——程序的互斥和同步問題

技術標籤:計算機作業系統作業系統程序同步程序互斥訊號量臨界資源

基礎概念

  1. 程序同步機制的主要任務:是對多個相關程序在執行次序上進行協調,使併發執行的諸程序之間能按照一定的規則共享系統資源,並能很好地相互合作,從而使程式的執行具有可再現性。
  2. 臨界資源:諸程序間應採取互斥方式,實現對這種資源的共享。
  3. 臨界區:人們把在每個程序中訪問臨界資源的那段程式碼稱為臨界區。
  4. 同步機制都應遵循下述四條準則:①空閒讓進。②忙則等待。③有限等待。④讓權等待。
  5. 訊號量(S):擁有的資源總數。
  6. P操作(wait):申請臨界資源。【有,資源數減一。無,阻塞呼叫程序。】
  7. V操作(signal):釋放資源。【資源數量加一。喚醒等待程序。】
  8. 通過PV操作,S為正值,表示當前剩餘的資源數量。S為負值,它的絕對值表示當前等待喚醒的程序數。

具體例題

解題的基本思路:
(1)首先分析是什麼型別的問題:純互斥、純同步、同步+互斥
(2)同步+互斥題:先做同步,後做互斥
(3)分析存在幾個執行主體
(4)站在每個執行主體的角度思考:它需要申請什麼資源(條件)、釋放什麼資源(結果)
(5)分析同步訊號量的初值
(6)再做互斥/純互斥題:找到臨界區(臨界資源),完成互斥

  1. 生產者-消費者問題: 有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序併發執行,在兩者之間設定了一個具有n個緩衝區的緩衝池,生產者程序將其所生產的產品放入一個緩衝區中;消費者程序可從一個緩衝區中取走產品去消費。儘管所有的生產者程序和消費者程序都是以非同步方式執行的,但它們之間必須保持同步,既不允許消費者程序到一個空緩衝區去取產品,也不允許生產者程序向一個已裝滿產品且尚未被取走的緩衝區中投放產品。請利用訊號量來解決該問題。

分析:
(1)緩衝池:臨界資源(互斥),不能同時使用緩衝區
(3)定義訊號量:semaphore mutex=1(互斥訊號量)full=0(初始狀態下,緩衝區為空)empty=n(初始狀態下,空緩衝區數量為n)
full+empty=n

semaphore mutex=1,full=0,empty=n;
生產者{
    while(1){
    //先同步,後互斥
    P(empty);//是否還要空緩衝區
    P(mutex);
    ...
    V(metex);
    V(full);//緩衝區+1
    }  
}
消費者{
     while(1){
     P(full);//檢測生產者是否生成了產品
     P(mutex);
     ...
     V(mutex);
     V(empty);//空緩衝區加一
     } 

}
  1. 桌上有個能盛得下五個水果的空盤子。爸爸不停地向盤中放蘋果或桔子,兒子不停地從盤中取出桔子吃,女兒不停地從盤中取出蘋果吃。規定三人不能同時從盤子中取放水果。試用訊號量實現爸爸、兒子和女兒這三個迴圈程序之間的同步。

分析:盤子為臨界資源

semaphore orange=0,apple=0,empty=5,mutex=1;
爸爸{
   while(1){
       P(empty);
       P(mutex);
       if(放蘋果){
          V(apple);//蘋果+1
       }
       if(放桔子){
          V(orange);//桔子+1
       }
       P(mutex);
    }
}
兒子{
     while(1){
         P(orange);
         P(mutex);
         從盤子中拿了一個桔子;
         V(mutex);
         V(empty);
     }
}
女兒{
     while(1){
         P(apple);
         P(mutex);
         從盤子中拿了一個蘋果;
         V(mutex);
         V(empty);
     }
}
  1. 哲學家進餐問題。

分析:

  1. 放在桌子上的筷子是臨界資源,在一段時間內只允許一位哲學家使用。為了實現對筷子的互斥使用,可以用一個訊號量表示一隻筷子,由這五個訊號量構成訊號量陣列。
  2. 5位哲學家同時進餐的話,會發生死鎖,為了防止死鎖的發生:最多允許4位哲學家同時坐在桌子周圍,定義一個訊號量room=4。
semaphore mutex[4]=1,room=4 
第i位哲學家(i∈[0,4]){
   while(1){
          思考;
         P(room);
         P(mutex[i]);//取第i根筷子
         P(mutex[(i+1)mod5]);//取相鄰的筷子
         進餐;
         V(mutex[i]);//放下第i根筷子
         V(mutex[(i+1)mod5]);//放下相鄰的筷子
         V(room);//離開桌子
    }
}