在計(jì)算機(jī)操作系統(tǒng)的核心機(jī)制中,進(jìn)程同步是確保多個(gè)進(jìn)程或線程有序、協(xié)調(diào)地訪問共享資源,從而維持系統(tǒng)數(shù)據(jù)一致性與執(zhí)行正確性的關(guān)鍵技術(shù)。與之緊密相關(guān)的計(jì)算機(jī)系統(tǒng)服務(wù),則為進(jìn)程的運(yùn)行提供了基礎(chǔ)環(huán)境與支持。本文將作為復(fù)習(xí)筆記,梳理這兩部分的核心概念與原理。
一、進(jìn)程同步的必要性與核心問題
在多道程序設(shè)計(jì)的現(xiàn)代操作系統(tǒng)中,多個(gè)進(jìn)程并發(fā)執(zhí)行是常態(tài)。當(dāng)這些進(jìn)程需要訪問共同的資源(如共享內(nèi)存區(qū)、文件、硬件設(shè)備)或進(jìn)行通信時(shí),如果沒有恰當(dāng)?shù)膮f(xié)調(diào)機(jī)制,就會(huì)引發(fā)一系列問題,其中最典型的是 “競爭條件”。
- 競爭條件:多個(gè)進(jìn)程并發(fā)讀寫某些共享數(shù)據(jù),而最終的結(jié)果取決于進(jìn)程執(zhí)行的精確時(shí)序(一種不確定性狀態(tài))。這往往導(dǎo)致數(shù)據(jù)不一致或程序運(yùn)行錯(cuò)誤。
- 臨界區(qū)問題:為了避免競爭條件,需要確保進(jìn)程互斥地訪問共享資源。進(jìn)程中訪問共享資源的那段代碼被稱為臨界區(qū)。任何時(shí)刻只允許一個(gè)進(jìn)程進(jìn)入其臨界區(qū)。一個(gè)好的同步解決方案必須滿足:
- 互斥:任何時(shí)候至多一個(gè)進(jìn)程可在其臨界區(qū)內(nèi)。
- 前進(jìn)(空閑讓進(jìn)):如果沒有進(jìn)程在臨界區(qū)內(nèi),且有進(jìn)程希望進(jìn)入,那么應(yīng)能盡快決定由哪個(gè)進(jìn)程進(jìn)入。
- 有限等待:一個(gè)進(jìn)程從提出進(jìn)入請求到被允許進(jìn)入,其等待時(shí)間必須是有限的。
二、進(jìn)程同步的主要機(jī)制
操作系統(tǒng)和編程語言提供了多種機(jī)制來實(shí)現(xiàn)進(jìn)程同步。
- 軟件方法(算法):如Peterson算法、Dekker算法等。這些算法通過共享變量來協(xié)調(diào)進(jìn)程,但通常只適用于兩個(gè)進(jìn)程,且依賴于忙等待(自旋),效率較低。
- 硬件方法:通過特殊的原子指令來保證互斥,例如:
- Test-and-Set指令:原子性地讀取并修改內(nèi)存單元的值。
* Swap指令:原子性地交換兩個(gè)字的內(nèi)容。
硬件方法簡單有效,但同樣可能涉及忙等待,且對編程者要求較高。
- 高級抽象機(jī)制(最常用):
- 信號量:由Dijkstra提出,是一種整型變量,只能通過兩個(gè)原子操作
P(或wait)和V(或signal)來訪問。信號量分為:
- 計(jì)數(shù)信號量:值域不受限,用于管理多個(gè)同類資源。
* 二進(jìn)制信號量/互斥鎖:值只能為0或1,用于實(shí)現(xiàn)互斥。
信號量功能強(qiáng)大,可用于解決互斥和同步(如生產(chǎn)者-消費(fèi)者問題、讀者-寫者問題)等多種經(jīng)典問題。
- 管程:一種高級同步原語,將共享變量及其操作封裝在一個(gè)模塊中,管程內(nèi)的過程在同一時(shí)刻僅允許一個(gè)進(jìn)程活躍。管程通過條件變量及其
wait和signal操作來管理進(jìn)程的阻塞與喚醒,比信號量更易于保證正確性。
三、計(jì)算機(jī)系統(tǒng)服務(wù):進(jìn)程運(yùn)行的支撐平臺(tái)
進(jìn)程同步機(jī)制的有效運(yùn)行,離不開操作系統(tǒng)提供的一系列底層系統(tǒng)服務(wù)。這些服務(wù)是操作系統(tǒng)內(nèi)核的核心功能,為所有用戶進(jìn)程和應(yīng)用軟件提供基礎(chǔ)支持。主要系統(tǒng)服務(wù)包括:
- 進(jìn)程管理服務(wù):
- 進(jìn)程創(chuàng)建與終止:提供
fork(),exec(),exit()等系統(tǒng)調(diào)用。
- 進(jìn)程調(diào)度:決定哪個(gè)就緒進(jìn)程獲得CPU使用權(quán)。
- 進(jìn)程同步與通信:提供前述的信號量、消息隊(duì)列、共享內(nèi)存等機(jī)制的系統(tǒng)調(diào)用接口。
- 內(nèi)存管理服務(wù):
- 為進(jìn)程分配和回收內(nèi)存空間。
- 實(shí)現(xiàn)虛擬內(nèi)存、分頁、分段等,為每個(gè)進(jìn)程提供獨(dú)立的地址空間,這是進(jìn)程隔離和安全的基礎(chǔ)。
- 文件系統(tǒng)服務(wù):
- 提供文件的創(chuàng)建、讀寫、刪除、目錄管理等操作。
- 管理磁盤空間,實(shí)現(xiàn)數(shù)據(jù)的持久化存儲(chǔ)。
- 設(shè)備管理服務(wù):
- 抽象硬件設(shè)備,提供統(tǒng)一的設(shè)備驅(qū)動(dòng)接口。
- 處理設(shè)備的I/O請求,管理緩沖區(qū)。
- 保護(hù)與安全服務(wù):
- 實(shí)施訪問控制,確保進(jìn)程只能訪問其被授權(quán)的資源。
- 提供用戶認(rèn)證、權(quán)限管理等安全機(jī)制。
四、聯(lián)系與
進(jìn)程同步是并發(fā)編程中的核心挑戰(zhàn),它依賴于操作系統(tǒng)提供的系統(tǒng)服務(wù)(特別是進(jìn)程管理和通信服務(wù))來實(shí)現(xiàn)其機(jī)制。例如,一個(gè)P操作在底層可能涉及將當(dāng)前進(jìn)程狀態(tài)改為阻塞,并將其放入信號量的等待隊(duì)列,這需要進(jìn)程調(diào)度和內(nèi)核數(shù)據(jù)結(jié)構(gòu)的支持。
反之,系統(tǒng)服務(wù)的穩(wěn)定、高效運(yùn)行,也必須處理好其內(nèi)部可能存在的并發(fā)訪問問題(例如,內(nèi)核數(shù)據(jù)結(jié)構(gòu)本身的同步),這同樣需要用到進(jìn)程同步技術(shù)。因此,理解進(jìn)程同步是深入理解操作系統(tǒng)內(nèi)核如何工作、如何提供可靠服務(wù)的關(guān)鍵。在復(fù)習(xí)時(shí),應(yīng)結(jié)合經(jīng)典同步問題(生產(chǎn)者-消費(fèi)者、哲學(xué)家就餐等),通過偽代碼深刻理解信號量和管程的應(yīng)用,并明晰這些高層抽象是如何構(gòu)建在底層系統(tǒng)服務(wù)之上的。