|
在本科學(xué)習(xí)過《操作系統(tǒng)》的同志們都知道,現(xiàn)代操作系統(tǒng)提供了一個并發(fā)控制環(huán)境,即系統(tǒng)中同時活動著的多個不同的進程,這些進程共享同一個CPU、內(nèi)存或 I/O設(shè)備。特別是對于Linux這種世界上最先進的操作系統(tǒng)來說,其多任務(wù)、多用戶、分時實時混合的性質(zhì)決定了多個進程在某種程度上彼此依賴或相互制約的關(guān)系,這些關(guān)系我們叫“并發(fā)關(guān)系”,按其性質(zhì)可以分為同步(synchronization)和互斥(mutual exclusion)兩類。
本篇博文,我們就對同步和互斥的一些基本概念進行一下梳理,以便在以后的工作中能由一個明確的概念。
臨界資源:系統(tǒng)中同時存在有許多進程,它們共享各種資源,然而有許多資源在某一時刻只能允許一個進程使用。例如打印機、磁帶機等硬件設(shè)備和變量、隊列等數(shù)據(jù)結(jié)構(gòu),如果有多個進程同時去使用這類資源就會造成混亂。因此必須保護這些資源,避免兩個或多個進程同時訪問這類資源。我們把某段時間內(nèi)只能允許一個進程使用的資源稱為臨界資源。
互斥:進程間相互排斥的使用臨界資源的現(xiàn)象,就叫互斥,很簡單。
同步:對比前面的互斥概念,還有一種并發(fā)關(guān)系叫做同步,即進程之間的關(guān)系不是相互排斥臨界資源的關(guān)系,而是相互依賴的關(guān)系。進一步的說明:就是前一個進程的輸出作為后一個進程的輸入,當(dāng)?shù)谝粋進程沒有輸出時第二個進程必須等待。
臨界區(qū):幾個進程若共享同一臨界資源,它們必須以互相排斥的方式使用這個臨界資源,即當(dāng)一個進程正在使用某個臨界資源且尚未使用完畢時,其它進程必須延遲對該資源的操作,當(dāng)使用該資源的進程釋放該資源時,其它進程才可使用該資源,任何進程不能從中插進去使用這個臨界資源,否則將會造成信息混亂和操作出錯。我們把訪問臨界資源的代碼段稱為臨界區(qū)。
并發(fā)環(huán)境有偽并發(fā)(單處理器)和真并發(fā)(多處理器)之分,但是都會造成競爭條件。用戶空間之所以需要同步,是因為用戶程序會被調(diào)度程序搶占和重新調(diào)度。在Linux中,造成并發(fā)執(zhí)行的原因大致有如下幾條:
1. 中斷
2. 軟中斷和tasklet
3. 內(nèi)核搶占——任務(wù)的優(yōu)先級
4. 睡眠及用戶空間的同步
5. SMP —— 多處理器
其中,1、2、3、4條屬于偽并發(fā),第5條屬于真并發(fā)。
不管是真并發(fā),還是偽并發(fā),其本質(zhì)都是系統(tǒng)中存在了獨占資源,處理而并發(fā)進程控制其實是很困難的,有以下三座大山需要解決:
1、并發(fā)進程在爭用有限的全局共享資源時容易引起沖突。
2、由于進程被調(diào)度執(zhí)行的順序是動態(tài)的和隨機的,所以操作系統(tǒng)很難最佳的管理資源分配。
3、程序的執(zhí)行結(jié)果和系統(tǒng)執(zhí)行速度有關(guān)。
下面,我們就來看看Linux是怎么解決上述三大問題的。
首先,第一個問題,Linux是通過進程控制塊解決的,整個解決方法是圍繞一個核心數(shù)據(jù)結(jié)構(gòu)—— task_struct,給所有進程規(guī)定一些狀態(tài),并建立一系列的算法。我們會在進程控制專題中詳細(xì)討論。
第二個問題,關(guān)于資源的分配管理,主要有處理器分配、內(nèi)存分配、文件系統(tǒng)訪問和I/O設(shè)備的使用。對于Linux來說,是通過進程調(diào)度、虛擬內(nèi)存管理、文件管理和I/O設(shè)備管理模塊來解決的。我們也會在相應(yīng)的專題來重點討論。
最后一個問題,其實你好好的分析一下,可以看出,這個問題其實是解決前兩個問題后所帶來的一個新問題,即Linux必須解決程序的結(jié)果與進程的執(zhí)行速度及先后次序無關(guān)的問題。這,也是我們本專題重點討論的問題。
最后一個問題我們再進一步分析一下,我們要解決同步與互斥,其實本質(zhì)上是要解決兩個問題:死鎖和饑餓。
死鎖的問題大家很熟悉了,這里不再贅述,我重點談?wù)勷囸I。饑餓是多進程對臨界資源互斥訪問的另一種問題,如果某種資源分配算法表面上看似很合理,但可能在一段時間內(nèi)或無限期地使系統(tǒng)中的某些進程得不到服務(wù),或者說這些進程訪問資源時被無限期地拒絕,我們就稱這種現(xiàn)象叫做“饑餓”
綜上所述,在并發(fā)程序中為了防止競爭條件,除了要做到互斥和同步外,還得保證并發(fā)進程不會出現(xiàn)“死鎖”、“饑餓”現(xiàn)象。所以,Linux提出了一下四種原則來保障并發(fā)程序的可執(zhí)行性:
1、每次只允許一個進程進入臨界區(qū)
2、如果某個進程進入臨界區(qū),其他試圖進入該臨界區(qū)的進程必須等待
3、當(dāng)多個進程申請進入同一臨界區(qū)時,在有限時間內(nèi)讓其中之一進入臨界區(qū)
4、位于臨界區(qū)的進程只能逗留有限時間,時間一到立即讓出
好了,關(guān)于同步與互斥最基本的概念就介紹到這里。雖然文章不長,但內(nèi)容十分重要,本專題后面將具體講解Linux內(nèi)核中使用的同步與互斥機制的各種實現(xiàn)方式,希望大家在分析每種方式的時候,都不要忘了回頭來看看這篇文章,做到實際聯(lián)系理論,感性聯(lián)系理性。
|
|