目錄
1.訊號量的作用
2.訊號量的本質
3.訊號量如何實現同步與互斥
4.訊號量的操作步驟
訊號量也是程序間的通訊方式之一,更多的應用於實現程序間的同步與互斥。(程序/執行緒安全概念),保證程序間對臨界資源的安全有序訪問,同步保證的是有序,互斥保證的是安全。
同步:保證對臨界資源訪問的時序可控性
互斥:對臨界資源同一時間的唯一訪問性
多個程序同時操作乙個臨界資源的時候就需要通過同步與互斥機制來實現臨界資源的安全訪問。
訊號量的本質是具有乙個等待佇列的計數器(代表現在是否有資源使用)
當訊號量沒有資源可用時,這時候需要阻塞等待(當有資源的時候會打斷這個阻塞)程序在操作臨界資源之前先獲取訊號量,判斷是否可以對臨界資源進行操作,如果沒有訊號量資源(計數器為0),則需要等待,當別人釋放訊號量資源後,訊號量計數器變為1,則會喚醒等待的程序去重新獲取訊號量資源。【訊號量計數器大於0,代表有資源可以獲取,訊號量計數器等於0,代表訊號量沒有資源,需要等待】a.對於同步來說:
只有訊號量資源計數從0轉變為1的時候,會同期其他程序打斷阻塞等待,會操作臨界資源,也就是說我們釋放了資源(即計數器+1操作後)才能獲取資源(即計數器-1操作)然後進行操作。
b.對於互斥來說:
訊號量如果想要實現互斥,那麼它的計數器只能是0或1,(一元訊號量),即就是乙個程序獲取的計數器的資源,其他簡稱就沒法獲取了)也就代表了同一時間只有乙個程序能夠獲得訊號量,保證訪問的安全。
訊號量作為程序間的通訊方式,意味著大家都能訪問到訊號量,訊號量實際上也是乙個臨界資源,當然訊號量這個臨界資源的操作是不會出問題的(因為訊號量的操作是以個原子操作,是不可被打斷的)(1)semget:建立訊號量
(2)semctl: setval setall:設定訊號量的初值、
對臨界資源操作之前先獲取訊號量(計數器減1操作)
對臨界資源操作完畢之後需要西方的資源(計數器加1操作)
**演示:
//這是乙個基於訊號量的互斥實現**
//讓乙個程序列印a睡1000ms
//讓另乙個程序列印b睡1000ms然後在列印乙個b
//檢視結果是否有序
//通過同步與互斥實現
#include #include #include #include #include #include #include #include #define ipc_key 0x12345678
union semun ;
void sem_p(int id)
void sem_v(int id)
int main()
//2.設定訊號量初值,只能設定一次,不能重複設定
//int semctl(int semid, int semnum, int cmd, ...);
//semid 操作控制代碼
//senum 指定要操作第幾個訊號量
// cmd 具體的操作
// setval 設定單個訊號量的初值
// setall 設定所有訊號量的初值,semnum將被忽略
// ipc_rmid
// ... 是乙個不定引數
// 比如要獲取訊號量的資訊,那麼第四個引數就是結構體
// 比如要設定訊號量的值,那麼放的就是指的聯合體
union semun val;
val.val =1;
semctl(semid ,0,setval,val);
pid = fork();
if(pid < 0)else if(pid ==0)
}else
}return 0;
}
程序間通訊 訊號量
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 ...