訊號量的本質是一種資料操作鎖,其本身不具有資料交換的能力,而是通過控制其他的通訊資源(檔案、外部裝置)來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料的互斥、同步等功能。
當請求乙個訊號量來表示資源時,程序需要讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資源可用,程序會進入睡眠狀態直至資源可用。當程序不再使用乙個訊號量量控制的共享資源時,訊號量的值+1,對訊號量的值進行的增減操作均為原子操作,因為在訊號量的建立及初始化上,不能保證操作均為原子性。
訊號量的作用:
可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問**的臨界區域(執行資料更新的**需要獨佔式地執行),訊號量可讓乙個臨界區間同一時間只有乙個執行緒在訪問它。
訊號量的工作原理:
(1)p(sv)操作:若sv的值大於0,則給sv的值減1;若它的值為0,就掛起該程序的執行;
(2) v(sv)操作:若有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起,就給它加1;
注意:p、v操作總是成對出現.
通常使用:
ipcs -s 檢視訊號量
ipcrm -s semid 刪除訊號量
訊號量的建立及使用如下所示(以父子程序為例,申請二元訊號量集,初始值設為1):
程式**:
semop操作中:sembuf結構的sem_***成員可以為0、ipc_nowait、sem_undo 。為sem_undo時,它將使作業系統跟蹤當前程序對這個訊號量的修改情況,如果
這個程序在沒有釋放該訊號量的情況下終止
,作業系統將自動釋放該程序持有的資源。
若使用sem_undo標誌,則作業系統將自動釋放該程序持有的訊號量,從而使得另外乙個程序可以繼續工作。若沒有這個標誌,另外乙個
程序將p操作永遠阻塞
。(1)子程序異常退出時,設定了sem_undo
(2)子程序異常退出時,未設定時
(3)子程序未異常退出,父子程序均上鎖時
對訊號量的幾點說明:
(1)訊號量相當於描述臨界資源的計數器,訊號量必須先被申請;
(2)訊號量本身也是一種臨界資源,其p、v操作具有原子性,即要麼被申請到,要麼未被申請到,只有這兩種可能;
(3)二元訊號量相當於一把互斥鎖;
(4)訊號量屬於程序通訊範疇,僅能保證資料傳輸的安全性;
(5)訊號量的生命週期為「隨核心」,即必須使用者手動刪除;
(6)訊號量自帶同步與互斥機制;
程序間通訊之訊號量
訊號量的本質是一種資料操控鎖,它本身不具有資料交換的功能,而是通過來控制其他的通訊資源來實現程序間通訊的,訊號主要負責資料的同步與互斥功能。程序請求乙個使用訊號量來表示的資源時,首先要讀取訊號量的值來判斷資源是否能被使用,若訊號量的值大於0,資源可用,等於0,無資源可用,同時程序會進入睡眠狀態,直到...
程序間通訊之 訊號量
訊號量相當於記錄資源能同時被多少個程序訪問。訊號量的作用 程序間同步控制。訊號量有乙個初值,每當有程序申請使用訊號量,就會通過乙個p操作對訊號量進行 1操作,當計數器減到0的時候就說明沒有資源了,其他程序要想訪問就必須等待,當該程序執行完這段工作之後,就會執行v操作,即對訊號量進行 1操作。標頭檔案...
程序間通訊之訊號量
訊號量也是三種xsi ipc之一,不過與訊息佇列和共享記憶體不同的是作為臨界資源的訊號量是以另一種臨界資源的計數器的面目出現的。其基本作用機制為,為某種臨界資源設定一定數量的訊號量,當某個程序占用乙份臨界資源時訊號量就減少相應的數值,當訊號量為0時沒有得到臨界資源的程序就暫時性的進入 休眠 狀態,待...