5181人閱讀
2014-03-01 15:12:08
記憶體對映就是將磁碟上的檔案對映到系統記憶體中,對記憶體的修改可以同步到對磁碟檔案的修改。可以對大資料檔案處理,並且可以提高檔案的讀寫速度。
#include#include#include#include#include#define numreconds 100
typedef struct
recond;
int main(void)
fclose(fp);
//使用傳統方式修改檔案內容
fp = fopen("recond.dat","r+");
//獲得要修改檔案的位置
fseek(fp,43*sizeof(recond),seek_set);
fread(&recond,sizeof(recond),1,fp);
recond.inum = 143;
sprintf(recond.sname,"recond-%d",recond.inum);
fwrite(&recond,sizeof(recond),1,fp);
fclose(fp);
//使用記憶體對映的方式開啟檔案,修改檔案記憶體
//注意這裡是open開啟不是fopen!!!!
f = open("recond.dat",o_rdwr);
//獲得磁碟檔案的記憶體對映
//將修改同步到磁碟中
//關閉記憶體對映
close(f);
exit(0);
}
void *mmap(void *start, size_t length, int prot, int flags,
int fd, off_t offset);
引數說明:
length:對映區的長度。//長度單位是 以位元組為單位,不足一記憶體頁按一記憶體頁處理
prot:期望的記憶體保護標誌,不能與檔案的開啟模式衝突。是以下的某個值,可以通過or運算合理地組合在一起
prot_exec //頁內容可以被執行
prot_read //頁內容可以被讀取
prot_write //頁可以被寫入
prot_none //頁不可訪問
flags:指定對映物件的型別,對映選項和對映頁是否可以共享。它的值可以是乙個或者多個以下位的組合體
map_fixed //使用指定的對映起始位址,如果由start和len引數指定的記憶體區重疊於現存 對映空間,重疊部分將會被丟棄。如果指定的起始位址不可用,操作將會失敗。並且起始地 址必須落在頁的邊界上。
map_shared //與其它所有對映這個物件的程序共享對映空間。對共享區的寫入,相當於輸出到檔案。直到msync()或者munmap()被呼叫,檔案實際上不會被更新。
map_private //建立乙個寫入時拷貝的私有對映。記憶體區域的寫入不會影響到原檔案。這個標誌和以上標誌是互斥的,只能使用其中乙個。
map_denywrite //這個標誌被忽略。
map_executable //同上
fd:有效的檔案描述詞。一般是由open()函式返回,其值也可以設定為-1,此時需要指定flags引數中的map_anon,表明進行的是匿名對映。
offset:被對映物件內容的起點。
int msync ( void * addr, size_t len, int flags)
程序在對映空間的對共享內容的改變並不直接寫回到磁碟檔案中,往往在呼叫munmap()後才執行該操作。
可以通過呼叫msync()函式來實現磁碟檔案內容與共享記憶體區中的內容一致,即同步操作.
len:對映空間的大小;
flags:重新整理的引數設定,可以取值ms_async/ ms_sync/ ms_invalidate
其中:取值為ms_async(非同步)時,呼叫會立即返回,不等到更新的完成;
取值為ms_sync(同步)時,呼叫會等到更新完成之後返回;
取ms_invalidate(通知使用該共享區域的程序,資料已經改變)時,在共享內容更改之後,使得檔案的其他對映失效,從而使得共享該檔案的其他程序去重新獲取最新值;
int munmap(void *start,size_t length);
函式說明 munmap()用來取消引數start所指的對映記憶體起始位址,引數length則是欲取消的記憶體大小。
Python記憶體對映檔案讀寫方式
我就廢話不多說了,還是直接看 吧!import os import time import mmap filename test.txt 如果不存在,建立。if not os.path.exists filename open filename,w print os.path.isdir filen...
LINUX 記憶體對映方式
記憶體對映結構 1 32位位址線定址4g的記憶體空間,其中0 3g為使用者程式所獨有,3g 4g為核心占有。2 struct page 整個物理內存在初始化時,每個4kb頁面生成乙個對應的struct page結構,這個page結構就獨一無二的代表這個物理記憶體頁面,並存放在mem map全域性陣列...
檔案讀寫,共享記憶體和mmap記憶體對映
1傳統的檔案讀寫,需要將磁碟上的資料copy到檔案緩衝區 為了避免對磁碟的反覆讀寫 都在核心空間,然後找到檔案的inode,先去檔案緩衝區中找有沒有這個檔案,如果沒有的話,到磁碟再到檔案緩衝區。2.共享記憶體是兩個程序同時開闢出一塊虛擬位址空間,對映到同一塊物理記憶體上 3.記憶體對映是虛擬位址上直...