程序通訊之訊號量

2021-08-06 05:30:15 字數 1807 閱讀 3152

一 訊號量(訊號燈)概念:

訊號量提供一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問他,也就是說訊號量用來協調程序對共享資源的訪問的。

訊號量是乙個特殊的變數,程式對其訪問都是原子操作,只允許對他進行等待(p)和傳送資訊(v)的操作。最簡單的訊號量只能取0和1的變數,這也是訊號量最常見的一種形式,叫做二進位制訊號量。可以取多個正整數的訊號量稱為訊號量。

訊號量與其他程序間通訊方式不大相同,主要用途是保護臨界資源。程序可以根據他判斷是否能夠訪問某些資源。

當程序a要獲取臨界資源s時,首先要獲取臨界資源的訊號量m,m的初始值為1,當獲取到m並發現m的值大於1時,可以反問臨界資源m,且訊號量-1,m=0。當程序b也要訪問臨界資源s時,也要首先獲取臨界資源s的訊號量m,發現m的值為0時,無法獲取臨界資源s,程序b阻塞等待。當程序a訪問完臨界資源後,訊號量m加1,變為m=1,同時喚醒程序b,使得b能夠訪問臨界資源s,以此類推,交替訪問臨界資源s。

二 訊號量建立:int semget(key_t key, int num_sems, int sem_flags); 成功返回乙個相應訊號識別符號,失敗返回-1

1,key 鍵值,由ftok提供,第乙個引數key是整數值(唯一非零),不相關的程序可以通過它訪問乙個訊號量,它代表程式可能要使用的某個資源,程式對所有訊號量的訪問都是間接的,程式先通過呼叫semget函式並提供乙個鍵,再由系統生成乙個相應的訊號識別符號(semget函式的返回值),只有semget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。

2,num_sems指定需要的訊號數目,它的值幾乎總是1;

3,sem_flags 是一組標誌,當想要當訊號量不存在時建立乙個新的訊號量,可以和值ipc_creat做按位或操作。設定了ipc_creat標誌後,即使給出的鍵是乙個已有訊號量的鍵,也不會產生錯誤。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的訊號量,如果訊號量已存在,返回乙個錯誤。

三 操作 :改變訊號量的值

int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);

1,sem_id 是由semget返回的訊號量識別符號

2,sembuf

struct sembuf

;3, nsops:訊號操作結構的數量,恆大於或等於1

四 控制 int semctl(int sem_id, int sem_num, int command, ...); 

如果有第四個引數,它通常是乙個union semum結構,定義如下:

union semun

; 1,sem_id訊號量識別符號

2,操作訊號在訊號集中的編號,第乙個訊號的編號是0

3,command:

steval:把訊號量初始化為乙個已知的值。p這個值通過union semun中的val成員設定,其作用是在訊號量第一次使用前對他進行設定

ipc_rmid:刪除乙個無需使用的訊號量識別符號

#include #include #include union semun 

;int sem_init(int sem_id)

return 0;

}int sem_del(int sem_id)

return ret;

}//訊號量的p操作

int sem_p(int sem_id)

//訊號量的v操作

int sem_v(int sem_id)

程序通訊之訊號量

1 訊號和訊號量 訊號與訊號量是不同的兩種事物。訊號量是用來調協程序對共享資源的訪問的。為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問 題,通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行,而訊號量就可以提供這樣的一種...

程序通訊之訊號量

程序通訊之訊號量 一 引言 我們知道在一條單軌鐵路上,任何時候在上面只能有一列列車行駛在上面。而管理這條鐵路的系統就是訊號量,任何一列列車必須等到表明可以行駛的訊號確認以後才能進入鐵路。當一列列車進入軌道行駛時,需要將軌道改為禁止其他列車進入,從而防止不知情的列車進入軌道,發生衝突。而當列車行駛完這...

程序通訊之訊號量

訊號量 訊號量是乙個計數器,用來表示系統資源的數量,訊號量用於多程序對共享資料物件的訪問,來實現程式的同步互斥。為了正確實現訊號量,訊號量的加減操作必須是原子操作,因此,訊號量也是在核心中實現的。先看一下同步互斥和原子操作 同步互斥 互斥 乙個程序占用資源,其它程序就不能使用該資源,程序間的這種關係...