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