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