程序間通訊 三 共享記憶體

2021-08-18 09:38:02 字數 3213 閱讀 2557

共享記憶體是linux下倆程序通訊的一種方式,

主要功能是讓兩個程序的虛擬位址都對映到同一片實體地址上,就可以通過這片實體地址進行資料的互動

mmap函式要求核心建立乙個新的虛擬記憶體區域,最好是從位址start開始的乙個區域,並將檔案描述符df指定的物件的乙個連續的片對映到這個新的區域,連續的物件片大小為length位元組,從距檔案開始處偏移量為offser位元組的地方開始.start位址僅僅是個表示,通常定義為null]

mamap()實際上是把磁碟上的檔案對映在記憶體上,那麼對檔案的寫入讀出就可以不用io函式 read(),write()而直接可以在記憶體上進行操作

如果多個程序對映同乙個檔案到自己的虛擬位址上,那麼他們就可以同時訪問這一片物理記憶體

就實現了利用mmap()函式完成多個程序的通訊

其中由於是把檔案對映入虛擬位址空間,第一次進行io操作肯定會觸發缺頁異常,會把磁碟檔案載入物理記憶體中然後通過頁表建立對映關係

還有如何將多個程序的虛擬位址空間對映在同一物理空間,詳見

總結來講mmap()的主要作用是將磁碟檔案載入記憶體中

由於其上述的功能,可以實現程序共享一段物理記憶體空間,所以可以實現程序間的通訊

與mmap()不同,以下函式是專門進行共享記憶體通訊的函式

功能:用來建立共享記憶體

原型:

int shmget(key_t key, size,size_t size,int shemfg)
key:通過ftok函式生成唯一的標識碼

size:共享記憶體的大小

shm***:類似檔案建立的許可權

返回值:成功返回shmid,即該段記憶體的唯一標識碼

此函式可以說是在物理記憶體上開闢了一段空間,並返回了該空間的唯一標識碼

要想使用該段空間,那麼就要將某個程序的虛擬位址空間通過頁表對映到這段物理記憶體上,會用到的函式就是shmat

原形:

#include 

#include

void *shmat(int shmid, const

void *shmaddr, int shm***);

說明:

將一片物理空間編號為shmid的記憶體通過頁表對映到該程序的以void* shmaddr為首的連續空間內,如果該引數為null作業系統自動分配該程序接受位址

shm***取值可能為shm_rnd和shm_rdonly

詳情參考man手冊

int shmdt(const

void *shmaddr);

shmaddr是通過shmat函式返回的位址

函式是將該程序與共享記憶體段解除關係

注意 不是刪除共享記憶體段

#include 

#include

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

此函式是共享記憶體的控制函式

通常與sytem v程序通訊其他的形式,比如訊息佇列的介面風格保持一致,不做過多詳細介紹.

這裡只是使用此函式刪除共享記憶體

cmd即是 ipc_rmid 最後乙個引數不關心 設定為null即可

乙個程序向共享記憶體區域寫入a ab abc ….

另乙個程序從共享記憶體中讀出 a ab abc ….

comm.h

#ifndef __comm_h__

#include

#include

#include

#include

#define pathname "/usr/"

#define proj_id 0x666

//通過flags確定是create還是get

//函式給出大小就行了

//返回值是commshm函式裡的shmid

//重視封裝

int createshm(int size);

int getshm(int size);

int destroyshm(int shmid);

//sharedmemoryattach函式不用封裝

首先,共享記憶體是所有ipc通訊中最快的一種,因為當程序和一段記憶體對映後,訪問該記憶體就可以在使用者態進行,而不需要返回核心態通過作業系統完成,相反,比如管道和訊息佇列都是作業系統維護的

其次,共享記憶體雖然是臨界資源,但是在這片記憶體不會有任何限制,所以不提供管道和訊息佇列的同步與互斥的概念,所以如果不加限制,這片記憶體中的資料是不安全的

我們可以通過加上訊號量等方法對臨界區的資源進行限制

程序間通訊(三) 共享記憶體

共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享他的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說就是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。共享記憶體示意圖 共享記憶體資料結構 struct shmid ds 相關函式shmget函式 建立共享記憶體 int sh...

Linux 程序間通訊(三) 共享記憶體

1.共享記憶體 共享記憶體方式可以在多個程序直接共享資料,因為其直接使用記憶體,不要多餘的拷貝,是速度最快的ipc方式 共享記憶體有兩種實現方式,使用mmap和shm方式,如下圖 1 mmap方式是將檔案與程序位址空間進行對映,對實際物理記憶體影響小 2 shm方式是將每個程序的共享記憶體與實際物理...

程序間通訊(三)之共享記憶體

上接程序間通訊 二 四 共享記憶體 共享記憶體也稱共享儲存,共享記憶體就是指允許兩個或多個程序共享一定的儲存區。因為資料不需要客戶程序和伺服器程序之間複製,所以說共享記憶體時最快的一種ipc。使用共享記憶體時要掌握的唯一要點,就是多個程序之間對一定儲存區的同步訪問。若伺服器程序正在將資料放入共享儲存...