我正在尝试为无交换系统实现文件支持的内存分配器。
对于每个新分配,我使用mkstemp
创建一个临时文件作为backstore,将mmap
作为MAP_SHARED
进行创建,以便在系统的内存压力很高时将页面交换到backstore。我想我已经把这部分工作了。
但是,我很难实现解除分配的情况。
由于在重新分配时,后台存储的内容,驻留页面或脏页面的内容都不再重要,因此,执行此操作的最快方法是删除并释放所有驻留页面,并使后端存储保持不变。但是我没有找到可以做到这一点的madvice
标志。MADV_DONTNEED
似乎过多,因为它将脏页提交到后存储。 (不正确,请参见下面的答案)
MADV_REMOVE
似乎也很多余,因为它不仅会删除常驻页面,而且还会删除后台存储本身。
那么,取消映射/关闭/删除mmap
ed文件的最快路径是什么?
也许mmap
与MAP_PRIVATE
(like this)再次位于同一区域,然后再对其进行munmap
?
最佳答案
根据this question,MADV_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/