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...