【问题标题】:disable copy-on-write(COW) on some memory pages when doing fork()执行 fork() 时在某些内存页面上禁用写时复制(COW)
【发布时间】:2011-01-17 16:58:58
【问题描述】:

当父进程fork子进程时(linux下),我想一开始就将父进程中的一些内存页复制到子进程的地址空间,也就是说,不需要等待复制-写时(牛)。是否有任何机制支持这一点?谢谢:-)

【问题讨论】:

  • 嗯,我不明白这个问题,也许你可以澄清一下。您是否希望在孩子的父母之间有一些共享的记忆?否则,如果父级在分叉之前正确设置了内存(即,用数据填充了一个区域),那么在分叉之后,子级可以在同一位置(在它自己的地址空间中)找到该数据。
  • 过早的优化被认为是有害的,过早的悲观化更是如此。除非你能说明你正在尝试做的事情的理由,否则我认为你犯了一个巨大的错误,并且可能不了解 COW。

标签: c linux memory-management copy-on-write


【解决方案1】:

我不知道有什么界面可以做到这一点,但您总是手动操作,要么使用memcpy,要么只是通过触摸相关页面(例如,阅读第一个单词,然后将其写回)。请务必将页面标记为volatile

【讨论】:

  • +1,但不需要关闭优化,将内存标记为volatile即可。
【解决方案2】:

看看clone 系统调用。最相关的选项是CLONE_VM。在 fork 纯粹是一种优化之后,实现页面的写时复制行为是很重要的。我无法预见这可能会成为问题的任何情况,除非您希望由于预先的页面重复而导致所有潜在的“惰性”性能损失。即使对于这些,您也可能过于热心地希望触摸每个可写页面,因为您将增加从原始进程派生的每个进程的物理内存使用量。

【讨论】:

  • 虚拟地址空间已被使用,即使使用 COW。 CLONE_VM 将使用所有共享内存创建任务(它是线程使用的标志之一)。
  • @ninjalj:在这两种情况下都是正确的。我昨晚写的,我关于虚拟内存使用的说法不正确。
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多