fork()上的手册页声明它不复制数据页面,它将它们映射到subprocess并放置一个写时复制标志。 那是行为:
一致的linux之间的口味?
考虑实施细节,因此可能会改变?
我想知道如果我可以使用fork()作为一种手段,以便宜的方式获得共享只读内存块。 如果内存是在物理上复制的话,那将是相当昂贵的 – 有很多分叉正在进行,并且数据区域足够大 – 但我希望不是…
在linux中fork()的名字是什么意思?
subprocess在父进程之后启动
创build一个新的进程来执行ls命令
调用守护进程()和调用fork(),setsID(),fork()等有什么区别?
linux fork系统调用
运行在没有MMU(内存管理单元)的机器上的linux将复制fork()上的所有进程内存。
但是,这些系统通常非常小,嵌入式,你可能不必担心。
许多服务(如Apache的fork模型)使用initialize和fork()方法共享初始化的数据结构。
你应该知道,如果你正在使用像Perl和Python这样的使用引用计数变量的语言,或者C ++ shared_ptr,那么这个模型将不起作用。 这将无法正常工作,因为随着引用计数的上下调整,内存将被取消共享并被复制。
这会导致像SpamAssassin这样的Perl守护进程使用初始化和fork模式的大量内存使用。
是的,你当然可以依靠MMU-linux内核。 这几乎是一切。
但是,到处都是页面大小不一样。
可以通过使用mmap()创建一个匿名映射 – 一个不被物理文件支持的映射,为分叉进程显式创建一个共享内存区域。 在fork上,这个区域将始终保持共享(只要孩子不要取消映射,或者在同一地址映射其他内容)。 如果你愿意的话,你可以把它保护起来。
使用(例如)malloc分配的内存可以很容易地最终共享一个不是只读的页面,这意味着当另一个结构被修改时它被复制。 这包括malloc实现使用的内部结构。 所以你可能想为这个目的制定一个特定的区域,并从中进行分配。
你能依靠所有的linux风格这样做吗? 但是,你可以依靠那些不使用更快的方法的事实。
因此,如果出现性能问题,您应该使用该功能并依靠它并重新审视您的决定。
这种方法的成功取决于你如何坚持自己的“只读”限制。 父母和孩子都必须服从这个狭窄,否则记忆被复制。
不过,这可能不是你想象中的灾难。 内核可以拷贝一个页面(通常是4 KB)来实现CoW语义。 典型的linux服务器将使用更复杂的东西,某种slab分配器 ,所以复制的区域可能会更大。
主要的一点是,这是从你的程序的内存使用概念中分离出来的。 如果你malloc() 1 GB的RAM,分叉一个孩子,和孩子只改变该内存块的第一个字节,整个1 GB的块不复制。 也许只有一个页面被复制,直到包含第一个字节的板块大小。
是
所有的linux发行版都使用相同的内核,尽管它们的版本和版本略有不同。
另一个潜在的fork(2)实现将不会很快,所以可以肯定的是,copy-on-write将继续成为机制。 也许这不会是永远的,但多年来,肯定。
当然一些主要的软件系统(例如Phusion Passenger )使用fork(2)的方式与你想要的相同,所以你不会是唯一利用CoW的。
总结以上是内存溢出为你收集整理的fork()写时复制是一个稳定的公开行为,可用于实现只读共享内存?全部内容,希望文章能够帮你解决fork()写时复制是一个稳定的公开行为,可用于实现只读共享内存?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)