1. 程式人生 > >程序同步的基本概念:臨界資源、同步和互斥

程序同步的基本概念:臨界資源、同步和互斥

在多道程式環境下,程序是併發執行的,不同程序之間存在著不同的相互制約關係。為了協調程序之間的相互制約關係,引入了程序同步的概念。

臨界資源

雖然多個程序可以共享系統中的各種資源,但其中許多資源一次只能為一個程序所使用,我們把一次僅允許一個程序使用的資源稱為臨界資源。許多物理裝置都屬於臨界資源,如印表機等。此外,還有許多變數、資料等都可以被若干程序共享,也屬於臨界資源。

對臨界資源的訪問,必須互斥地進行,在每個程序中,訪問臨界資源的那段程式碼稱為臨界區。為了保證臨界資源的正確使用,可以把臨界資源的訪問過程分成四個部分:

  • 進入區。為了進入臨界區使用臨界資源,在進入區要檢查可否進入臨界區,如果可以進入臨界區,則應設定正在訪問臨界區的標誌,以阻止其他程序同時進入臨界區。
  • 臨界區。程序中訪問臨界資源的那段程式碼,又稱臨界段。
  • 退出區。將正在訪問臨界區的標誌清除。
  • 剩餘區。程式碼中的其餘部分。
 
  1. do {
  2. entry section; //進入區
  3. critical section; //臨界區
  4. exit section; //退出區
  5. remainder section; //剩餘區
  6. } while (true)

同步

同步亦稱直接制約關係,它是指為完成某種任務而建立的兩個或多個程序,這些程序因為需要在某些位置上協調它們的工作次序而等待、傳遞資訊所產生的制約關係。程序間的直接制約關係就是源於它們之間的相互合作。

例如,輸入程序A通過單緩衝向程序B提供資料。當該緩衝區空時,程序B不能獲得所需資料而阻塞,一旦程序A將資料送入緩衝區,程序B被喚醒。反之,當緩衝區滿時,程序A被阻塞,僅當程序B取走緩衝資料時,才喚醒程序A。

互斥

互斥亦稱間接制約關係。當一個程序進入臨界區使用臨界資源時,另一個程序必須等待, 當佔用臨界資源的程序退出臨界區後,另一程序才允許去訪問此臨界資源。

例如,在僅有一臺印表機的系統中,有兩個程序A和程序B,如果程序A需要列印時, 系統已將印表機分配給程序B,則程序A必須阻塞。一旦程序B將印表機釋放,系統便將程序A喚醒,並將其由阻塞狀態變為就緒狀態。

為禁止兩個程序同時進入臨界區,同步機制應遵循以下準則:

  • 空閒讓進。臨界區空閒時,可以允許一個請求進入臨界區的程序立即進入臨界區。
  • 忙則等待。當已有程序進入臨界區時,其他試圖進入臨界區的程序必須等待。
  • 有限等待。對請求訪問的程序,應保證能在有限時間內進入臨界區。(受惠的是程序自己)。
  • 讓權等待。當程序不能進入臨界區時,應立即釋放處理器,防止程序忙等待。(受惠的是其他程序)

http://c.biancheng.net/cpp/html/2596.html