【问题标题】:How can I decommit a file-mapped page?如何取消提交文件映射页面?
【发布时间】:2011-04-01 07:28:58
【问题描述】:

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

【问题讨论】:

    标签: winapi memory-management file-mapping


    【解决方案1】:

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

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

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

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

    这在Guillermo Prandi's question CreateFileMapping, MapViewOfFile, how to avoid holding up the system memory中有描述。

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


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

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

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

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

    【讨论】:

    • 我已经进行了一个实验,但到目前为止我发现结果尚无定论。我会在答案中直接描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2016-07-12
    • 2014-11-15
    • 2011-03-04
    相关资源
    最近更新 更多