Windows中同一个内存映射文件的两个视图,它们如何以齐全的方式进行交互?

问题描述 投票:0回答:1

我对冲洗行为特别感兴趣。

假设我们使用CreateFileMapping()创建了一个MMF,并使用没有偏移的MapViewOfFile()打开了两个视图V1和V2。

然后我写了一些东西到A = V1 + a和东西到B = V2 + b,这样A和B属于不同的物理内存页面。

然后,如果我使用FlushViewOfFile(V1,0)刷新整个第一个视图,第二个视图的脏页面是否也会受到影响?

我的目标是拥有同一文件的2个视图,其中第一个视图用于非常小的写入和非常频繁的刷新,而第二个视图用于大量写入,并且仅在一段时间内刷新一次。

重要的是,刷新小写不会导致大量写入的冲刷。

这是默认行为吗?如果没有,如何实现呢?

谢谢

windows memory-mapped-files
1个回答
0
投票

CreateFileMappingA,另见CreateProcessDuplicateHandleOpenFileMapping函数。

“创建文件映射对象实际上并不将视图映射到进程地址空间.MapViewOfFileMapViewOfFileEx函数将文件视图映射到进程地址空间。

有一个重要的例外,从同一文件支持的任何文件映射对象派生的文件视图在特定时间是一致的或相同的。对于进程内的视图和由不同进程映射的视图,可以保证一致性。

该例外与远程文件有关。尽管CreateFileMapping可以与远程文件一起使用,但它并不能保持连贯性。例如,如果两台计算机都将文件映射为可写,并且两者都更改了同一页面,则每台计算机只能看到自己对该页面的写入。当数据在磁盘上更新时,它不会被合并。“

根据FlushViewOfFile

“刷新一系列映射视图会启动将该范围内的脏页写入磁盘。脏页是自映射文件视图后内容已更改的页面.TlushViewOfFile函数不会刷新文件元数据,也不会等待返回更改从底层硬件磁盘缓存刷新并物理写入磁盘。要清除所有脏页加上文件的元数据并确保它们物理写入磁盘,请调用FlushViewOfFile然后调用FlushFileBuffers函数。 “

所以,当你在UnmapViewOfFile关闭视图时

“当进程完成文件映射对象时,它应该通过对每个文件视图使用UnmapViewOfFile函数来销毁其地址空间中的所有文件视图。

取消映射文件的映射视图会使进程的地址空间中的视图占用的范围无效,并使该范围可用于其他分配。它删除了作为流程工作集一部分的每个未映射虚拟页面的工作集条目,并减少了流程的工作集大小。它还减少相应物理页面的共享计数。

未映射视图中的已修改页面在共享计数达到零之前不会写入磁盘,换句话说,直到它们从共享页面的所有进程的工作集中取消映射或修剪。即使这样,修改后的页面也会“懒洋洋地”写入磁盘;也就是说,修改可以缓存在内存中并在以后写入磁盘。为了在发生电源故障或系统崩溃时将数据丢失的风险降至最低,应用程序应使用FlushViewOfFile函数显式刷新已修改的页面。“

© www.soinside.com 2019 - 2024. All rights reserved.