找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2143|回復(fù): 0
收起左側(cè)

偽并發(fā)

[復(fù)制鏈接]
ID:107189 發(fā)表于 2016-3-5 19:53 | 顯示全部樓層 |閱讀模式
在本科學(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)系理性。


回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表