1. 程式人生 > >PV操作與訊號燈及例子+三大作業系統共同點的執行緒通訊

PV操作與訊號燈及例子+三大作業系統共同點的執行緒通訊

PV操作與訊號燈的處理相關,P表示通過的意思V表示釋放的意思
  1962年,狄克斯特拉離開數學中心進入位於荷蘭南部的艾恩德霍芬技術大學(Eindhoven Technical University)任數學教授。在這裡,他參加了X8計算機的開發,設計與實現了具有多道程式執行能力的作業系統——THE Multiprogramming System。THE是艾恩德霍芬技術大學的荷蘭文Tchnische Hoogeschool Eindhov –en的詞頭縮寫。狄克斯特拉在THE這個系統中所提出的一系統方法和技術奠定了計算機現代作業系統的基礎,尤其是關於多層體系結構,順序程序之間的同步和互斥機制這樣一些重要的思想和概念都是狄克斯特拉在THE中首先提出併為以後的作業系統如UNIX等所採用的。
  為了在單處理機的情況下確定程序(process)能否佔有處理機,狄克斯特拉將每個程序分為“就緒”(ready)、“執行”(running)和“阻塞”(blocking)三個工作狀態。由於在任一時刻最多隻有一個程序可以使用處理機,
正佔用著處理機的程序稱為“執行”程序。當某程序已具備了使用處理機的條件,而當前又沒有處理機供其使用,則使該程序處於“就緒”狀態。當執行程序由於某種原因無法繼續執行下去時,就停止其佔用處理機,使之進入“阻塞”狀態,待造成其退出執行的條件解除,再進入“就緒”狀態。而對系統中所有同時執行的程序,在一個程序訪問共享資料時,另一個程序不訪問該資料和互斥(mutually- exclusive,指兩個程序不能同時在一個臨界區中使用同一個可重複使用的資源,諸如讀寫緩衝區)兩個關係,狄克斯特拉巧妙地利用火車執行控制系統中的“訊號燈”(semaphore,或叫”訊號量”)概念加以解決。
  所謂訊號燈,實際上就是用來控制程序狀態
的一個代表某一資源的儲存單元
。例如,P1和P2是分別將資料送入緩衝B和從緩衝B讀出資料的兩個程序,為了防止這兩個程序併發時產生錯誤,狄克斯特拉設計了一種同步機制叫“PV操作”,P操作和V操作是執行時不被打斷的兩個作業系統原語。執行P操作P(S)時訊號量S的值減1,若結果不為負則P(S)執行完畢,否則執行P操作的程序暫停以等待釋放執行V操作V(S)時,S的值加1,若結果不大於0則釋放一個因執行P(S)而等待的程序。對P1和P2可定義兩個訊號量S1和S2,初值分別為1和0。程序P1在向緩衝B送入資料前執行P操作P(S1),在送入資料後執行V操作V(S2)。程序P2在從緩衝B讀取資料前先執行P操作P(S2),在讀出資料後執行V操作V(S1)。當P1往緩衝B送入一資料後訊號量S1之值變為0,在該資料讀出後S1之值才又變為1,因此在前一數未讀出前後一數不會送入,從而保證了P1和P2之間的同步。我國讀者常常不明白這一同步機制為什麼叫PV操作,原來這是狄克斯特拉用荷蘭文定義的,因為在荷蘭文中,通過叫passeren,釋放叫vrijgeven,PV操作因此得名
。這是在計算機術語中不是用英語表達的極少數的例子之一。
  大學作業系統 中的經典例子:
  P就是請求資源,V就是釋放資源
  例如一個司機與售票員的例子
  在公共汽車上,為保證乘客的安全,司機和售票員應協調工作:
  停車後才能開門,關車門後才能行車。用PV操作來實現他們之間的協調。
  S1:是否允許司機啟動汽車的變數
  S2:是否允許售票員開門的變數
  driver()//司機程序
  {
  while (1)//不停地迴圈
  {
  P(S1);//請求啟動汽車
  啟動汽車;
  正常行車;
  到站停車;
  V(S2); //釋放開門變數,相當於通知售票員可以開門
  }
  }
  busman()//售票員程序
  {
while(1)
  {
  關車門;
  V(S1);//釋放開車變數,相當於通知司機可以開車
  售票
  P(S2);//請求開門
  開車門;
  上下乘客;
  }
  }
  注意:busman() driver() 兩個不停迴圈的函式