共享記憶體和訊號量

2021-08-17 07:20:33 字數 2214 閱讀 4696

共享記憶體和訊號量實現程序間通訊的另外兩種機制。

一.  共享記憶體

1. 共享記憶體的結構

2. 實現共享記憶體的函式

(1)shmget 函式

功能:建立共享記憶體

引數:key 共享記憶體的名字 ,size 共享記憶體的大小(以頁為單位分配資源)

返回值:成功返回乙個非負整數,即共享記憶體的識別符號;失敗返回-1。

(2)shmat 函式

引數:shmid 共享記憶體識別符號,shmaddr 一般取值null ,shm*** 一般取值為0;

返回值:成功返回乙個指標;失敗返回乙個-1;

(3)shmdt 函式

引數:shmaddr 是由shmat 返回的指標

返回值:成功返回0;失敗返回-1;

(4)shmctl 函式

功能:用於控制共享記憶體

引數:shmid 由shmget 返回的共享記憶體的識別符號;cmd 是要執行的動作,有三個值可以取; 

返回值:成功返回0;失敗返回-1;

3. 共享記憶體的特點

(1)共享記憶體是最快的ipc形式,因為一旦共享記憶體建立成功,就會由頁表對映到程序位址空間,程序間的資料不需要傳遞到核心。

(2)共享記憶體沒有同步與互斥機制,在使用時需要自己維護**。

(3)共享記憶體的生命週期隨核心。

4. 關於共享記憶體的命令

(1)ipcs  -m : 顯示ipc內容

(2)ipcrm  -m :手動命令刪除共享記憶體

二 . 訊號量

在看訊號量之前,我們先來看幾個概念:

(1)臨界資源:多個程序看到的同乙個資源(公共資源);

(2)臨界區:訪問臨界資源的**;

(3)同步性:在一段時間內,按照一定的順序訪問 ;

(4)互斥性:在一段時間內,乙份資源只能被乙個程序訪問 和占用 ;

(5)原子性:  乙個事物要麼全做,要麼不做,不能只做一半 ;

1. 訊號量的概念

(1)訊號量本質上是計數器,是衡量臨界資源的數量的 ;

(2)訊號量也是一種臨界資源,它的作用是保護臨界資源 ;

(3)訊號量只有兩種操作,pv原語,p表示申請資源,v表示釋放資源;

p原語

v原語

(4)   pv 操作保持原子性 ;

2. 訊號量集函式

(1) semget  函式

功能:建立和訪問乙個訊號量集

引數:key 訊號量的名字 ,nsems 訊號量集中訊號量的個數 

返回值:成功返回乙個非負整數,即訊號量的識別符號;失敗返回-1。

(2)semctl 函式

功能:訊號量控制函式

引數:semid 訊號量的識別符號 ,semnum 訊號量的序號,cmd和共享記憶體相同 ;

返回值:成功返回0; 失敗返回-1;

(3)semop 函式

功能:建立和訪問乙個訊號量集

引數:semid 訊號量的識別符號 

返回值:成功返回0; 失敗返回-1;

訊號量的內容比較難理解,我們要仔細琢磨!

共享記憶體,訊號量

一.共享記憶體 共享記憶體 允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記...

共享記憶體 訊號量

1.共享記憶體 a.int shmget key t key,size t size,int shm 建立共享記憶體 參一 為共享記憶體段命名 參二 size以位元組為單位指定需要共享的記憶體容量 參三 許可權標誌 ipc creat 0644 返回值 共享記憶體識別符號 非負整數 b.void s...

Linux訊號量和共享記憶體

include include include include include include include include static intset semvalue void static intsemaphore p void static intsemaphore v void stat...