mmap實現共享記憶體

2021-09-26 13:56:26 字數 2131 閱讀 3936

mmap概念:

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。mmap在使用者空間對映呼叫系統中作用很大。

mmap操作提供了一種機制,讓使用者程式直接訪問裝置記憶體,這種機制,相比較在使用者空間和核心空間互相拷貝資料,效率更高。在要求高效能的應用中比較常用。mmap對映記憶體必須是頁面大小的整數倍,面向流的裝置不能進行mmap,mmap的實現和硬體有關。

函式原型:

標頭檔案

void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);、

引數fd為即將對映到程序空間的檔案描述字,一般由open()返回;fd可以指定為-1,此時須指定flags引數中的map_anon,表明進行的是匿名對映(不涉及具體的檔名,避免了檔案的建立及開啟,很顯然只能用於具有親緣關係的程序間通訊);

len是對映到呼叫程序位址空間的位元組數,它從被對映檔案開頭offset個位元組開始算起,一般offset設定為0,表示從檔案開始對映;

prot 引數指定共享記憶體的訪問許可權。一般有prot_read(可讀) , prot_write (可寫), prot_exec (可執行), prot_none(不可訪問)

flags由以下幾個常值指定:map_shared , map_private , map_fixed,其中,map_shared , map_private必選其一,而map_fixed則不推薦使用。

引數addr指定檔案應被對映到程序空間的起始位址,一般被指定乙個空指標,此時選擇起始位址的任務留給核心來完成。

函式的返回值為最後檔案對映到程序空間的位址,程序可直接操作起始位址為該值的有效位址。

int munmap(void* start,size_t length)

該呼叫在程序位址空間中解除乙個對映關係,addr是呼叫mmap()時返回的位址,len是對映區的大小。當對映關係解除後,對原來對映位址的訪問將導致段錯誤發生。

舉例說明:

/*-------------map_normalfile1.c-----------*/ 

#include#include#include#include#include#includetypedef structpeople; 

void main(int argc,char **ar**)//map a normal file as shared mem: 

printf("initializeover\n"); 

sleep(10); 

munmap(p_map,sizeof(people)*10); 

printf("umapok\n"); } 

/*-------------map_normalfile2.c-----------*/ 

#include#include#include#include#includetypedef structpeople; 

void main(int argc,char **ar**)//map a normal file as shared mem: 

munmap(p_map,sizeof(people)*10); 

}

例子使用的是:

map_normfile1首先開啟或建立乙個檔案,並把檔案的長度設定為5個people結構大小。然後從mmap()的返回位址開始,設定了10個people結構。然後,程序睡眠10秒鐘,等待其他程序對映同乙個檔案,最後解除對映。 

map_normfile2.c只是簡單的對映乙個檔案,並以people資料結構的格式從mmap()返回的位址處讀取10個people結構,並輸出讀取的值,然後解除對映。 

提問:

如果程序a在共享記憶體區有乙個指標ptr,這個指標存在共享記憶體區, 這個指標指向共享記憶體區的某個位置(place) ,請問程序b能不能正確使用place的值? 

解釋: 不能。

理由: 因為當程序b通過自己的指標讀到ptr時,ptr裡面存放的內容是a的某乙個虛擬位址(這個虛擬位址能對映為place),但b程序取到這個位址後,按照自己的對映方式,不能找到物理空間的這個place.

共享記憶體 與 mmap

o 共享記憶體 可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間 程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然 由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以 ...

程序通訊 mmap記憶體共享

回頁首if fd 0 回頁首 include include include include typedef structpeople main int argc,char argv map a normal file as shared mem printf initialize over n s...

Linux 共享記憶體mmap函式

include void mmap void addr,size t length,int prot,int flags,int fd,off t offset 引數二 對映的大小 引數三 保護的方式有讀,寫,執行,空 prot read prot write prot exec prot none...