程序間通訊機制詳解(5) 訊號量

2021-10-23 05:18:37 字數 1723 閱讀 9780

訊號量(semaphore)是一種用於提供不同程序之間或者乙個給定的不同執行緒間同步手段的原語。訊號量多用於程序間的同步與互斥。

原理當有程序要求使用共享資源時,需要執行以下操作:

1.系統首先要檢測該資源的訊號量;

2.若該資源的訊號量值大於0,則程序可以使用該資源,此時程序對該訊號量執行p操作(wait()) ,將該資源的訊號量值減1;

3.若該資源的訊號量值為0,表明所有資源都在使用中,則程序進入阻塞狀態,直到訊號量值大於0時程序被喚醒,訪問該資源。阻塞操作將乙個程序放到與訊號量相關的等待佇列中,並且將該程序狀態切換成等待狀態。

4.當程序釋放共享資源時,對該訊號量執行v操作(signal()),將訊號量值增加1,如果此時有程序處於休眠狀態等待此訊號量,則等待程序會被喚醒。

5.訊號量操作應原子執行。即對同一訊號量,沒有兩個程序可以同時執行操作p操作和v操作。這是乙個臨界區問題。

分類linux提供兩種訊號量:

(1)核心訊號量,由核心控制路徑使用;

(2)使用者態程序使用的訊號量,這種訊號量又分為posix訊號量和system v訊號量。

posix訊號量

又分為有名訊號量和無名訊號量。

無名訊號量,其值儲存在記憶體中。無名訊號量常用於多執行緒間的同步,同時也用於相關程序間的同步。無名訊號量必須是多個程序(執行緒)的共享變數,無名訊號量要保護的變數也必須是多個程序(執行緒)的共享變數,這兩個條件缺一不可。無名訊號量的常見用法是將要保護的變數放在sem_wait(p操作)和sem_post(v操作)中間所形成的臨界區內.

有名訊號量,其值儲存在檔案中,

既可以用於執行緒,也可以用於相關程序間,甚至是不相關程序同步。有名訊號量位於共享記憶體區,它要保護的資源也必須是位於共享記憶體區,有名訊號量在使用的時候,和無名訊號量共享sem_wait和sem_post函式。

區別是有名訊號量使用sem_open代替sem_init,另外在結束的時候要像關閉檔案一樣去關閉這個有名訊號量。

system v訊號量

包括二值訊號量 、計數訊號量、計數訊號量集。

二值訊號量 : 其值只有0、1 兩種選擇,0表示資源被鎖,1表示資源可用;

計數訊號量:其值在0 和某個限定值之間,不限定資源數隻在0~1 之間;

計數訊號量集 :多個訊號量的集合組成訊號量集計數訊號量可以用於控制訪問具有多個例項的某種資源。

posix 訊號量與system v訊號量的比較

(1)對posix來說,訊號量是個非負整數。常用於執行緒間同步。而system v訊號量則是乙個或多個訊號量的集合,它對應的是乙個訊號量結構體,這個結構體是為system v ipc服務的,常用於程序間同步。

(2)posix訊號量的引用標頭檔案是,而system v訊號量的引用標頭檔案是

(3)從使用的角度,system v訊號量是複雜的,而posix訊號量簡單。

參考:

程序間通訊之-訊號量semaphore–linux核心剖析(十)

程序間通訊機制01 訊號量

它是乙個特殊變數,只允許對它進行等待 wait 和傳送訊號 signal 這兩種操作。最簡單的訊號量是只能取值0和1的變數,即二進位制訊號量。可以取多個正整數值的訊號量被稱為通用訊號量。1 原型 int semget key t key,int num sems,int sem flags 2 作用...

程序間通訊程式設計 5 訊號量

訊號量 semaphore 程序間通訊處理同步互斥的機制。是在多執行緒環境下使用的一種設施,它負責協調各個執行緒,以保證它們能夠正確 合理的使用公共資源。一 什麼是訊號量 為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有...

程序間通訊 訊號量

ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...