亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2293 | 回復(fù): 0
打印 上一主題 下一主題

[函數(shù)] 內(nèi)存映射文件 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-08-01 10:30 |只看該作者 |倒序?yàn)g覽
內(nèi)存映射文件

內(nèi)存映射文件與虛擬內(nèi)存有些類似,通過內(nèi)存映射文件可以保留一個(gè)地址空間的區(qū)域,同時(shí)將物理存儲(chǔ)器提交給此區(qū)域,只是內(nèi)存文件映射的物理存儲(chǔ)器來自一個(gè)已經(jīng)存在于磁盤上的文件,而非系統(tǒng)的頁文件,而且在對(duì)該文件進(jìn)行操作之前必須首先對(duì)文件進(jìn)行映射,就如同將整個(gè)文件從磁盤加載到內(nèi)存。由此可以看出,使用內(nèi)存映射文件處理存儲(chǔ)于磁盤上的文件時(shí),將不必再對(duì)文件執(zhí)行I/O操作,這意味著在對(duì)文件進(jìn)行處理時(shí)將不必再為文件申請(qǐng)并分配緩存,所有的文件緩存操作均由系統(tǒng)直接管理,由于取消了將文件數(shù)據(jù)加載到內(nèi)存、數(shù)據(jù)從內(nèi)存到文件的回寫以及釋放內(nèi)存塊等步驟,使得內(nèi)存映射文件在處理大數(shù)據(jù)量的文件時(shí)能起到相當(dāng)重要的作用。另外,實(shí)際工程中的系統(tǒng)往往需要在多個(gè)進(jìn)程之間共享數(shù)據(jù),如果數(shù)據(jù)量小,處理方法是靈活多變的,如果共享數(shù)據(jù)容量巨大,那么就需要借助于內(nèi)存映射文件來進(jìn)行。實(shí)際上,內(nèi)存映射文件正是解決本地多個(gè)進(jìn)程間數(shù)據(jù)共享的最有效方法。

內(nèi)存映射文件并不是簡單的文件I/O操作,實(shí)際用到了Windows的核心編程技術(shù)--內(nèi)存管理。所以,如果想對(duì)內(nèi)存映射文件有更深刻的認(rèn)識(shí),必須對(duì)Windows操作系統(tǒng)的內(nèi)存管理機(jī)制有清楚的認(rèn)識(shí),下面給出使用內(nèi)存映射文件的一般方法:
首先要通過CreateFile()函數(shù)來創(chuàng)建或打開一個(gè)文件內(nèi)核對(duì)象,這個(gè)對(duì)象標(biāo)識(shí)了磁盤上將要用作內(nèi)存映射文件的文件。在用CreateFile()將文件映像在物理存儲(chǔ)器的位置通告給操作系統(tǒng)后,只指定了映像文件的路徑,映像的長度還沒有指定。為了指定文件映射對(duì)象需要多大的物理存儲(chǔ)空間還需要通過CreateFileMapping()函數(shù)來創(chuàng)建一個(gè)文件映射內(nèi)核對(duì)象以告訴系統(tǒng)文件的尺寸以及訪問文件的方式。在創(chuàng)建了文件映射對(duì)象后,還必須為文件數(shù)據(jù)保留一個(gè)地址空間區(qū)域,并把文件數(shù)據(jù)作為映射到該區(qū)域的物理存儲(chǔ)器進(jìn)行提交。由MapViewOfFile()函數(shù)負(fù)責(zé)通過系統(tǒng)的管理而將文件映射對(duì)象的全部或部分映射到進(jìn)程地址空間。此時(shí),對(duì)內(nèi)存映射文件的使用和處理同通常加載到內(nèi)存中的文件數(shù)據(jù)的處理方式基本一樣,在完成了對(duì)內(nèi)存映射文件的使用時(shí),還要通過一系列的操作完成對(duì)其的清除和使用過資源的釋放。這部分相對(duì)比較簡單,可以通過UnmapViewOfFile()完成從進(jìn)程的地址空間撤消文件數(shù)據(jù)的映像、通過CloseHandle()關(guān)閉前面創(chuàng)建的文件映射對(duì)象和文件對(duì)象。

利用內(nèi)存映射文件您可以認(rèn)為操作系統(tǒng)已經(jīng)為您把文件全部裝入了內(nèi)存,然后您只要移動(dòng)文件指針進(jìn)行讀寫即可了。這樣您甚至不需要調(diào)用那些分配、釋放內(nèi)存塊和文件輸入/輸出的API函數(shù),另外您可以把這用作不同的進(jìn)程之間共享數(shù)據(jù)的一種辦法。運(yùn)用內(nèi)存映射文件實(shí)際上沒有涉及實(shí)際的文件操作,它更象為每個(gè)進(jìn)程保留一個(gè)看得見的內(nèi)存空間。至于把內(nèi)存映射文件當(dāng)成進(jìn)程間共享數(shù)據(jù)的辦法來用,則要加倍小心,因?yàn)槟坏貌惶幚頂?shù)據(jù)的同步問題,否則您的應(yīng)用程序也許很可能得到過時(shí)或錯(cuò)誤的數(shù)據(jù)甚至崩潰。本課中我們將主要講述內(nèi)存映射文件,將不涉及進(jìn)程間的同步。WIN32中的內(nèi)存映射文件應(yīng)用非常廣泛,譬如:即使是系統(tǒng)的核心模塊---PE格式文件裝載器也用到了內(nèi)存映射文件,因?yàn)镻E格式的文件并不是一次性加載到內(nèi)存中來的,譬如他它在首次加載時(shí)只加載必需加載的部分,而其他部分在用到時(shí)再加載,這正好可以利用到內(nèi)存映射文件的長處。實(shí)際中的大多數(shù)文件存取都和PE加載器類似,所以您在處理該類問題時(shí)也應(yīng)該充分利用內(nèi)存映射文件。 內(nèi)存映射文件本身還是有一些局限性的,譬如一旦您生成了一個(gè)內(nèi)存映射文件,那么您在那個(gè)會(huì)話期間是不能夠改變它的大小的。所以內(nèi)存映射文件對(duì)于只讀文件和不會(huì)影響其大小的文件操作是非常有用的。當(dāng)然這并不意味著對(duì)于會(huì)引起改變其大小的文件操作就一定不能用內(nèi)存影射文件的方法,您可以事先估計(jì)操作后的文件的可能大小,然后生成這么大小一塊的內(nèi)存映射文件,然后文件的長度就可以增長到這么一個(gè)大小。

若要使用內(nèi)存映射文件,必須執(zhí)行下列操作步驟:

1.創(chuàng)建或打開一個(gè)文件內(nèi)核對(duì)象,該對(duì)象用于標(biāo)識(shí)磁盤上你想用作內(nèi)存映射文件的文件;

2.創(chuàng)建一個(gè)文件映射內(nèi)核對(duì)象,告訴系統(tǒng)該文件的大小和你打算如何訪問該文件;

3.讓系統(tǒng)將文件映射對(duì)象的全部或一部分映射到你的進(jìn)程地址空間中;

當(dāng)完成對(duì)內(nèi)存映射文件的使用時(shí),必須執(zhí)行下面這些步驟將它清除:

1.告訴系統(tǒng)從你的進(jìn)程的地址空間中撤消文件映射內(nèi)核對(duì)象的映像;

2.關(guān)閉文件映射內(nèi)核對(duì)象;

3.關(guān)閉文件內(nèi)核對(duì)象;


接下來我們就看看實(shí)現(xiàn)的細(xì)節(jié):
調(diào)用CreateFile打開您想要映射的文件。  
調(diào)用CreateFileMapping,其中要求傳入先前CreateFile返回的句柄,該函數(shù)生成一個(gè)建立在CreateFile函數(shù)創(chuàng)建的文件對(duì)象基礎(chǔ)上的內(nèi)存映射對(duì)象。  
調(diào)用MapViewOfFile函數(shù)映射整個(gè)文件的一個(gè)區(qū)域或者整個(gè)文件到內(nèi)存。該函數(shù)返回指向映射到內(nèi)存的第一個(gè)字節(jié)的指針。  用該指針來讀寫文件。  
調(diào)用UnmapViewOfFile來解除文件映射。  
調(diào)用CloseHandle來關(guān)閉內(nèi)存映射文件。注意必須傳入內(nèi)存映射文件的句柄。  
調(diào)用CloseHandle來關(guān)閉文件。注意必須傳入由CreateFile創(chuàng)建的文件的句柄。

使用內(nèi)存映射文件:
1.創(chuàng)建或打開文件內(nèi)核對(duì)象
2.創(chuàng)建文件映射內(nèi)核對(duì)象
3.將文件數(shù)據(jù)映射入進(jìn)程地址空間
4.從進(jìn)程地址空間中解除文件數(shù)據(jù)映射
5.關(guān)閉文件映射對(duì)象和文件對(duì)象
HANDLE hFile,hFileMapping;
PVOID pFile;
hFile =CreateFile(...);  告訴操作系統(tǒng)文件映射的物理存儲(chǔ)的位置。
hFileMapping = CreateFileMapping(hFile,...); 告訴系統(tǒng)文件映射對(duì)象需要多少物理存儲(chǔ)。
pFile = MapViewOfFile(hFileMapping,...); 讓系統(tǒng)保留一塊地址空間區(qū)域,將文件數(shù)據(jù)作為物理存儲(chǔ)提交到該空間。

UnmapViewOfFile(pFile); 當(dāng)不在需要在進(jìn)程的地址空間區(qū)域中保留文件的數(shù)據(jù)映射時(shí),可以釋放該區(qū)域。
CloseHandle(hFileMapping); 關(guān)閉打開過的所有內(nèi)核對(duì)象,避免進(jìn)程中的資源泄漏。
CloseHandle(hFile);
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP