在Unix / Linux中运行两个进程

时间:2012-11-23 16:48:30

标签: linux unix

当内核创建两个代码段相同的进程时,内核是否实际将代码复制到两个进程的虚拟地址空间?换句话说,如果我在内存中创建同一程序的两个进程,我们是否有两个程序副本或只有一个副本?

显然,它可能取决于实现,但我在传统的Unix操作系统中提出要求。

2 个答案:

答案 0 :(得分:3)

  

内核是否实际将代码复制到两个进程的虚拟地址空间?

文本段将被映射(而不是复制)到每个进程的虚拟地址空间,但是将引用相同的物理空间(因此内核在内存中只有一个文本副本)。

数据和bss段也将映射到每个进程的虚拟地址空间,但这些将按进程创建。在进程启动时,来自可执行文件的数据和bss段的数据将被映射/复制到进程的虚拟内存中;如果没有从头开始复制,那么只要进程开始写入数据,该进程就会被赋予自己的私有副本。

显然,在进程启动后处理共享内存和mmap内存。共享内存总是在进程之间共享;这是它的存在理由。 mmap会发生什么情况取决于使用的标志,但它也经常被共享。

答案 1 :(得分:2)

现代操作系统将使用Copy-on-Write来避免重复页面,直到它们实际更新为止。请注意,在许多系统(包括Linux)上,这可能导致过度使用,如果每个进程决定修改未重复的页面,操作系统实际上没有足够的RAM来处理所需的所有复制。