mmap記憶體對映區和shm共享記憶體的區別

2021-10-06 14:29:02 字數 2015 閱讀 7470

linux中的兩種共享記憶體。一種是我們的ipc通訊system v版本的共享記憶體(shm),另外的一種就是記憶體對映i/o(mmap函式)

1.mmap記憶體對映:

記憶體對映是通過操作記憶體來實現對檔案的操作,這樣可以加快執行速度,,不是專門用來進行資料通訊的(但它也可以用於程序間的通訊)

2.shm共享記憶體:

共享記憶體,顧名思義,就是預留出的記憶體區域,它允許一組程序對其訪問

共享記憶體是system vipc中三種通訊機制最快的一種,也是最簡單的一種;

對於程序來說,獲得共享記憶體後,他對記憶體的使用和其他的記憶體是一樣的。由乙個程序對共享記憶體所進行的

操作對其他程序來說都是立即可見的,因為每個程序只需要通過乙個指向共享記憶體空間的指標就可以來讀取

共享記憶體中的內容(說白了就好比申請了一塊記憶體,每個需要的程序都有乙個指標指向這個記憶體)

就可以輕鬆獲得結果。使用共享記憶體要注意的問題:共享記憶體不能確保對記憶體操作的互斥性。

乙個程序可以向共享記憶體中的給定位址寫入,而同時另乙個程序從相同的位址讀出,這將會導致不一致的資料。

因此使用共享記憶體的程序必須自己保證讀操作和寫操作的的嚴格互斥。

可使用鎖和原子操作解決這一問題。也可使用訊號量保證互斥訪問共享記憶體區域。

共享記憶體在一些情況下可以代替訊息佇列,而且共享記憶體的讀/寫比使用訊息佇列要快!

3.mmap和shm的區別:

linux中的兩種共享記憶體。一種是我們的ipc通訊system v版本的共享記憶體(shm),另外的一種就是記憶體對映i/o(mmap函式)

在說mmap之前我們先說一下普通的讀寫檔案的原理,程序呼叫read或是write後會陷入核心,因為這兩個函式都是系統呼叫,進入系統呼叫後,核心開始讀寫檔案,假設核心在讀取檔案,核心首先把檔案讀入自己的核心空間,讀完之後程序在核心回歸使用者態,核心把讀入核心記憶體的資料再copy進入程序的使用者態記憶體空間。實際上我們同一份檔案內容相當於讀了兩次,先讀入核心空間,再從核心空間讀入使用者空間。

linux提供了記憶體對映函式mmap, 它把檔案內容對映到一段記憶體上(準確說是虛擬記憶體上), 通過對這段記憶體的讀取和修改, 實現對檔案的讀取和修改,mmap()系統呼叫使得程序之間可以通過對映乙個普通的檔案實現共享記憶體。普通檔案對映到程序位址空間後,程序可以向訪問記憶體的方式對檔案進行訪問,不需要其他系統呼叫(read,write)去操作。

1、mmap是在磁碟上建立乙個檔案,每個程序位址空間中都會開闢出一塊空間進行檔案-記憶體的對映。

而對於shm而言,shm每個程序最終會對映同一塊物理記憶體。shm儲存在物理記憶體,這樣讀寫的速度要比磁碟要快,但是儲存量不是特別大。

mmap每個程序都會有自己的記憶體對映區,shm是對映到同一物理記憶體

2、相對於shm來說,mmap更加簡單,呼叫更加方便,所以這也是大家都喜歡用的原因。

3、另外mmap有乙個好處是當機器重啟,因為mmap把檔案儲存在磁碟上,這個檔案還儲存了作業系統同步的映像,所以mmap不會丟失,但是shmget就會丟失。

ps:

shm共享記憶體的基本函式:

(1)通過int shmget(key_t key, size_t size, int shm***);在物理記憶體建立乙個共享記憶體,返回共享記憶體的編號。

(2)通過void shmat(int shmid, constvoid shmaddr,int shm***);連線成功後把共享記憶體區物件對映到呼叫程序的位址空間

(3)通過void shmdt(constvoid shmaddr);斷開使用者級頁表到共享記憶體的那根箭頭。

(4)通過int shmctl(int shmid, int cmd, struct shmid_ds buf);釋放物理記憶體中的那塊共享記憶體。

mmap對映區和shm共享記憶體的區別總結

linux 中的兩種共享記憶體。一種是我們的ipc通訊system v版本的共享記憶體,另外的一種就是我們今天提到的儲存對映i o mmap函式 在說mmap之前我們先說一下普通的讀寫檔案的原理,程序呼叫read或是write後會陷入核心,因為這兩個函式都是系統呼叫,進入系統呼叫後,核心開始讀寫檔案...

mmap對映區和shm共享記憶體的區別總結

linux 中的兩種共享記憶體。一種是我們的ipc通訊system v版本的共享記憶體,另外的一種就是我們今天提到的儲存對映i o mmap函式 在說mmap之前我們先說一下普通的讀寫檔案的原理,程序呼叫read或是write後會陷入核心,因為這兩個函式都是系統呼叫,進入系統呼叫後,核心開始讀寫檔案...

mmap共享記憶體對映實戰

mmap函式用於申請一段記憶體空間。我們可以將這一段記憶體空間作為程序之間通訊的共享記憶體也可以將檔案直接對映其中。munmap函式則釋放由mmap函式建立的這段記憶體空間。函式定義如下 include void mmap void addr,size t length,int prot,int f...