操作系統引入了進程之後使得操作系統的進程可以併發的執行,極大的提高了系統資源利用率以及吞吐量,在進程併發執行的過程中,由於系統的資源有限,而併發的進程可能都需要系統資源,這樣極易引發併發的進程對系統資源的爭奪。
舉個例子 :兩個併發的進程都需要進行I/O操作,然而系統的I/O資源只有一個,這樣當其中一個進程搶奪到I/O資源之後,便進入其相關的阻塞隊列等待處理I/O操作,而另外一個進程由於未獲取I/O資源導致在處理機種無法進行之後的操作,只能進行忙等,這樣就造成了死鎖
爲了平衡這種衝突進而引入了進程同步的機制
1. 臨界資源以及臨界區
瞭解進程同步的相關概念之前,首先應該熟悉兩種基本概念:臨界資源/臨界區
- 臨界資源
簡單來說,就是可供進程使用的資源,例如打印機,磁帶機等硬件資源都 屬於臨界資源 - 臨界區
爲了使進程能夠互斥訪問臨界資源,而存放臨界資源的地方就稱爲臨界區
2.同步機制遵循規則
- 空閒讓進
無進程進入臨界區,說明臨界資源處於空閒狀態,所以其允許一個請求進入臨界區的進程進入臨界區,有效利用系統資源 - 忙則等待
當有進程進入臨界區,表面臨界資源正在被訪問,而其他申請進入臨界區的進程只能繼續等待,保證資源互斥訪問 - 有限等待
當要求訪問臨界資源的進程處於等待狀態時,並非一直等待下去 - 讓權等待
當進程由於自身原因不能進入臨界區時,應該釋放處理機,避免進程忙的
3.訪問臨界區的模型
當某個進程需要訪問臨界資源的時候,首先對訪問的臨界資源進行檢查,如果該臨界資源未被訪問,則該進程拿到該資源的權限,並設置設置臨界資源的權限
/*訪問臨界資源的循環進程代碼*/
while(true)
{
InputsSpace(); /*進入區*/
CriticalSpace(); /*臨界區*/
SignOutSpace();/*退出區*/
SurplusSpace(); /*剩餘區*/
}