衛(wèi)一芃 楊弋 張東
摘 要: 并發(fā)執(zhí)行的各進(jìn)程在訪問(wèn)共享資源時(shí)可能造成操作系統(tǒng)的混亂。如何做到進(jìn)程間相互合作,共享資源?本文詳細(xì)介紹了各種進(jìn)程間同步互斥的方式以及信號(hào)機(jī)制。這些方式使用靈活、方便,能夠有效地實(shí)現(xiàn)進(jìn)程間的資源共享及相互合作。
關(guān)鍵詞:進(jìn)程同步;信號(hào)量;事件;互斥量;條件變量;信號(hào)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
嵌入式實(shí)時(shí)多分區(qū)操作系統(tǒng)是專門為新一代航空電子系統(tǒng)開(kāi)發(fā)的,它是支持綜合化航空電子系統(tǒng)的嵌入式實(shí)時(shí)操作系統(tǒng)。進(jìn)程同步與通信功能的出現(xiàn)為多任務(wù)同時(shí)執(zhí)行提供的可能。進(jìn)程同步機(jī)制在嵌入式實(shí)時(shí)多分區(qū)操作系統(tǒng)中進(jìn)程交互、數(shù)據(jù)保護(hù)及臨界資源保護(hù)等方面做出巨大貢獻(xiàn)。
1 進(jìn)程間關(guān)系
為了滿足新一代航空電子系統(tǒng)高度綜合化、模塊化的要求,在高安全實(shí)時(shí)操作系統(tǒng)中引 入了分區(qū)的概念。分區(qū)在時(shí)間和空間上相互隔離。分區(qū)內(nèi)運(yùn)行一個(gè)或多個(gè)進(jìn)程,每個(gè)進(jìn)程作為基本的運(yùn)行單位隸屬于特定的分區(qū),各進(jìn)程之間并發(fā)執(zhí)行[ 1 ]。
一個(gè)進(jìn)程就是一個(gè)正在執(zhí)行程序的實(shí)例,包括程序計(jì)數(shù)器,寄存器和變量的當(dāng)前值。進(jìn)程是分區(qū)內(nèi)的可調(diào)度單元。一個(gè)分區(qū)內(nèi)的進(jìn)程共享分區(qū)資源。進(jìn)程參與資源競(jìng)爭(zhēng),處理器資源在進(jìn)程間分配,進(jìn)程的狀態(tài)在不斷的變化[ 2 ]。
進(jìn)程動(dòng)態(tài)性、并發(fā)性、獨(dú)立性及異步性等特性。進(jìn)程的異步性就是指每個(gè)進(jìn)程都以其相對(duì)獨(dú)立不可預(yù)知的速度運(yùn)行。進(jìn)程的異步性是導(dǎo)致進(jìn)程爭(zhēng)奪共享資源的原因。
多道程序系統(tǒng)中,進(jìn)程間由于資源共享及合作,各進(jìn)程可能產(chǎn)生兩種形式的制約關(guān)系—間接制約和直接制約。在僅有一臺(tái)打印機(jī)的系統(tǒng)中有兩個(gè)進(jìn)程,一個(gè)進(jìn)程占用打印機(jī)時(shí)另一個(gè)進(jìn)程必須阻塞,等到打印機(jī)空閑,阻塞的進(jìn)程才能被喚醒,轉(zhuǎn)為就緒態(tài),占用打印機(jī)。這種情況下兩個(gè)進(jìn)程的關(guān)系稱為間接制約。另一種情況是,進(jìn)程之間通過(guò)緩沖傳遞數(shù)據(jù)。當(dāng)緩沖為空時(shí)接收進(jìn)程阻塞,此時(shí),如果有發(fā)送進(jìn)程向緩沖發(fā)送數(shù)據(jù),接收進(jìn)程才能被喚醒。反之,當(dāng)緩沖滿時(shí),發(fā)送進(jìn)程阻塞,接收進(jìn)程從緩沖接收數(shù)據(jù)后,緩沖不滿,發(fā)送進(jìn)程才能從阻塞態(tài)轉(zhuǎn)為就緒態(tài),向緩沖發(fā)送消息。
2 進(jìn)程同步與互斥
任何一個(gè)時(shí)刻,只有一個(gè)進(jìn)程處于運(yùn)行態(tài),占用處理器。兩個(gè)或多個(gè)進(jìn)程讀寫某些共享數(shù)據(jù),而最后的結(jié)果取決于進(jìn)程運(yùn)行的精準(zhǔn)時(shí)序,這種現(xiàn)象稱為競(jìng)爭(zhēng)條件(race condition)。
如何避免競(jìng)爭(zhēng)條件?要避免此類現(xiàn)象的發(fā)生關(guān)鍵是要找出某種途徑以阻止多個(gè)進(jìn)程同時(shí)讀寫共享數(shù)據(jù),即以某種手段確保當(dāng)一個(gè)進(jìn)程在使用共享變量或文件時(shí)其他進(jìn)程不能操作。這種手段即為互斥(mutual exclusion)。我們把對(duì)共享內(nèi)存進(jìn)行訪問(wèn)的程序片段稱為臨區(qū)域(critical region)或臨界區(qū)(critical section)。如果我們能夠適當(dāng)?shù)匕才?,使得兩個(gè)進(jìn)程不可能同時(shí)處于臨界區(qū)中,就能夠避免競(jìng)爭(zhēng)條件。
實(shí)現(xiàn)進(jìn)程間同步與互斥的方式有:信號(hào)量,事件,互斥量,條件變量。下面詳細(xì)介紹這幾種方式。
2.1信號(hào)量
信號(hào)量用于實(shí)現(xiàn)對(duì)分區(qū)內(nèi)資源的同步和互斥訪問(wèn)。進(jìn)程等待信號(hào)量以獲取資源訪問(wèn)權(quán),訪問(wèn)結(jié)束時(shí)釋放信號(hào)量。等待信號(hào)量的進(jìn)程可以按照FIFO(先進(jìn)先出,F(xiàn)irst in First out)規(guī)則,也可以按照優(yōu)先級(jí)規(guī)則在資源的等待隊(duì)列中排隊(duì)。相同優(yōu)先級(jí)的進(jìn)程按照FIFO規(guī)則排隊(duì)。進(jìn)程在等待隊(duì)列的排隊(duì)規(guī)則在信號(hào)量創(chuàng)建時(shí)定義。
信號(hào)量管理提供了資源同步和互斥訪問(wèn)的機(jī)制,分區(qū)中提供了兩種類型的信號(hào)量:計(jì)數(shù)信號(hào)量和互斥信號(hào)量。
計(jì)數(shù)信號(hào)量用于對(duì)多個(gè)資源的受控訪問(wèn),初始值為共享資源的數(shù)目?;コ庑盘?hào)量用于共享資源的互斥訪問(wèn)。創(chuàng)建信號(hào)量時(shí)設(shè)置計(jì)數(shù)器的初始值,當(dāng)信號(hào)量被獲取時(shí),其計(jì)數(shù)值減1;當(dāng)信號(hào)量被釋放時(shí),其計(jì)數(shù)值加1。如果計(jì)數(shù)值為0,則嘗試獲取信號(hào)量的進(jìn)程被阻塞。等待信號(hào)量的進(jìn)程可以按照先進(jìn)先出原則,也可以按照優(yōu)先級(jí)次序原則在隊(duì)列中排隊(duì)。采用優(yōu)先級(jí)排隊(duì)規(guī)則時(shí),對(duì)于同優(yōu)先級(jí)進(jìn)程按先進(jìn)先出原則排隊(duì)。
2.2 事件
事件是一種進(jìn)程間通信機(jī)制:它可以把某種情況的發(fā)生告知給等待進(jìn)程。事件是一個(gè)二值狀態(tài)變量(狀態(tài)為“有效態(tài)(UP)”和“無(wú)效態(tài)(DOWN)”),通過(guò)事件狀態(tài)的改變通知進(jìn)程事件的發(fā)生。
2.3互斥量
一個(gè)互斥量在某一時(shí)刻只允許一個(gè)進(jìn)程獲取。每個(gè)互斥量包含一個(gè)優(yōu)先級(jí)定義,當(dāng)某個(gè)進(jìn)程擁有該互斥量時(shí),該進(jìn)程的優(yōu)先級(jí)被提升到該互斥量所定義的優(yōu)先級(jí);當(dāng)該進(jìn)程釋放該互斥量時(shí),該進(jìn)程的優(yōu)先級(jí)被恢復(fù)到其擁有該互斥量之前的值;如果進(jìn)程在獲得互斥量后被其他服務(wù)設(shè)置了優(yōu)先級(jí),那么在該進(jìn)程釋放互斥量時(shí),它的優(yōu)先級(jí)將被恢復(fù)為該服務(wù)設(shè)置的優(yōu)先級(jí)。
一個(gè)進(jìn)程在某一時(shí)刻最多只允許獲取一個(gè)互斥量,當(dāng)某進(jìn)程擁有互斥量時(shí),它不允許被調(diào)用的服務(wù)阻塞。
等待互斥量的進(jìn)程可以按照先進(jìn)先出原則,也可以按照優(yōu)先級(jí)次序原則在隊(duì)列中排隊(duì)。在優(yōu)先級(jí)次序條件下,同等優(yōu)先級(jí)的進(jìn)程按照先進(jìn)先出原則排隊(duì)。等待隊(duì)列的排隊(duì)原則在互斥量創(chuàng)建時(shí)定義。
每個(gè)互斥量都有一個(gè)鎖定計(jì)數(shù),進(jìn)程釋放互斥量的次數(shù)必須和獲取互斥量的次數(shù)相等,該互斥量才能夠被釋放。此外,進(jìn)程也可以通過(guò)重置互斥量來(lái)立即釋放互斥量[ 3 ]。
2.4 條件變量
條件變量是另一種同步機(jī)制?;コ饬吭谠试S或阻塞對(duì)臨界區(qū)的訪問(wèn)上非常有用,而條件變量允許線程由于一些未達(dá)到的條件而阻塞。
絕大多數(shù)情況下,條件變量與互斥量在一起使用。這種模式用于讓一個(gè)線程鎖住一個(gè)互斥量,然后當(dāng)它不能獲得它期待的結(jié)果時(shí)等待一個(gè)條件變量。最后另一個(gè)線程會(huì)向它發(fā)信號(hào),使其繼續(xù)執(zhí)行[ 4 ]。
3 信號(hào)
信號(hào)機(jī)制是進(jìn)程之間相互傳遞消息的一種方法,主要用于產(chǎn)生、傳送和處理系統(tǒng)中的各種信號(hào)。通過(guò)信號(hào)可以實(shí)現(xiàn)進(jìn)程間的控制和通信。進(jìn)程等待某個(gè)事件時(shí),該進(jìn)程仍然可以執(zhí)行其他任務(wù)。當(dāng)事件發(fā)生,操作系統(tǒng)發(fā)送信號(hào)通知該進(jìn)程。這稱之為信號(hào)的異步性。通過(guò)信號(hào)完成進(jìn)程間通信和控制,將大幅提高嵌入式實(shí)時(shí)多分區(qū)操作系統(tǒng)的處理能力,增強(qiáng)實(shí)時(shí)性。
4 結(jié)語(yǔ)
操作系統(tǒng)中引入進(jìn)程后,改善了資源利用率,但是由于進(jìn)程的異步性,在其爭(zhēng)奪共享資源時(shí)可能會(huì)給系統(tǒng)造成混亂,使數(shù)據(jù)處理出錯(cuò),導(dǎo)致每次結(jié)果不同。進(jìn)程同步和互斥的任務(wù)就是使并發(fā)執(zhí)行的各進(jìn)程之間能有效地共享資源和相互合作,從而使程序的執(zhí)行具有可再現(xiàn)性。
本文詳細(xì)介紹了信號(hào)量、事件、互斥量、條件變量等同步機(jī)制與信號(hào)的基本概念,在復(fù)雜的應(yīng)用中,進(jìn)程間共享的資源類型不一、大小不一,因此應(yīng)根據(jù)具體情況和需求,采用相應(yīng)的同步機(jī)制,以提高軟件設(shè)計(jì)的靈活性和信息交換的效率。
參考文獻(xiàn):
[1] 李運(yùn)喜,時(shí)磊,任曉瑞.分區(qū)內(nèi)進(jìn)程管理的設(shè)計(jì)與實(shí)現(xiàn)[J].航空計(jì)算計(jì)算,2005年12月,04期:12-14.
[2] 馮海欣.系統(tǒng)進(jìn)程的同步[J].科技資訊,2007年,04期:170.
[3] Airlines Electronic Engineering Committee. Avionics Application Software Standard Interface Part 1-Required Services[S].16701 MELFORD BLVD.SUITE 120 BOWIE, MARYLAND 20715 USA: ARINC, August 21,2015.
[4] Andrew S.Tanenbaum著,陳向群,馬紅兵,等譯.現(xiàn)代操作系統(tǒng)[M].第1版.北京:機(jī)械工業(yè)出版社,2013年6月.
航空科學(xué)基金項(xiàng)目資助:
工信部民用飛機(jī)專項(xiàng)科研項(xiàng)目(MJ-S-2012-05)
作者簡(jiǎn)介:
衛(wèi)一芃(1984-),女,陜西西安人,碩士研究生,研究方向?yàn)榍度胧綄?shí)時(shí)操作系統(tǒng)。