這兩天學(xué)習(xí) < <windows核心編程>>內(nèi)存映射文件這部分,書(shū)上說(shuō):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
為了提高速度,系統(tǒng)將文件的數(shù)據(jù)頁(yè)面進(jìn)行高速緩存,并且在對(duì)文件的映射視圖進(jìn)行操作時(shí)不立即更新文件的磁盤映像。如果需要確保你的更新被寫(xiě)入磁盤,可以強(qiáng)制系統(tǒng)將修改過(guò)的數(shù)據(jù)的一部分或全部重新寫(xiě)入磁盤映像中,方法是調(diào)用F l u s h Vi e w O f F i l e函數(shù):
BOOL FlushViewOfFile(
PVOID pvAddress,
SIZE_T dwNumberOfBytesToFlush);
第一個(gè)參數(shù)是包含在內(nèi)存映射文件中的視圖的一個(gè)字節(jié)的地址。該函數(shù)將你在這里傳遞的地址圓整為一個(gè)頁(yè)面邊界值。第二個(gè)參數(shù)用于指明你想要刷新的字節(jié)數(shù)。系統(tǒng)將把這個(gè)數(shù)字向上圓整,使得字節(jié)總數(shù)是頁(yè)面的整數(shù)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
請(qǐng)問(wèn)一下:
1 "對(duì)文件的映射視圖進(jìn)行操作時(shí)不立即更新文件的磁盤映像" 那么何時(shí)更新?我程序正常退出前一定會(huì)更新吧?如果程序意外結(jié)束(比如電腦死機(jī))那是不是就可能無(wú)法將更改寫(xiě)入磁盤?
2 是不是只要程序不意外結(jié)束,我們就沒(méi)使用FlushViewOfFile的必要?否則請(qǐng)問(wèn)在什么情況下有必要使用它?
=============================================================
1、在UnmapViewOfFile、CloseHandle和系統(tǒng)回收物理內(nèi)存的時(shí)候?qū)懭氪疟P。當(dāng)進(jìn)程結(jié)束時(shí)(包括正常和異常),系統(tǒng)會(huì)自動(dòng)關(guān)閉該進(jìn)程打開(kāi)的所有Handle,所以會(huì)寫(xiě)入磁盤。除非是內(nèi)核代碼異常,導(dǎo)致死機(jī),這時(shí)才可能沒(méi)有寫(xiě)入。
2、FlushViewOfFile是為了實(shí)現(xiàn)程序自己控制寫(xiě)入磁盤而提供的,當(dāng)你真正遇到這種需求的時(shí)候才能體會(huì)到它的價(jià)值。