程序間通訊之訊號量

2021-09-26 02:31:49 字數 2022 閱讀 5214

原子操作:不可中斷的乙個或者一系列操作,即要麼做要麼不做

臨界資源:    各程序採取互斥的方式,實現共享的資源稱作臨界資源。一次只能被乙個程序使用

pv操作:p用於等待,v用於傳送訊號

p(s):s如果大於0就給減一,如果等於零,則掛起該程序的執行

v(s):如果有其他程序因等待s而被掛起,就讓它恢復執行,如果沒有程序因等待s而掛起,就給它加1

訊號量的定義

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

訊號量的原理

1. 測試控制該資源的訊號量;

2. 若訊號量的值為正,則程序可以使用該資源,程序的訊號量值減1,表示乙個資源被使用;

3. 若此訊號量為0,則程序進入休眠,直到該訊號量值大於0;

4. 當程序不再使用乙個由乙個訊號控制的共享資源時,該訊號量加1,如果有程序正在休眠等待該訊號量,則該程序會被喚醒。

訊號量的使用

semget函式

#includeint semget(key_t key,int num_sems,int sem_falgs);
功能;建立乙個新的訊號量或者取得乙個已有訊號量的鍵;

引數:key:整數值,不相關的程序可以通過他訪問同乙個訊號量。程式對所有訊號量的訪問都是間接的,他先提供乙個鍵,再有系統生成乙個相應的訊號量識別符號。只有semget函式才可以直接使用訊號量的鍵,所有其他訊號量函式都是使用semget函式返回的訊號量識別符號。如果多個程式使用相同的key值,key將負責協調工作。

num_sems:指定需要的訊號數目,他幾乎總是取值為1.。

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

semget函式成功返回乙個正數(非零),他就是其他訊號量函式要用到的訊號量識別符號。失敗返回-1

semop函式

#includeint semop(int sem_id,struct*sem_ops,size_t num_sem_ops)
功能:用於改變訊號量的值

引數:sem_id:訊號量編碼

sem_ops:表示乙個由sembuf結構表示的訊號量運算元組;

num_sem_ops:規定該陣列中操作的數量。

返回值:成功返回0,失敗返回-1。

semctl函式

#includeint semctl(int sem_id ,int sem_num,int command....);
功能:直接控制訊號量的資訊引數:sem_id:訊號量識別符號;

sem_num:訊號量的值;

command:通常是下面兩個值中的其中乙個:

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

ipc_rmid:用於刪除乙個已經無需繼續使用的訊號量識別符號。

返回值:成功返回0,失敗返回-1。

程序間通訊之訊號量

訊號量的本質是一種資料操作鎖,其本身不具有資料交換的能力,而是通過控制其他的通訊資源 檔案 外部裝置 來實現程序間通訊,它本身只是一種外部資源的標識。訊號量在此過程中負責資料的互斥 同步等功能。當請求乙個訊號量來表示資源時,程序需要讀取訊號量的值來判斷資源是否可用。大於0,資源可以請求,等於0,無資...

程序間通訊之訊號量

訊號量的本質是一種資料操控鎖,它本身不具有資料交換的功能,而是通過來控制其他的通訊資源來實現程序間通訊的,訊號主要負責資料的同步與互斥功能。程序請求乙個使用訊號量來表示的資源時,首先要讀取訊號量的值來判斷資源是否能被使用,若訊號量的值大於0,資源可用,等於0,無資源可用,同時程序會進入睡眠狀態,直到...

程序間通訊之 訊號量

訊號量相當於記錄資源能同時被多少個程序訪問。訊號量的作用 程序間同步控制。訊號量有乙個初值,每當有程序申請使用訊號量,就會通過乙個p操作對訊號量進行 1操作,當計數器減到0的時候就說明沒有資源了,其他程序要想訪問就必須等待,當該程序執行完這段工作之後,就會執行v操作,即對訊號量進行 1操作。標頭檔案...