gpt4 book ai didi

linux - 丢弃脏的写时复制页面

转载 作者:太空狗 更新时间:2023-10-29 11:04:30 25 4
gpt4 key购买 nike

有没有一种方法可以通过 MAP_PRIVATE 创建一个写时复制映射,写入一些数据(即弄脏一些页面),然后丢弃我的更改,使用 munmap 和 re -映射?目标是为给定的映射维护相同的虚拟地址(如果我取消映射然后再次 mmap 相同的文件,则不能保证会发生这种情况),但要立即丢弃我所有的 COW 更改。

我的理解是,尝试通过提示地址和使用 MAP_FIXED 标志重新映射空间可能会产生这种效果;但是我不确定我对 MAP_FIXED 文档的解释是否正确,或者这种行为是否得到保证。

引用 mmap(2) 文档:

If the memory region specified by addr and len overlaps pages of any existing
mapping(s), then the overlapped part of the existing mapping(s) will be
discarded.

在这种情况下“丢弃”是否意味着任何 COW 页面都将被丢弃,并且从相应页面的新读取将出错并反射(reflect)磁盘上的变化?

最佳答案

如果您执行与现有映射重叠的 mmap 操作,Linux 内核将覆盖现有映射的重叠部分,就好像对它们执行了 unmap第一的。因此,例如,如果您将帧缓冲区映射到共享库曾经所在的位置,那么该内存现在与共享库无关;它指向帧缓冲区。

已删除映射中的基础页面对象独立于映射而存在:页面是引用计数对象。当两个 map 共享同一页面的 View 时,这仅仅是因为同一页面被“安装”在不同的 View 中。当页面变脏然后取消映射时,这不会产生必须在新映射之前写出脏页面的依赖关系;在原始脏页(例如,文件支持的共享映射的一部分)被刷新之前,虚拟内存已经可以重新分配给新的映射(例如一 block 图形帧缓冲区)。

关于丢弃映射:我不认为你能做到这一点。也就是说,如果你有一个应该将脏页刷新到底层文件的映射,你不能写入该内存然后快速unmap它(或mmap上面的东西)希望写永远不会完成。在 Linux 的 madvise API 中,有一个似乎相关的 MAP_REMOVE 操作,但根据手册页,它似乎只适用于 tmpfsshmfs。我认为阻止写入发生的唯一方法是进行历史悠久的仪式,称为“电源开关潜水”。

有一种方法可以映射文件对象,这样更改就不会传播:即 MAP_PRIVATE(与 MAP_SHARED 相反)。 MAP_PRIVATE 是必需的,例如,像 gdb 这样的调试器需要能够将断点放入可执行文件或共享库中,而不会将陷阱指令放入每个实例每个正在运行的进程中的可执行文件或库(以及磁盘上的副本!)。

如果您有一个带有修改部分的 MAP_PRIVATE,并且您取消映射它(或那些部分)或在它们之上映射某些东西,我相信它们会被丢弃。这些页面应该是写时复制的,因此使它们变脏的过程应该是唯一的引用。当它们被取消映射时,它们的引用计数会下降到零,并且由于它们是私有(private)页面,它们会被占满。

关于linux - 丢弃脏的写时复制页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com