文章目錄
-
-
- 2.3.1 程序同步和程序互斥
-
- 2.3.1.1 什麼是程序同步?
- 2.3.1.2 什麼是程序互斥
- 2.3.1.3 小結
-
2.3.1 程序同步和程序互斥
知識總覽

2.3.1.1 什麼是程序同步?
在前面,我們說過程序具有
異步性
的特征。
而我們想讓程序執行的順序是可預知的,就需要程序同步機制。
曾經在2.1.4.3 管道通信我們說過,讀程序和寫程序并發地運作,當時我們說過,如果沒寫滿,就不允許讀;如果沒讀空,就不允許寫。也就是說是一個
先寫後讀
的順序,而這當中又含有
異步性
,我們不可控,這就需要
程序同步
來幫我們解決了。
同步
亦稱
直接制約關系
,它是指為完成某種任務而建立的兩個或多個程序,這些程序因為需要在某些位置上協調它們的工作次序而産生制約關系。程序間的直接制約關系就是源于它們之間的互相合作。
2.3.1.2 什麼是程序互斥
程序的“并發”需要“共享”的支援。各個并發執行的程序不可避免的需要共享一些系統資源(比如記憶體,又如列印機、攝像頭這樣的I/O裝置)。我們把資源共享方式分為兩種:
互斥共享方式
和
同時共享方式
。
之前在2.1.7.1之中我們曾經講過臨界資源的概念。許多實體裝置(比如攝像頭、列印機)都屬于臨界資源。此外還有許多變量、資料、記憶體緩沖區等都屬于臨界資源。
對臨界資源的通路,必須
互斥
地進行。互斥,也叫做
間接制約關系
。
程序互斥
指當一個程序通路某臨界資源時,另一個想要通路該臨界資源的程序必須等待。目前通路臨界資源的程序通路結束。釋放該資源之後,另一個程序才能去通路臨界資源。
對臨界資源的互斥通路,可以在邏輯上分為四個部分:
do{
entry section;//進入區
critical section;//臨界區
exit section;//退出區
remainder section;//剩餘區
}
其中
進入區
負責
檢查
是否可進入臨界區,若可進入,則應設定正在通路臨界資源的标志(可以了解為資料庫我們學過的上鎖),以阻止其他程序同時進入臨界區。
臨界區
就是通路臨界資源的那段代碼,
退出區
負責解除正在通路臨界資源的标志(可以了解為“解鎖”),
剩餘區
做其他處理。
需要注意的是,臨界區有時也叫做
臨界段
。
為了實作對臨界資源的互斥通路,同時保證系統整體性能,需要遵循以下原則:
- 空閑讓進。臨界區空閑時,可以允許一個請求進入臨界區的程序立即進入。
- 忙則等待。當已有程序進入臨界區時,其他試圖進入臨界區的程序必須等待。
- 有限等待。對于請求通路的程序,應該保證能在有限的時間内進入臨界區,這實際上也是我們後面講的活鎖。
- 讓權等待。當程序不能進入臨界區時,應該立即釋放處理機,防止程序忙等待,這實際上是為了防止死鎖。