我正在尝试为无交换系统实现文件支持的内存分配器。

对于每个新分配,我使用mkstemp创建一个临时文件作为backstore,将mmap作为MAP_SHARED进行创建,以便在系统的内存压力很高时将页面交换到backstore。我想我已经把这部分工作了。

但是,我很难实现解除分配的情况。

由于在重新分配时,后台存储的内容,驻留页面或脏页面的内容都不再重要,因此,执行此操作的最快方法是删除并释放所有驻留页面,并使后端存储保持不变。但是我没有找到可以做到这一点的madvice标志。
MADV_DONTNEED似乎过多,因为它将脏页提交到后存储。 (不正确,请参见下面的答案)


MADV_REMOVE似乎也很多余,因为它不仅会删除常驻页面,而且还会删除后台存储本身。



那么,取消映射/关闭/删除mmap ed文件的最快路径是什么?

也许mmapMAP_PRIVATE(like this)再次位于同一区域,然后再对其进行munmap

最佳答案

根据this questionMADV_DONTNEED正是这样做的:删除页面而不写回后台存储。

子句repopulating the memory contents from the up-to-date contents of the underlying mapped file表示MADV_DONTNEED从后台存储重新加载后的加载。

没有将MADV_DONTNEED之前的所有脏页提交到后台存储,因此将丢失。

总结:MADV_DONTNEED删除所有映射的页面(包括脏页面未提交到后备存储),并保持后备存储不变。

Fun and informational video here

关于c - 如何将脏页放入mmaped内存中并准备快速munmap?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54997052/

10-10 02:21