1. 什么是信號(hào)量
????讓多個(gè)進(jìn)程(或線程,本文中的進(jìn)程跟線程不做區(qū)分,對(duì)進(jìn)程的應(yīng)用場(chǎng)景也可以使用在線程上)通過(guò)一個(gè)特殊變量來(lái)進(jìn)行交互,一個(gè)進(jìn)程在某個(gè)關(guān)鍵點(diǎn)上被迫停止執(zhí)行直到接受到某個(gè)特殊變量值。通過(guò)這一措施,任何復(fù)雜的進(jìn)程交互都可得到滿足,這種特殊的變量就是信號(hào)量。
????信號(hào)量可以看成是一種數(shù)據(jù)操作鎖,它本身不具有數(shù)據(jù)交換的功能,而是通過(guò)控制其他的通信資源(文件,外部設(shè)備)來(lái)實(shí)現(xiàn)進(jìn)程間通信,它本身只是一種外部資源的標(biāo)識(shí)。信號(hào)量在此過(guò)程中負(fù)責(zé)數(shù)據(jù)操作的互斥、同步等功能。
? ? 即:信號(hào)量就是一種特殊變量,其本質(zhì)就是一種變量。
????信號(hào)量機(jī)制由荷蘭學(xué)者Edsger Dijkstra在1965年提出。
2. 為什么要使用信號(hào)量
? ??為了防止出現(xiàn)因多個(gè)進(jìn)程同時(shí)訪問(wèn)一個(gè)共享資源而引發(fā)的一系列問(wèn)題,我們需要一種方法,在任一時(shí)刻只能有一個(gè)進(jìn)程訪問(wèn)代碼的臨界區(qū)域(臨界區(qū)是指訪問(wèn)臨界資源的那部分代碼,臨界資源是指一次僅允許一個(gè)進(jìn)程使用的資源)。?
????每個(gè)進(jìn)程中訪問(wèn)臨界資源的那段程序代碼稱為臨界區(qū),它需要獨(dú)占式地執(zhí)行。而信號(hào)量就可以提供這樣的一種訪問(wèn)機(jī)制,讓一個(gè)臨界區(qū)同一時(shí)間只有一個(gè)線程在訪問(wèn)它,也就是說(shuō)信號(hào)量是用來(lái)調(diào)協(xié)進(jìn)程對(duì)共享資源的訪問(wèn)的。
3. 信號(hào)量分類
????信號(hào)量一般分為兩類:
????一般信號(hào)量
? ? 信號(hào)量s為一個(gè)記錄型數(shù)據(jù)結(jié)構(gòu),其中value為整型變量,系統(tǒng)初始化時(shí)為其賦值,PV操作的原語(yǔ)描述如下:
? ? ? ? ? ? P:P是荷蘭語(yǔ)Passeren(通過(guò))的縮寫,將信號(hào)量s的value值減一,若結(jié)果小于零,則執(zhí)行P操作的進(jìn)程被堵塞,若結(jié)果大于等于零,則執(zhí)行P操作的進(jìn)程繼續(xù)執(zhí)行。
? ? ? ? ? ? V:V是荷蘭語(yǔ)Vrijgeven(釋放)的縮寫,將信號(hào)量s的value值加一,若結(jié)果不大于零,則執(zhí)行V操作的進(jìn)程從信號(hào)量s相關(guān)的list隊(duì)列中釋放一個(gè)進(jìn)程,使其轉(zhuǎn)化為就緒態(tài),自己則繼續(xù)執(zhí)行。若結(jié)果大于零,則執(zhí)行V操作的進(jìn)程繼續(xù)執(zhí)行。
????二值信號(hào)量
? ? 信號(hào)量s為一個(gè)記錄型數(shù)據(jù)結(jié)構(gòu),其value值只能取值為零或一,二值信號(hào)量PV操作的原語(yǔ)描述與一般信號(hào)量相同。
? ? 在實(shí)際簡(jiǎn)單項(xiàng)目開(kāi)發(fā)中,二值信號(hào)量的使用場(chǎng)景要多于一般信號(hào)量。
4. 信號(hào)量操作
????每個(gè)標(biāo)準(zhǔn)對(duì)信號(hào)量的實(shí)現(xiàn)提供了不同的方法,但基本的操作由信號(hào)量語(yǔ)義提出。針對(duì)信號(hào)量有四個(gè)操作,分別為:
? ??????1. 初始化(initialize),也叫做建立(create);
????????2. 等信號(hào)(wait),也可叫做掛起(suspend),即P操作;
????????3. 給信號(hào)(signal)或發(fā)信號(hào)(post),即V操作;
????????4. 清理(destroy)。
? ? 在實(shí)際的項(xiàng)目開(kāi)發(fā)中,信號(hào)量的使用要針對(duì)當(dāng)前的操作系統(tǒng)所支持的協(xié)議標(biāo)準(zhǔn)類型來(lái)使用,不同的協(xié)議標(biāo)準(zhǔn)所支持的信號(hào)量操作不同,具體的實(shí)現(xiàn)方式也不一致,但對(duì)于支持同一標(biāo)準(zhǔn)的不同操作系統(tǒng),所提供的信號(hào)量接口是一致的。
? ? 本模塊后續(xù)章節(jié)將針對(duì)具體的協(xié)議標(biāo)準(zhǔn)下的不同操作系統(tǒng)所實(shí)現(xiàn)的信號(hào)量接口進(jìn)行說(shuō)明。