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