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