MMAP檔案對映

2021-09-22 08:15:25 字數 1478 閱讀 7666

mmap檔案對映:

mmap()系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。 

注:實際上,mmap()系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而posix或system v的共享記憶體ipc則純粹用於共享目的,當然mmap()實現共享記憶體也是其主要應用之一。 

首先用檔案空洞和ftruncate改到4k的空間大小,把檔案對映到記憶體裡面,可提高多執行緒或者多程序來進行讀寫。

lazy模式,在對映時會耗時;比read,write系統呼叫的速率高三倍

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

//從磁碟對映到記憶體

//start,起始點(檔案開頭)

//length對映多長,檔案對映多少,一般是4096,用stat檢視大小

//prot,記憶體保護標誌

//flags是否可以共享的標誌

//fd檔案描述符

//被對映物件內容起點,相對於start的偏移數

char* pstart = (char*)mmap(null, 4096, prot_read|prot_write,map_shared, fd, 0);

//prot與fd屬性要保持一致,位許可權,rdwr

//map_shared,預設共享

int munmap(void* addr,size_t length);

//解除對映,檔案從記憶體回歸磁碟

//addr必須為共享記憶體最開始獲得的pstart,不能偏移

//length對映的長度大小,初始獲取的大小

int ret = munmap(pstart, 4096);

記憶體管理中,大於4k的用堆空間, 小於4k的用棧空間,mmap不具備改變檔案大小的功能

應用例項:

#include #include #include #include #include int main(int argc,char *ar**)

int fd;

fd=open(ar**[1],o_rdwr);

if(-1==fd)

char *pstart;

pstart=(char*)mmap(null,4096,prot_read|prot_write,map_shared,fd,0);

if((char*)-1==pstart)

printf("%s\n",pstart);

pstart[0]='h';

int ret=munmap(pstart,4096);

if(-1==ret)

return 0;

}

參考:

檔案對映mmap

學習文獻 標頭檔案 include include 定義函式 void mmap void start,size t length,int prot,int flags,int fd,off t offsize 函式說明 mmap 用來將某個檔案內容對映到記憶體中,對該記憶體區域的訪問即是直接對該檔...

檔案對映mmap

磁碟與記憶體的對映就是檔案對映,說這個問題之前我們先說下swap,因為 這個問題讓我很容易想起swap,linux swap 是交換分割槽的意思,在記憶體不 夠的情況下,作業系統先把記憶體與磁碟的swap區進行乙個 對映 然後把 這些記憶體解放出來放入記憶體中,為之後的程序的騰出一塊記憶體空間,等到...

檔案對映mmap

磁碟與記憶體的對映就是檔案對映,說這個問題之前我們先說下swap,因為 這個問題讓我很容易想起swap,linux swap 是交換分割槽的意思,在記憶體不 夠的情況下,作業系統先把記憶體與磁碟的swap區進行乙個 對映 然後把 這些記憶體解放出來放入記憶體中,為之後的程序的騰出一塊記憶體空間,等到...