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

2021-09-26 08:00:08 字數 2564 閱讀 1248

共享記憶體

共享記憶體是最快的程序間通訊方式,相較於其他程序間通訊方式,少了兩次核心態與使用者態之間的資料拷貝過程

原理及使用過程

在物理記憶體中開闢一塊記憶體空間

將這塊記憶體空間通過頁表對映到程序的虛擬位址空間中

程序可以直接通過程序虛擬位址空間訪問到這塊物理記憶體進行操作;若多個程序對映同一塊物理記憶體,就可以實現相互通訊;直接通過虛擬位址改變記憶體中的資料,其他程序的資料也會隨之改變

解除對映關係

刪除共享記憶體

1. 共享記憶體的建立

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

引數: key:共享記憶體在作業系統中的識別符號

size:共享記憶體的大小

shmflag: 示例ipc_creat|0664

ipc_creat 共享記憶體若存在則開啟,不存在就建立再開啟

ipc_excl 與ipc_creat同時使用時,若共享記憶體存在則報錯返回

mode 共享記憶體的操作許可權

返回值: 正整數---共享記憶體的操作控制代碼 失敗:-1

2. 共享記憶體的對映

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

引數: shmid 建立共享記憶體返回的操作控制代碼

shmaddr 共享記憶體在虛擬位址空間中的首位址---通常置null

shmfig shm_rdonly---對映之後,共享記憶體唯讀;通常置0-可讀可寫

返回值 對映首位址 失敗:(void*)-1

3. 共享記憶體的操作

同常見的記憶體操作一樣,如memcpy/strcpy等

4. 解除對映關係

int shmdt(const void *shmaddr);

引數: shmaddr shmat建立對映時返回的對映首位址

5. 刪除共享記憶體

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

引數: shmid 共享記憶體操作控制代碼

cmd 即將進行的操作-即ipc_rmid 刪除共享記憶體

buf 用於獲取/設定共享記憶體資訊,不關心的話置null

簡單使用

//寫端

#include #include #include #include #include //注意標頭檔案

#define ipc_key 0x12345678

int main()

void *shm_start = shmat(shmid, null, 0);

if (shm_start == (void*)-1)

int i = 0;

while(1)

shmdt(shm_start);//對映首位址

shmctl(shmid, ipc_rmid, null);

return 0;

}

//讀端

int main()

void *shm_start = shmat(shmid, null, 0);

if (shm_start == (void*)-1)

int i = 0;

while(1)

shmdt(shm_start);

shmctl(shmid, ipc_rmid, null);

return 0;

}

訊息佇列

訊息佇列是作業系統在核心中為使用者建立的乙個佇列;其他程序可以通過訪問相同的佇列進行通訊

訊息佇列所傳輸的是有型別的資料塊

訊息佇列的生命週期隨核心

訊號量訊號量用於實現程序間的同步與互斥

實際上就是核心中的乙個計數器,進行資源計數(統計現在有多少資源,用於判斷是否能夠進行操作)

同步:對臨界資源訪問的時序和理性

互斥:同一時間對臨界資源操作的唯一性

原理:

互斥原理:只具有0/1計數時,就可以實現互斥

初始計數為1,表示當前只有乙個程序能夠獲取資源,獲取資源之後-1;計數為0,其他程序在等待佇列上等待,臨界資源被操作完畢之後計數+1,並且喚醒等待佇列上的程序

同步原理:對程式邏輯進行控制(對臨界資源合理操作控制)

通過計數判斷當前能否對臨界資源進行操作,不能操作(計數<=0),則等待;其他程序操作後計數+1,促使再次判斷,喚醒等待的程序

檢視ipc的命令

ipcs	檢視ipc

ipcs -m 檢視共享記憶體

ipcs -s 檢視訊號量

ipcs -q 檢視訊息佇列

ipcrm 刪除ipc

ipcrm -m shmid 刪除共享記憶體,其他同理

程序間通訊的方式 訊號 管道 訊息佇列 共享記憶體

常見的通訊方式 管道pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。命名管道fifo 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊息佇列messagequeue 訊息佇列是由訊息的鍊錶,存放在核心中...

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

共享記憶體 本質 開闢的一塊物理記憶體,多個程序通過將同一塊物理記憶體對映到自己的虛擬位址空間,通過自己的虛擬位址空間進行訪問,實現資料共享。特點 共享記憶體是最快的程序間通訊方式 操作相較於其他操作,少了兩步用使用者態到核心的資料拷貝 生命週期隨核心 操作流程 1.建立 開啟共享記憶體 int s...

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

訊息佇列 訊息佇列是訊息的鏈結表 存放在核心中並由訊息佇列識別符號標識。訊息佇列 同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。訊號量 可以被多個程序共享...