當我們在實際程式設計時會發現,有時候多個程序或執行緒共用一段**,我們要確保某個時刻只有乙個程序或執行緒對這段**進行訪問。為了防止多個程式同時訪問乙個共享資源引發問題,可以用訊號量控制臨界區域的訪問。
訊號量分為以下三種:
system v訊號量,在核心中維護,可用於程序或執行緒間的同步,常用於程序的同步。
posix有名訊號量,一種**於posix技術規範的實時擴充套件方案,可用於程序或執行緒間的同步,常用於執行緒。
posix基於記憶體的訊號量,存放在共享記憶體區中,可用於程序或執行緒間的同步。
程序獲得共享資源執行的操作:
1,測試控制該資源的訊號量。
2,若訊號量的值為正,則程序可以使用該資源。然後將訊號量值減1,表示它使用了乙個資源單位。此程序使用完共享資源後對應的訊號量應該加1,以便其他程序使用。
3,若對訊號量進行減1時,訊號量的值為0,則程序進入阻塞休息狀態,直至訊號量值大於0,程序被喚醒,返回第一步。
為了正確地實現訊號量,訊號量的值測試及減1操作應當是原子操作(原子操作是不可分割的,在執行完畢前不會被其他任務或事件中斷),為此訊號量通常是在核心中實現的。
訊號量是一種特殊的變數,只允許等待和傳送訊號這兩種操作。
p(訊號量變數):用於等待
v(訊號量變數):用於傳送訊號
#include
#include
#include
int semget(key_t key,int num_sems,int sem_flags);
int semop(int sem_id,int num_sems,int sem_flags);
int semctl(int sem_id,int sem_num,int command,union semun arg);
未完,待續。。。
程序間通訊 訊號量
ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...
程序間通訊 訊號量
system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...
程序間通訊 訊號量
訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...