这两天学习 < <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是为了实现程序自己控制写入磁盘而提供的,当你真正遇到这种需求的时候才能体会到它的价值。