是實現任務互斥、同步操作的主要機制。
vxworks
提供的訊號量經過了高度優化,在所有任務間通訊機制中,速度最快。
二.訊號量的分類
binary semaphores(二進位制):完成互斥、同步操作的最佳方式;速度最快,最常用。
mutual exclusion semaphores(互斥):
一種特殊的二進位制訊號量,專門針對互斥操作進行了優化。
counting semaphores(計數):
類似於二進位制訊號量,可記錄訊號量釋放的次數,可監視同一資源上的多個例項。
三.binary semaphores(二進位制訊號量)
task經常會等待事件或需獲取資源。查詢
(polling)
在realtime
系統中原則上不允許,最好採用
pending
,等待事件或資源。
狀態圖:
說明:1.為某個資源呼叫
semb
create()
建立乙個
binary semaphore
並規定:
sem_full (資源可用) sem_empty (資源不可用).
2.資源不可用時task
呼叫semtake()進入
pending
直到semaphore
被given
[c-sharp]view plain
copy
sem_id sembcreate
( int options,
/* semaphore options */
sem_b_state initialstate /* initial semaphore state */
) status semtake
( sem_id semid, /* 需要獲取的訊號量id */
int timeout
/* 超時時間(tick)/no-wait/forever */
) isr(中斷服務程式)不能呼叫
semtake()
操作![c-sharp]view plain
copy
status semgive
( sem_id semid /* 需要釋放的訊號量id */
) [c-sharp]view plain
copy
semflush()
應用方向:
1.互斥操作
:是指不同任務可以利用訊號量互斥地訪問臨界資源。這種互斥的訪問方式比中斷禁止(
interrupt disable
) 與優先順序鎖定
(preemptive locks
)兩種互斥方式具有更加精確的粒度。
互斥操作時初始狀態設為(
sem_full
)可用。並在
同乙個task
中成對、順序呼叫
semtake()
、semgive()
。2.同步操作
:是指乙個任務可以利用訊號量控制自己的執行進度,使自己同步於一組外部事件。同步操作時初始狀態設為(
sem_empty
)不可用。在
不同task
中分別單獨呼叫
semtake()
、semgive()
。四.mutual exclusion semaphores(互斥訊號量)
互斥訊號量是一種特殊的二進位制訊號量,它是針對使用二進位制訊號量進行互斥操作時存在的一些問題設計的。互斥訊號量主要增加了對優先順序倒置、刪除安全以及遞迴訪問的處理。
狀態圖:
[c-sharp]view plain
copy
sem_id semmcreate
( int options
/* mutex semaphore options */
) 區別:
1.互斥訊號量只能用於互斥操作。
2.只能由已經獲取了互斥訊號量的任務去釋放它。
3.中斷服務程式(isr)不可以釋放
(semgive())
互斥訊號量。
4.互斥訊號量不支援
semflush()
操作。應用方向:
1.避免優先順序倒置(priority inversion):
在上圖中,task2等待task1的資源,於是處於pend狀態,這時乙個中等優先順序的task進來,並搶占了task1的cpu,此時的表現是低優先順序task在高優先順序的task2前執行。這種現象就是先級倒置。
使用semid = semmcreate(sem_q_priority | sem_inversion_safe);就可以避免倒置。
此時,task1的優先順序提公升與task2一樣,至到task2執行完成。
sem_inversion_safe
不能與sem_q_fifo
配對!2.deletion safety(安全刪除)
使用:semid = semmcreate(sem_q_fifo |
sem_delete_safe
);可以實現安全刪除。
其實質是:在
task
對互斥訊號量執行
semtake()
操作並成功占有該訊號量之前,隱含執行了
tasksafe()
操作;在執行
semgive()
操作之後,隱含執行
taskunsafe()
操作。如果乙個任務
task1
試圖刪除乙個已經被保護起來的任務
task2
,task1
則將被阻塞起來,直到
task2
解除保護(釋放掉具有刪除保護的互斥訊號量)才能完成刪除工作。
3.遞迴訪問
[c-sharp]view plain
copy
initfun()
funb()
funa()
五.counting semaphores(計數訊號量)
計數訊號量與二進位制訊號量都可以用於任務之間的同步與互斥。其不同點在於,計數訊號量可記錄訊號量釋放的次數,可以用來監視某一資源的使用狀況。
狀態圖:
[c-sharp]view plain
copy
sem_id semccreate
( int options,
/* semaphore option modes */
int initialcount
/* initial count */
)
Nginx學習筆記 訊號量
2016 7 9 18 02 2018 09 14 15 02 su檢視nginx的程序 master 主程序,控制著子程序 worker process 子程序 hup 優雅的改變配置檔案,平滑的重讀配置檔案 ps aux grep nginx 查詢主程序號 kill hup 主程序號 kill ...
訊號量學習
一 概念 訊號量是乙個整數,這個整數允許多程序或多執行緒同步他們的操作。這個整數必須大於等於0.linux庫函式中,類似有名對映 匿名對映,有名管道 無名管道,訊號量也有有名訊號量和匿名信號量。匿名信號量在記憶體中,不在檔案系統中,一般用於執行緒之間的同步 有名訊號量需要建立檔案,一般用於程序之間的...
筆記 訊號量集
訊號量集,主要作用是保證共享記憶體的使用不發生衝突。訊號量 semaphore 實際是乙個整數,它的值由多個程序進行測試 test 和設定 set 就每個程序所關心的測試和設定操作而言,這兩個操作是不可中斷的,或稱 原子 操作,即一旦開始直到兩個操作全部完成。測試和設定操作的結果是 訊號量的當前值和...