在linux中,是否在运行相同用户程序的两个进程之间共享可执行二进制文件?
问题描述:
我知道DLL,可执行文件在进程间共享。但是对于用户定义的程序,当我在两个终端上运行“测试”时,我们称之为“测试”。程序是可执行的将被共享这两个进程,还是每个人都得到一个单独的副本?谢谢。在linux中,是否在运行相同用户程序的两个进程之间共享可执行二进制文件?
答
首先将文件复制到内核的页面缓存中。当它已经在,然后第二次运行将使用这个缓存的。每个文件一个缓存。
+0
我认为您指的是数据缓存。程序加载方式不同。每个实例都有自己的程序计数器,堆栈指针等等。事实上,调用'fork()'或'clone()'会复制进程,所有内容都会被复制,但是向前移动都会有自己的副本。 – alvits
答
文本部分是共享的(代码),堆不共享。
无论从磁盘加载什么,都将共享磁盘缓存。
@alvits正确地说,堆将在fork上复制,但它是通过写时复制(COW)完成的,这意味着如果数据没有改变,它就会被复制,并且不会占用新的内存。
这个答案是相似的:how is a shared library file called by two different processes in Linux?
如果双方有不同的进程id的,我觉得可执行代码会有所不同了。 –
你的问题含糊不清。当你提到'DLL'时,就会想到共享对象。在Linux中它相当于'* .so'文件。当用户程序被编译或用户程序加载它时,这些共享对象会被加载到内存中。但是你跟进了两个程序同时执行。这在用户空间的上下文中根本不共享。位于磁盘上的二进制文件是共享的,因为它不会被第一次执行锁定。两个执行都会在内存中拥有自己的副本,并且两者都将具有单独的程序计数器,堆栈指针,变量等。 – alvits