訊號量的工作原理:訊號量的本質是一種資料操控鎖,它本身不具有資料交換的功能,而是通過來控制其他的通訊資源來實現程序間通訊的,訊號主要負責資料的同步與互斥功能。
程序請求乙個使用訊號量來表示的資源時,首先要讀取訊號量的值來判斷資源是否能被使用,若訊號量的值大於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)釋放訊號量,這時第二個程序就可以恢復執行。
**實現成對列印aabb
comm.h
comm.c#ifndef _comm_h_
#define _comm_h_
#include
#include
#include
#include
#include
#include
#define pathname "."
#define proj_id 0x6666
#endif
union semun
;int creatsemset(int num);
int initsemset(int semid,int num,int val);
int getsemset(int num);
int destorysemset(int semid);
int p(int semid,int num);
int v(int semid,int num);
static
int compv(int semid,int num,int op);
int commsemset(int num,int flags);
sem.c#include "comm.h"
int commsemset(int num,int flags)
int semid=semget(_key,num,flags);
if(semid<0)
return semid;
}int creatsemset(int num)
int initsemset(int semid,int num,int val)
return0;}
int getsemset(int num)
int destorysemset(int semid)
return0;}
static int compv(int semid,int num,int op)
return0;}
int p(int semid,int num)
int v(int semid,int num)
沒有p/v操作將不能實現成對列印,不能實現程序之間的同步#include "comm.h"
int main()
}else
wait(null);
}return
0;}
程序間通訊之訊號量
訊號量的本質是一種資料操作鎖,其本身不具有資料交換的能力,而是通過控制其他的通訊資源 檔案 外部裝置 來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料的互斥 同步等功能。當請求乙個訊號量來表示資源時,程序需要讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資...
程序間通訊之 訊號量
訊號量相當於記錄資源能同時被多少個程序訪問。訊號量的作用 程序間同步控制。訊號量有乙個初值,每當有程序申請使用訊號量,就會通過乙個p操作對訊號量進行 1操作,當計數器減到0的時候就說明沒有資源了,其他程序要想訪問就必須等待,當該程序執行完這段工作之後,就會執行v操作,即對訊號量進行 1操作。標頭檔案...
程序間通訊之訊號量
訊號量也是三種xsi ipc之一,不過與訊息佇列和共享記憶體不同的是作為臨界資源的訊號量是以另一種臨界資源的計數器的面目出現的。其基本作用機制為,為某種臨界資源設定一定數量的訊號量,當某個程序占用乙份臨界資源時訊號量就減少相應的數值,當訊號量為0時沒有得到臨界資源的程序就暫時性的進入 休眠 狀態,待...