中用內(nèi)存映射文件處理大文件計(jì)劃
引言
文件操作是應(yīng)用程序最為基本的功能之一,Win32 API和MFC均提供有支持文件處理的函數(shù)和類(lèi),常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile類(lèi)等。一般來(lái)說(shuō),以上這些函數(shù)可以滿足大多數(shù)場(chǎng)合的要求,但是對(duì)于某些特殊應(yīng)用領(lǐng)域所需要的動(dòng)輒幾十GB、幾百GB、乃至幾TB的海量存儲(chǔ),再以通常的文件處理方法進(jìn)行處理顯然是行不通的。目前,對(duì)于上述這種大文件的操作一般是以?xún)?nèi)存映射文件的方式來(lái)加以處理的,本文下面將針對(duì)這種Windows核心編程技術(shù)展開(kāi)討論。
內(nèi)存映射文件概述
內(nèi)存文件映射也是Windows的一種內(nèi)存管理方法,提供了一個(gè)統(tǒng)一的內(nèi)存管理特征,使應(yīng)用程序可以通過(guò)內(nèi)存指針對(duì)磁盤(pán)上的文件進(jìn)行訪問(wèn),其過(guò)程就如同對(duì)加載了文件的內(nèi)存的訪問(wèn)。通過(guò)文件映射這種使磁盤(pán)文件的全部或部分內(nèi)容與進(jìn)程虛擬地址空間的某個(gè)區(qū)域建立映射關(guān)聯(lián)的能力,可以直接對(duì)被映射的文件進(jìn)行訪問(wèn),而不必執(zhí)行文件I/O操作也無(wú)需對(duì)文件內(nèi)容進(jìn)行緩沖處理。內(nèi)存文件映射的這種特性是非常適合于用來(lái)管理大尺寸文件的。
在使用內(nèi)存映射文件進(jìn)行I/O處理時(shí),系統(tǒng)對(duì)數(shù)據(jù)的傳輸按頁(yè)面來(lái)進(jìn)行。至于內(nèi)部的所有內(nèi)存頁(yè)面則是由虛擬內(nèi)存管理器來(lái)負(fù)責(zé)管理,由其來(lái)決定內(nèi)存頁(yè)面何時(shí)被分頁(yè)到磁盤(pán),哪些頁(yè)面應(yīng)該被釋放以便為其它進(jìn)程提供空閑空間,以及每個(gè)進(jìn)程可以擁有超出實(shí)際分配物理內(nèi)存之外的多少個(gè)頁(yè)面空間等等。由于虛擬內(nèi)存管理器是以一種統(tǒng)一的方式來(lái)處理所有磁盤(pán)I/O的(以頁(yè)面為單位對(duì)內(nèi)存數(shù)據(jù)進(jìn)行讀寫(xiě)),因此這種優(yōu)化使其有能力以足夠快的速度來(lái)處理內(nèi)存操作。
使用內(nèi)存映射文件時(shí)所進(jìn)行的任何實(shí)際I/O交互都是在內(nèi)存中進(jìn)行并以標(biāo)準(zhǔn)的內(nèi)存地址形式來(lái)訪問(wèn)。磁盤(pán)的周期性分頁(yè)也是由操作系統(tǒng)在后臺(tái)隱蔽實(shí)現(xiàn)的,對(duì)應(yīng)用程序而言是完全透明的。內(nèi)存映射文件的這種特性在進(jìn)行大文件的磁盤(pán)事務(wù)操作時(shí)將獲得很高的效益。
需要說(shuō)明的是,在系統(tǒng)的正常的分頁(yè)操作過(guò)程中,內(nèi)存映射文件并非一成不變的,它將被定期更新。如果系統(tǒng)要使用的頁(yè)面目前正被某個(gè)內(nèi)存映射文件所占用,系統(tǒng)將釋放此頁(yè)面,如果頁(yè)面數(shù)據(jù)尚未保存,系統(tǒng)將在釋放頁(yè)面之前自動(dòng)完成頁(yè)面數(shù)據(jù)到磁盤(pán)的寫(xiě)入。
對(duì)于使用頁(yè)虛擬存儲(chǔ)管理的Windows操作系統(tǒng),內(nèi)存映射文件是其內(nèi)部已有的內(nèi)存管理組件的一個(gè)擴(kuò)充。由可執(zhí)行代碼頁(yè)面和數(shù)據(jù)頁(yè)面組成的應(yīng)用程序可根據(jù)需要由操作系統(tǒng)來(lái)將這些頁(yè)面換進(jìn)或換出內(nèi)存。如果內(nèi)存中的某個(gè)頁(yè)面不再需要,操作系統(tǒng)將撤消此頁(yè)面原擁用者對(duì)它的控制權(quán),并釋放該頁(yè)面以供其它進(jìn)程使用。只有在該頁(yè)面再次成為需求頁(yè)面時(shí),才會(huì)從磁盤(pán)上的可執(zhí)行文件重新讀入內(nèi)存。同樣地,當(dāng)一個(gè)進(jìn)程初始化啟動(dòng)時(shí),內(nèi)存的頁(yè)面將用來(lái)存儲(chǔ)該應(yīng)用程序的靜態(tài)、動(dòng)態(tài)數(shù)據(jù),一旦對(duì)它們的操作被提交,這些頁(yè)面也將被備份至系統(tǒng)的頁(yè)面文件,這與可執(zhí)行文件被用來(lái)備份執(zhí)行代碼頁(yè)面的過(guò)程是很類(lèi)似的。圖1展示了代碼頁(yè)面和數(shù)據(jù)頁(yè)面在磁盤(pán)存儲(chǔ)器上的備份過(guò)程:
作為保障性住房輪候家庭 圖1 進(jìn)程的代碼頁(yè)、數(shù)據(jù)頁(yè)在磁盤(pán)存儲(chǔ)器上的備份
顯然,如果可以采取同一種方式來(lái)處理代碼和數(shù)據(jù)頁(yè)面,無(wú)疑將會(huì)提高程序的執(zhí)行效率,而內(nèi)存映射文件的使用恰恰可以滿足此需求。
南京好男科醫(yī)院銀川子宮內(nèi)膜炎治療費(fèi)用
艾拉莫德片是不是止痛藥呢
- 快訊!證券市場(chǎng)交易商協(xié)會(huì)將升級(jí)推出科創(chuàng)票據(jù)
- 困住友商?紅米Note11T系列進(jìn)一步被認(rèn)定,用料全是性能向
- 她14歲愛(ài)上已婚代課,為和代課結(jié)婚斷絕父母來(lái)往,一年后含淚離世
- 上海:目前在崗騎手已近2萬(wàn)人 多舉措保障身心健康和配送安全
- 陜西省各類(lèi)各級(jí)民辦學(xué)校2021年比2020年減緩68所
- 大連:限制區(qū)域購(gòu)二手住房不受已有住房總套數(shù)限制
- 高明的領(lǐng)導(dǎo)會(huì)容忍你很多錯(cuò)誤,但這4個(gè)錯(cuò)誤千萬(wàn)別犯上,否則必吃虧
- 為什么曼德拉效應(yīng)出現(xiàn)的越來(lái)越多?難道人類(lèi)的記憶仍要被篡改?
- 說(shuō)袁泉老氣的是沒(méi)見(jiàn)過(guò)她22歲樣子:特質(zhì)好特質(zhì)足,比章子怡還耀眼
- 傲農(nóng)生物:實(shí)控人減持49.29%公司可轉(zhuǎn)債傲農(nóng)轉(zhuǎn)債,電廠信托增持
- “騎行褲”在國(guó)外夜總會(huì)火了!要怎么選才時(shí)髦舒適,看完這篇就懂了
- 【大戰(zhàn)“疫”日記】醫(yī)患攜手大戰(zhàn)疫情 職業(yè)生涯放光芒