【问题标题】:In linux, is there sharing of executable binary between two processes running the same user program?在 linux 中,运行相同用户程序的两个进程之间是否共享可执行二进制文件?
【发布时间】:2016-11-05 01:41:08
【问题描述】:

我知道对于 DLL,可执行文件在进程之间共享。但是对于用户定义的程序,当我在两个终端上运行“测试”时,我们称之为“测试”。程序可执行文件是否将为这两个进程共享,或者每个进程都有一个单独的副本?谢谢。

【问题讨论】:

  • 如果它们的进程ID不同,我认为可执行代码也会不同。
  • 您的问题含糊不清。一提到DLL,就会想到共享对象。在 Linux 中,它等同于 *.so 文件。这些共享对象在针对它编译用户程序或用户程序加载它时被加载到内存中。但是你跟进了两个同时执行的程序。在用户空间的上下文中,这根本不是共享的。位于磁盘上的二进制文件是共享的,因为它没有被第一次执行独占锁定。两次执行都会在内存中拥有自己的副本,并且都有独立的程序计数器、堆栈指针、变量等。

标签: linux


【解决方案1】:

首先将文件复制到内核的页面缓存中。当它已经存在时,第二次运行将使用这个缓存的。每个文件一个缓存。

【讨论】:

  • 我认为您指的是数据缓存。程序的加载方式不同。每个实例都会有自己的程序计数器、堆栈指针等。实际上,调用fork()clone() 会复制进程,所有内容都会被复制,但往前走每个都会有自己的副本。
【解决方案2】:

文本部分是共享的(代码),堆是不共享的。

无论从磁盘加载什么,都会共享磁盘缓存。

@alvits 说堆将在 fork 上复制是对的,但它是通过写时复制 (COW) 完成的,这意味着它在需要时复制,如果数据没有改变,它不会占用新的内存。

这个答案类似:how is a shared library file called by two different processes in Linux?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多