首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在内存中删除脏页,并为快速的munmap做准备?

如何在内存中删除脏页,并为快速的munmap做准备?
EN

Stack Overflow用户
提问于 2019-03-05 06:57:50
回答 2查看 397关注 0票数 3

我正在尝试为无擦拭系统实现一个文件支持内存分配程序。

对于每一个新分配,我使用mkstemp创建一个临时文件作为备份,mmap作为MAP_SHARED允许页面在系统内存压力过大时被交换到回存。我想我已经把这部分做好了。

然而,我在执行取消分配案例时遇到了困难。

由于在取消分配时,后台存储的内容和驻留页或脏页的内容都不再重要,因此最快的方法是删除和释放所有驻留页面,并保持备份不变。然而,我没有找到一个madvice标志可以做到这一点。

MADV_DONTNEED看起来过度了,因为它会将脏页提交回存储。(不正确,见下面的答案)

MADV_DONTNEED 在成功的MADV_DONTNEED操作之后,指定区域中的内存访问的语义将被更改:范围内的页面的后续访问将成功,但将导致从底层映射文件的最新内容(对于共享文件映射、共享匿名映射和基于shmem的技术,如System共享内存段)重新填充内存内容,或者为匿名私有映射重新填充零填充按需页。

MADV_REMOVE看起来也太过了,因为它不仅会删除驻留页面,而且还会掉回存储本身。

MADV_REMOVE 释放给定范围的页面及其相关的备份存储。这相当于在支持存储的相应字节范围内穿孔(请参见range (2))。指定地址范围内的后续访问将看到包含零的字节。

那么,取消映射/关闭/删除mmaped文件的最快路径是哪些步骤?

也许mmapMAP_PRIVATE (像这样)相同的区域,然后munmap

EN

回答 2

Stack Overflow用户

发布于 2019-03-06 01:04:16

根据这个问题的说法,MADV_DONTNEED就是这样做的:放下页面而不写回后台商店。

子句repopulating the memory contents from the up-to-date contents of the underlying mapped file意味着在MADV_DONTNEED将从back存储重新加载之后加载。

MADV_DONTNEED之前的所有脏页都没有提交到后台商店,因此会丢失。

总之:MADV_DONTNEED删除所有映射的页面(包括未提交到后台存储的脏页),并保持原样。

有趣和信息视频在这里

票数 1
EN

Stack Overflow用户

发布于 2020-10-26 08:31:20

在脏页上建议MADV_DONTNEED不要放弃更改。

我刚刚用mmap/ MADV_DONTNEED/munmap编写了一个5GB文件,最后的两个步骤以2-4MB块的形式进行,文件的创建没有一个错误。

但是,MADV_DONTNEED对脏页没有影响。munmap减少了进程的RSS,但是编写仍然是由Linux自行决定的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54997052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档