程序間通訊總結 共享記憶體,訊息佇列,訊號量

2021-10-22 16:07:40 字數 1703 閱讀 7725

共享記憶體:

本質:開闢的一塊物理記憶體,多個程序通過將同一塊物理記憶體對映到自己的虛擬位址空間,通過自己的虛擬位址空間進行訪問,實現資料共享。

特點:共享記憶體是最快的程序間通訊方式(操作相較於其他操作,少了兩步用使用者態到核心的資料拷貝),生命週期隨核心

操作流程

1.建立/開啟共享記憶體

int shmget(key_t key,size_t size,int shm***)

key 共享記憶體的識別符號—多個程序通過同乙個識別符號開啟同乙個共享記憶體;

size 共享記憶體的大小

shm*** 操作方式 -ipc_creat| ipc_excl; 操作許可權 0664

返回值:成功返回非負整數,共享記憶體在**中的操作控制代碼,失敗返回-1

2.將這塊共享記憶體對映到程序的虛擬位址空間

void shmat (int shmid,const void shmaddr,int shm***);

shmid shmget 返回的操作控制代碼

shmaddr 虛擬位址空間中對映的首位址 null

shm*** shm_rdonly 唯讀/ 預設0 表示可讀可寫

返回值:成功返回實際對映在虛擬位址空間的首位址,失敗返回(void*)-1;

3.記憶體操作

4.解除程序與共享記憶體的對映關係

int shmdt (const void *shmaddr)

shmaddr 虛擬空間中的對映首位址 null

成功返回0,失敗返回-1

5.刪除共享記憶體

每個共享記憶體都有乙個對映連線數,(表示當前有多少個程序連線了這一塊共享記憶體),因此只有共享記憶體的對映連線數==0的時候,這個共享記憶體才會被刪除,如果當前不為0,則拒絕再有的新的程序建立連線,知道對映數達到0後,將共享記憶體刪除。

int shmctl(int shmid,int cmd,struct shmid_ds *buf)

shmid shmget返回的操作控制代碼

cmd 具體對共享記憶體進行的操作 -ipc_rmid刪除

buf 主要用於設定或獲取共享記憶體資訊,null

成功返回0 ,失敗返回-1

注意:共享記憶體的操作並非是安全的,有多個程序同時交叉寫入的風險,因此共享記憶體需要通過同步和互斥進行保護。

訊息佇列:

本質原理:指標核心中建立了乙個優先順序佇列,多個程序可以通過相同的識別符號找到同乙個訊息佇列,通過新增或獲取節點實現資料傳輸。

特性:自帶同步與互斥,生命週期隨核心。

訊號量:

本質:乙個對資源進行計數的計數器

功能:實現程序間的同步與互斥

同步就是資源訪問的合理性,

訊號量對資料資源進行計數,所有的程序在資源訪問之前,先訪問訊號量,如果還有資源,那麼程序可以進行訪問,獲取乙個資源,計數-1;等計數<=0 ,程序想要獲取資源需要等待,(程序設定為阻塞),等待訊號量》0,再喚醒程序,開始排程。

訊號量的操作:

p操作:在臨界資源獲取之前,先進行p操作,p操作計數-1,判斷能否獲取

v操作:在資源產生之後,進行v操作,計數+1

Linux程序間通訊(二) 共享記憶體 訊息佇列

一 共享記憶體 最高效的程序間通訊機制。多個程序共享一段記憶體。需要依靠某種同步機制,如互斥鎖或訊號量。通常步驟為 建立 對映 使用 撤銷對映 刪除 相關函式可以參考 linux 共享記憶體 include include include include include include semcom...

Linux程序間通訊(二) 共享記憶體 訊息佇列

一 共享記憶體 最高效的程序間通訊機制。多個程序共享一段記憶體。需要依靠某種同步機制,如互斥鎖或訊號量。通常步驟為 建立 對映 使用 撤銷對映 刪除 相關函式可以參考 linux 共享記憶體 include include include include include include semcom...

程序間通訊 共享記憶體 訊息佇列 訊號量

共享記憶體 共享記憶體是最快的程序間通訊方式,相較於其他程序間通訊方式,少了兩次核心態與使用者態之間的資料拷貝過程 原理及使用過程 在物理記憶體中開闢一塊記憶體空間 將這塊記憶體空間通過頁表對映到程序的虛擬位址空間中 程序可以直接通過程序虛擬位址空間訪問到這塊物理記憶體進行操作 若多個程序對映同一塊...