- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有没有一种方法可以通过 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
操作,但根据手册页,它似乎只适用于 tmpfs
和 shmfs
。我认为阻止写入发生的唯一方法是进行历史悠久的仪式,称为“电源开关潜水”。
有一种方法可以映射文件对象,这样更改就不会传播:即 MAP_PRIVATE
(与 MAP_SHARED
相反)。 MAP_PRIVATE
是必需的,例如,像 gdb
这样的调试器需要能够将断点放入可执行文件或共享库中,而不会将陷阱指令放入每个实例每个正在运行的进程中的可执行文件或库(以及磁盘上的副本!)。
如果您有一个带有修改部分的 MAP_PRIVATE
,并且您取消映射它(或那些部分)或在它们之上映射某些东西,我相信它们会被丢弃。这些页面应该是写时复制的,因此使它们变脏的过程应该是唯一的引用。当它们被取消映射时,它们的引用计数会下降到零,并且由于它们是私有(private)页面,它们会被占满。
关于linux - 丢弃脏的写时复制页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357277/
(>>)的定义功能如下:(>>) :: Monad m => m a -> m b -> m b但我想实现这个功能翻转如下: 我有一个函数tabulate :: Int -> [Int] -> IO
我在新线程中创建一个新的托管对象上下文,并向其中插入一些对象。我可以通过不保存上下文来丢弃(忘记它们)它们吗?我的问题是这样的:我开始一个漫长的过程,在开始时创建一些 NSManagedObjects
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 3年前关闭。 Improve t
虽然建议打开编译器标志,如 -Wvalue-discard或 -Wunused:implicits通过使用 sbt-tpolecat 显式或隐式地. 有时您需要解决这些问题,但要以一种明确的方式;因为
在 R 中,na.omit()函数可用于丢弃包含 NA 值的 data.frame 中的条目。作为副作用,如果确实丢弃了行,则该函数会向结果添加一个属性 'omit',其中包含被丢弃的 row.nam
使用 geom_blank我想添加一些新的因子水平,但我似乎无法这样做并保留 NA水平 library('ggplot2') pl <- ggplot(data.frame(x = factor(c(
谁能告诉我两者之间是否有什么区别 DROP IF EXISTS [TABLE_NAME] DROP [TABLE_NAME] 我问这个问题是因为我在 MVC Web 应用程序中使用 JDBC 模板。如
例如,我有以下表达式映射: function! DelNthSpace() let col=match(getline('.'), '[[:blank:] ]', col('.'
默认情况下,Chrome 会丢弃后台未使用的选项卡以节省内存。 我想知道是否有一种方法可以让我现在可以在我的网站被 Chrome 丢弃的情况下 - 这样我就可以告诉我的用户,下次他们进入时,如何避免这
我的数据库中有一个元素列表,每个元素都有自己的日期时间字段。我想丢弃比今天更旧的元素,这意味着我只会看到 future 的元素。 这是我当前的代码: def get_dates_approved(re
我为我的 linux 机器编写了一个 C++ 工具,它接收 UDP (OSC) 数据包并立即将它们发回(这是它唯一做的事情)。但似乎有一些丢弃的数据包。当我向我的 linux(从另一台机器)发送 10
在创建 cron 作业时,我总是这样写: 15 0 * * * /somepath/somescript.pl > /dev/null 2>&1 关于末尾“>/dev/null 2>&1”丢弃所有st
我已经四处寻找有关此问题的指示,但找不到任何指示。假设我有一个 Python 列表: list = set([((3, 2), (2, 1)), ((3, 2), (3, 1)
我正在介绍 C,我需要编写一个程序来提示用户输入字符、等号和整数。我需要使用 getchar() 直到 '=' 然后使用 scanf() 获取整数。然后程序应该只输出整数返回给用户。 现在它打印出不必
如何忽略数据框中随机分布在数据框中的空单元格?这是我的例子 ColA ColB ColC ColD ColF ColG ColH A
我无法在网上找到我的问题的单一答案... 我正在为我的投资组合构思一个网站创意,并决定涉足一些 jQuery 让它更令人兴奋。我正确链接了 jQuery 并且工作,但是当我使用 .toggle 方法时
据我了解,在 Linux 中创建虚拟驱动器的过程是这样的 fallocate -l size /path/to/file.img; dd if=/dev/zero of=/path/tofile.im
大多数时候,我都是这样做的。 class a { public: ~ a() { i = 100; // OK delete (int *)j
下面的代码编译。它似乎运行良好。 但是它会导致任何未定义的行为吗? 我想抛弃 *this 的常量。 这是为了允许 const my_iterator 改变它指向的数据。 测试: class A { p
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is const_cast safe? 显然我永远不会写这段代码,但它是真实程序中出现的一个非常简单的例子。
我是一名优秀的程序员,十分优秀!