一、什麼是訊號量:
訊號量的本質是一種資料操作鎖,它本身不具有資料交換的功能,而是通過控制其他的通訊資源(檔案,外部裝置)來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料操作的互斥、同步等功能。
當請求乙個使用訊號量來表示的資源時,程序需要先讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資源可用,程序會進入睡眠狀態直到資源可用。
當程序不再使用乙個訊號量控制的共享資源時,訊號量的值
+1,對訊號量的值進行的增減操作均為原子操作,這是由於訊號量主要的作用是維護資源的互斥或多程序的同步訪問。而在訊號量的建立及初始化上,不能保證操作均為原子性。
二、為什麼要使用訊號量:
為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任何時刻只能有乙個執行執行緒訪問**的臨界區域。臨界區域是指執行資料更新的**需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪問它,也就是說訊號量是用來調協程序對共享資源的訪問的。其中共享記憶體的使用就要用到訊號量。
三、訊號量的工作原理
由於訊號量只能進行兩種操作等待和傳送訊號,即p(sv)和v(sv),他們的行為是這樣的:
p(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該程序的執行⾏
v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起,就給它加1.
舉個例子,
就是兩個程序共享訊號量
sv,一旦其中乙個程序執行了p(sv)操作,它將得到訊號量,並可以進入臨界區,使sv減1。而第二個程序將被阻止進入臨界區,因為當它試圖執行
p(sv)
時,sv為0,它會被掛起以等待第乙個程序離開臨界區域並執行v(sv)釋放訊號量,這時第二個程序就可以恢復執。
示例:comm.h
comm.c1 #pragma once
2 3 #include4 #include5 #include6 #include7
8 #define _path_name_ "/tmp"
9 #define _proj_id_ 0x6666
10 11 union semun
12 ;
18 19 int creat_sem_set(int nums);
20 int get_sem_set();
21 int init_sem_set(int msg_id,int which,int val);
22 int destory_sem_set(int sem_id);
23 int p(int sem_id,int num);
24 int v(int sem_id,int num);
test.c1 #include"comm.h"
2 3 static int comm_sem_set(int nums,int flags)
4 11 int sem_id=semget(_key,nums,flags);
12 if(sem_id<0)
13
17 return sem_id;
18 }
19 int creat_sem_set(int nums)
20 24 int get_sem_set()
25 29 int destory_sem_set(int sem_id)
30 35 return 0;
36 }
37 int init_sem_set(int msg_id,int which,int val)
38 46 return 0;
47 }
48 static int comm_op(int sem_id,int num,int op)
49 59 return 0;
60 }
61 int p(int sem_id,int num)
62 66 int v(int sem_id,int num)
67
執行結果1 #include2 #include"comm.h"
3 4 int main()
5 24 }
25 else
26
38 wait(null);
39 destroy_sem_set(sem_id);
40 }
41 return 0;
42 }
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...