程序間通訊 共享記憶體

2021-09-03 02:36:11 字數 2236 閱讀 4328

1.原理:

系統在實體地址空間上開闢一塊用於存放共享資料的資料區,然後程序在其虛擬位址空間上開闢一塊共享記憶體資料區,通過頁表對映到實體地址的共享記憶體資料區,當不同的程序都對映到實體地址空間上的共享記憶體資料區時,這兩個程序就可以直接從該共享記憶體拿取資料,不再通過核心的系統呼叫傳遞資料,實現程序間通訊的目的。

注:由於共享記憶體不再通過系統呼叫傳遞資料,也就 節約了資料從使用者到核心,再由核心到使用者時的時間成本,所以,共享記憶體被稱為最快的ipc方式

2.建立共享記憶體*

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

key:該共享記憶體的識別符號(名字)

size:該共享記憶體的大小(單位:byte)

shm***:標誌位 (ipc_creat|0644)

成功返回該共享記憶體的標識碼(操作控制代碼),失敗返回-1

3.將共享記憶體對映到虛擬位址空間上

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

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

shmaddr:對映到虛擬位址空間上的共享記憶體片段的起始位址,一般設定為null,表示由作業系統隨機分配

shm***:標誌位,shm_ronly:表示只對共享記憶體進行讀操作

shm_rnd:表示 round attach address to shmlba boundary

成功返回虛擬位址空間上指向共享記憶體段的指標

失敗返回-1

注:shmaddr若不為空,再看shm***是否為shm_rnd

是:則表示將shmaddr作為虛擬位址中對映共享記憶體段的起始位置

否:表示會自動將起始位址附加到shmlba邊界

共享記憶體圖析:

關於虛擬位址空間的內容,大家可以參考:

4.將共享記憶體從虛擬位址空間上脫離

int shmdt(const void shmaddr);*

shmaddr:虛擬空間中對映共享記憶體段的起始位置

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

5.刪除共享記憶體

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

shmid:該共享記憶體的操作控制代碼

cmd:該共享記憶體將要執行的動作(ipc_rmid用於刪除

buf:用於獲取該共享記憶體的資訊的資料結構

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

刪除共享記憶體資源實質,圖析:

首先執行兩個程序:

圖析:

關於該部落格中的**,大家可以在碼雲檢視:

6.共享記憶體的命令操作

ipcs -m: 檢視該系統中的共享記憶體

ipcrm -m +shmid:刪除shmid共享記憶體資源

ipcrm -m +key:刪除key共享記憶體資源

注:共享記憶體的操作沒有進行同步與互斥

關於其他程序間通訊方式,大家可以檢視我的其他文章:

管道:

訊息佇列:

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...