linux - fork() copy-on-write 是一种稳定的暴露行为,可以用来实现只读共享内存吗?

标签 linux fork

fork() 的手册页声明它不复制数据页,它将它们映射到子进程并放置一个写时复制标志。是那种行为:

  • Linux 风格之间是否一致?
  • 考虑了实现细节并因此可能会更改?

我想知道我是否可以使用 fork() 作为以便宜的方式获得共享只读内存块的方法。如果内存是物理复制的,那将是相当昂贵的——有很多 fork 正在进行,而且数据区域足够大——但我希望不会……

最佳答案

在没有 MMU(内存管理单元)的机器上运行的 Linux 将复制 fork() 上的所有进程内存。

但是,这些系统通常非常小并且是嵌入式的,您可能不必担心它们。

许多服务,例如 Apache 的 fork 模型,使用 initialize 和 fork() 方法来共享初始化的数据结构。

您应该知道,如果您使用的语言(例如使用引用计数变量的 Perl 和 Python)或 C++ shared_ptr,则此模型将不起作用。它不会工作,因为随着引用计数上下调整,内存变得不共享并被复制。

这会导致 Perl 守护程序(如 SpamAssassin)尝试使用初始化和派生模型时使用大量内存。

关于linux - fork() copy-on-write 是一种稳定的暴露行为,可以用来实现只读共享内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3669493/

相关文章:

linux - 使用 apt 在 Linux 上安装 virtualenv 的权限问题

linux - 为什么在手册页中 getenv MT 是安全的?

linux - 按名称杀死正在运行的进程

ruby-on-rails - 为 Rails 项目创建一个 gem

c - 写入()到 i2c 设备 : Operation not permitted

linux - Bash shell 从命令行命令 VPN 连接

C 如何在进程之间共享信息?

python 叉(): passing data from child to parent

Python fork : 'Cannot allocate memory' if process consumes more than 50% avail. 内存

C++ 进程和管道