訊號量的本質
是一種資料操作鎖,它本身不具有資料交換的功能,而是通過控制其他的通訊資源(檔案,外部裝置)來實現程序間通訊,它本身只是一種外部資源的標誌,訊號量在此過程中負責資料操作的互斥,同步等功能.
一:為什麼要使用訊號量
為了防止因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任意一時刻只能有乙個執行執行緒訪問**的臨界區域.臨界區域是指資料更新的**需要獨佔式地執行,而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪問它,也就是說訊號量是用來調協程序對共享資源的訪問的.其中共享記憶體的使用就要用到訊號量.
二:訊號量的工作原理
由於訊號量只能進行兩種操作等待和傳送訊號,即p(sv)和v(sv),他們的行為是這樣的;
p(sv):如果sv的值大於0,就給它減1,如果它的值為0,就掛起還程序的執行
v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起就給它加 1;
三:linux的訊號量機制:
訊號量的意圖在於程序間同步,互斥鎖和條件變數的意圖則在於執行緒間同步.但是訊號量也可用於執行緒間,互斥鎖和條件變數也可用於程序間.
程序同步機制:
為了能夠有效的控制對個程序之間的溝通過程,保證能夠過程有序的進行,作業系統提供了一定同步機制保證程序之間不會自說自話而是有效的協同工作.常見的同步方式有:互斥鎖,條件變數,讀寫鎖和訊號燈:
四:相關函式:
1:semop函式
int
semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
作用是改變訊號量的值
sem_id是返回訊號量的識別符號
2:semctl函式
int semctl(int semid,int semnum,int cmd,…)
控制訊號量的資訊
描述 semctl()在semid()標識的訊號集上,或者改集合的第semnum個新號量上執行cmd指定的控制命令
呼叫程式必須按照下面的方式定義這個聯合體:
union semun
; 注意:該聯合體沒有定義在任何系統標頭檔案中,因此的使用者自己宣告.
五:驗證:
1:編寫makefile檔案:
.phony:all
all:mysem
mysem:mysem.c test.c
gcc -o $@ $^
.phony:clean
clean:
rm -f mysem
2:mysem.h檔案:
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define _path_name_ "/tmp"
#define _proj_id 0x6666
union semun
;int createsem(int nums);//建立訊號量
int initsem(int sems_id,int _which,int val);//初始化
int psem(int sems_id);
int vsem(int sems_id);
int destorysem(int sems_id);
int getsem();
3:mysem.c檔案:
#include"mysem.h"
static int commsemset(int nums,int flags)
int sems_id =semget(_key,nums,flags);
return sems_id;
}static int comsemop(int sems_id,int op)
return0;}
int createsem(int nums)
int initsem(int sems_id,int _which,int val)
return0;}
int getsem()
int destroysem(int sems_id)
return0;}
int psem(int sems_id)
int vsem(int sems_id)
4:test.c測試函式:
#include"mysem.h"
int main()
else
if(ip<0)
else
pid_t ret =waitpid(ip,null,0);
if(ret == ip)
else
} return
0;}
結果:
總結:
程序/執行緒同步機制:
臨界區(critical),互斥量(mutex),訊號量(semaphone),事件(event)
1:臨界區:通過多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問.在任意時間值允許乙個執行緒對共享資源程序訪問,如果多個執行緒試圖訪問公共資源,那麼乙個執行緒進去後,其他試圖進入公共資源的執行緒將被掛起等待,一直等到臨界區的資源被釋放後,其他資源在可以搶占.
2:互斥量:採用互斥 ,只有擁有互斥物件的執行緒才能訪問公共資源,因為互斥物件只有乙個,所以能保證公共資源不會同時被多個執行緒訪問,互斥不僅negative實現同一程式的公共資源安全共享,還能保證不同應用程式的公共資源安全共享
3:訊號量:它允許多個執行緒在同一時刻訪問統一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目,訊號量允許多個執行緒同時使用共享資源,這與作業系統的pv操作相同.它指出了同時訪問共享資源的執行緒最大數目.
pv操作及訊號量的概念是荷蘭科學家提出,訊號量s是乙個整數,s大於等於0時刻供併發程序使用的資源實體數,但是s小於0時表示正在等待使用共享資源的程序數.
其中:
p操作申請資源:
(1):s減1;
(2):若減1後仍然大於等於0,則程序繼續執行
(3):若s減1後小於0,則該程序被阻塞後進入訊號行對應的佇列中,然後裝入程序排程
v操作釋放資源:
(1):s加1;
(2):若相加結果大於0,程序繼續執行
(3):若相加結果小於等於0,則從該訊號的等待佇列中喚醒乙個等待程序,然後再返回原程序繼續執行或轉入程序排程
4:事件:通過通知操作的方式保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作.
程序間通訊 訊號量
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 ...