第四章:進(jìn)程同步與計(jì)算機(jī)系統(tǒng)服務(wù)
一、進(jìn)程同步的必要性
在多道程序設(shè)計(jì)的計(jì)算機(jī)系統(tǒng)中,多個進(jìn)程并發(fā)執(zhí)行,共享系統(tǒng)資源(如CPU、內(nèi)存、I/O設(shè)備等)。當(dāng)多個進(jìn)程需要訪問共享資源或進(jìn)行通信時,若缺乏有效的協(xié)調(diào)機(jī)制,可能導(dǎo)致以下問題:
- 競爭條件:多個進(jìn)程同時對共享數(shù)據(jù)進(jìn)行讀寫操作,最終的執(zhí)行結(jié)果取決于進(jìn)程執(zhí)行的相對順序,導(dǎo)致結(jié)果不可預(yù)測。
- 數(shù)據(jù)不一致:由于進(jìn)程執(zhí)行順序不當(dāng),導(dǎo)致共享數(shù)據(jù)狀態(tài)出現(xiàn)矛盾或錯誤。
因此,進(jìn)程同步的核心目標(biāo)是為并發(fā)執(zhí)行的進(jìn)程提供一種協(xié)調(diào)機(jī)制,確保它們能夠有序、正確地訪問共享資源,從而維護(hù)系統(tǒng)數(shù)據(jù)的一致性和程序的正確性。
二、臨界區(qū)問題與同步準(zhǔn)則
- 臨界區(qū):進(jìn)程中訪問共享資源(臨界資源)的那段代碼。
- 同步機(jī)制需滿足的準(zhǔn)則:
- 互斥:在任意時刻,最多只允許一個進(jìn)程進(jìn)入其臨界區(qū)。
- 空閑讓進(jìn):當(dāng)無進(jìn)程處于臨界區(qū)時,任何請求進(jìn)入臨界區(qū)的進(jìn)程應(yīng)能立即進(jìn)入。
- 有限等待:任何請求進(jìn)入臨界區(qū)的進(jìn)程,應(yīng)在有限時間內(nèi)獲得許可,避免“饑餓”現(xiàn)象。
- 讓權(quán)等待(可選但有益):當(dāng)進(jìn)程無法進(jìn)入臨界區(qū)時,應(yīng)立即釋放處理機(jī),避免“忙等待”。
三、經(jīng)典的進(jìn)程同步機(jī)制
1. 軟件方法:Peterson算法
通過設(shè)置共享變量(如turn和flag數(shù)組)來實(shí)現(xiàn)兩個進(jìn)程間的互斥。它巧妙地結(jié)合了“輪流進(jìn)入”和“主動謙讓”的思想,在軟件層面滿足了互斥、空閑讓進(jìn)和有限等待的要求。
2. 硬件方法:關(guān)中斷與硬件指令
- 關(guān)中斷:進(jìn)程進(jìn)入臨界區(qū)前關(guān)閉中斷,離開時打開。簡單有效,但僅適用于單處理器,且將權(quán)力交給用戶進(jìn)程風(fēng)險(xiǎn)高。
- 硬件原子指令:如
Test-and-Set指令、Swap指令。這些指令在執(zhí)行期間不可分割,可用于構(gòu)建更高級的同步原語(如鎖),但容易導(dǎo)致“忙等待”。
3. 高級抽象:信號量(Semaphore)
由Dijkstra提出,是操作系統(tǒng)提供的一種功能強(qiáng)大的同步工具。
- 數(shù)據(jù)結(jié)構(gòu):一個整型變量
value和一個進(jìn)程等待隊(duì)列。
- 兩種基本操作(原語):
- P操作(wait):申請資源。
value--;若value<0,則進(jìn)程阻塞并進(jìn)入等待隊(duì)列。
- V操作(signal):釋放資源。
value++;若value<=0,則從等待隊(duì)列中喚醒一個進(jìn)程。
- 類型:
- 整型信號量:未遵循“讓權(quán)等待”,可能忙等。
- 記錄型信號量:通過阻塞喚醒機(jī)制,徹底避免了忙等。
- 應(yīng)用:
- 互斥信號量(mutex):初值為1,用于實(shí)現(xiàn)進(jìn)程互斥。
- 資源信號量:初值為可用資源數(shù)N,用于管理資源池。
- 同步信號量:初值為0,用于協(xié)調(diào)進(jìn)程間的執(zhí)行順序(如“生產(chǎn)者-消費(fèi)者”問題)。
4. 經(jīng)典同步問題
- 生產(chǎn)者-消費(fèi)者問題:一組生產(chǎn)者進(jìn)程和一組消費(fèi)者進(jìn)程通過共享的固定大小緩沖區(qū)進(jìn)行通信。需解決對緩沖區(qū)的互斥訪問以及生產(chǎn)/消費(fèi)的順序協(xié)調(diào)(空則等、滿則等)。
- 讀者-寫者問題:多個讀者進(jìn)程和寫者進(jìn)程共享一個數(shù)據(jù)對象。允許多個讀者同時讀,但寫者必須獨(dú)占訪問。存在“讀者優(yōu)先”和“寫者優(yōu)先”等變體。
- 哲學(xué)家進(jìn)餐問題:描述多個進(jìn)程競爭有限資源時可能發(fā)生的死鎖問題。解決方案包括設(shè)置資源上限、使用AND型信號量(一次性申請所有所需資源)或規(guī)定奇數(shù)/偶數(shù)哲學(xué)家不同的拿叉順序等。
四、管程(Monitor)
為了簡化并發(fā)程序設(shè)計(jì)的復(fù)雜性,引入了管程這一高級同步機(jī)制。它是一種編程語言構(gòu)件,封裝了共享數(shù)據(jù)結(jié)構(gòu)和對其操作的所有過程,并提供了互斥和同步的機(jī)制。
- 管程內(nèi)的共享變量只能被管程內(nèi)的過程訪問。
- 任何時刻,最多只有一個進(jìn)程在管程內(nèi)活動(由編譯器負(fù)責(zé)實(shí)現(xiàn)互斥)。
- 提供了條件變量(Condition Variable)及
wait()和signal()操作,用于實(shí)現(xiàn)進(jìn)程同步(當(dāng)某條件不滿足時,進(jìn)程可在條件變量上等待;條件滿足時,被其他進(jìn)程喚醒)。
- 優(yōu)點(diǎn):將同步細(xì)節(jié)隱藏在管程內(nèi)部,程序員只需調(diào)用管程過程,不易出錯。
五、進(jìn)程同步與計(jì)算機(jī)系統(tǒng)服務(wù)
進(jìn)程同步機(jī)制是操作系統(tǒng)內(nèi)核為上層應(yīng)用程序提供的一項(xiàng)基礎(chǔ)且關(guān)鍵的系統(tǒng)服務(wù)。它體現(xiàn)在:
- 內(nèi)核實(shí)現(xiàn):信號量、管程等機(jī)制由操作系統(tǒng)內(nèi)核實(shí)現(xiàn)并提供系統(tǒng)調(diào)用接口(如
sem<em>init, sem</em>wait, sem_post)。
- 系統(tǒng)調(diào)用封裝:應(yīng)用程序通過調(diào)用這些系統(tǒng)服務(wù),而非自行實(shí)現(xiàn)復(fù)雜的同步邏輯,保證了正確性和效率。
- 支撐高級服務(wù):文件系統(tǒng)、網(wǎng)絡(luò)通信、內(nèi)存管理等所有涉及資源共享的內(nèi)核子系統(tǒng),其內(nèi)部都嚴(yán)重依賴進(jìn)程同步機(jī)制來保證一致性。
- 現(xiàn)代編程支持:現(xiàn)代編程語言(如Java的
synchronized關(guān)鍵字和wait/notify,Go的channel)和線程庫(如POSIX pthread的互斥鎖、條件變量)都是對操作系統(tǒng)底層同步服務(wù)的封裝和抽象。
六、
進(jìn)程同步是操作系統(tǒng)的核心概念之一,是理解并發(fā)編程和多線程技術(shù)的基石。從軟件算法到硬件指令,再到信號量和管程,同步機(jī)制不斷抽象和進(jìn)化,目標(biāo)是在保證正確性的前提下,提高并發(fā)效率和編程便利性。作為系統(tǒng)服務(wù),它為整個計(jì)算機(jī)系統(tǒng)的穩(wěn)定、高效運(yùn)行提供了根本保障。學(xué)習(xí)本章,關(guān)鍵在于理解各種同步問題的本質(zhì)、不同機(jī)制的優(yōu)缺點(diǎn),并能運(yùn)用信號量等工具解決經(jīng)典的同步問題。
如若轉(zhuǎn)載,請注明出處:http://m.999lay.cn/product/42.html
更新時間:2026-04-14 16:58:58