2

我有一个内存映射文件,以及当前提交的视图中的一个页面。我想取消它。MapViewOfFile 告诉我不能在文件映射页面上使用 VirtualFree。还有其他方法吗?

4

1 回答 1

4

你不能解除它,但你真正想要的不是解除它......

你真正想要的是从内存中释放页面。这可以通过使用 VirtualUnlock 来完成。见VirtualUnlock 备注

在未锁定的内存范围上调用 VirtualUnlock 会从进程的工作集中释放页面。

注意:如文档所述,该函数将返回 FALSE(页面未锁定)并且 GetLastError 将返回 ERROR_NOT_LOCKED。

这在Guillermo Prandi 的问题 CreateFileMapping, MapViewOfFile, how to Avoid hold up the system memory 中有描述。

备注:我认为您可以这样看:取消提交映射页面是无意义的 - 只要页面由物理存储支持,无论是内存还是文件,都会提交页面。从这个意义上说,文件映射页面不能被取消提交,因为它将始终由文件支持。


但是,提到的问题中的代码正在测量内存占用,但它所测量的并不具有代表性,因为从进程工作集中删除页面这一事实并不一定意味着它不再存在于内存中。

我做了一个不同的实验,测量从内存映射页面读取一个字节需要多长时间。解锁页面或取消映射视图并关闭映射句柄后,访问仍然很快。

为了使访问变慢(即真正从内存中丢弃页面),有必要取消映射视图并关闭内存映射句柄和文件句柄(最后一个让我感到惊讶,因为我期望取消映射视图并关闭映射句柄就足够了)。

仍然有可能系统会以 VirtualUnlocked 作为提示,并且一旦需要丢弃某些内容,它就会更快地丢弃页面,但这是我必须考虑的问题,但如何证明。

于 2010-08-19T19:03:58.317 回答