【问题标题】:When a dll is loaded into memory, which part(s) can be shared between processes?当 dll 加载到内存中时,哪些部分可以在进程之间共享?
【发布时间】:2016-06-14 03:13:40
【问题描述】:

我遇到一个关于面试测试的问题:

When a dll is loaded into memory, which part(s) can be shared between processes?
A. code segment
B. static variable global variable
C. external difinitions and references for linking
D. BSS segment

谁能给我一个答案和清楚的解释?

【问题讨论】:

    标签: dll operating-system


    【解决方案1】:

    进程实际上是在操作系统中运行多个线程的独立程序。通常操作系统策略说,所有进程都是相互隔离的内存。

    代码段[未共享]
    BSS 和静态字段[未共享]
    原因很简单,为什么操作系统允许进程A访问进程B的二进制文件?那是违反安全和内存保护的行为。进程 A 可能会损坏进程 B 的内存(如果给定了写访问权限)。

    外部定义呢?
    有趣的部分来了,外部定义可以静态或动态链接。
    静态链接库意味着定义在编译时链接,并且程序二进制文件包含它的机器代码。
    动态链接意味着定义在用户命令加载内存中的任何程序之后链接。操作系统调用动态库加载器,通过提供共享对象的路径来解析程序的外部依赖。
    这个共享对象被操作系统缓存在不同的页框中,每次程序需要这个库时,它只是简单地将它的页框复制到进程的虚拟内存中;并进行所需的动态链接。这样,多个进程具有单个库的相同二进制文件。
    它节省了 RAM 内存和从磁盘加载库的时间,而且动态链接减少了程序的二进制大小。
    操作系统也可能选择再次从磁盘加载库,从而制作同一个库的两个副本。这是动态链接操作的一部分。我不会更深入,但如果你真的很感兴趣 https://en.wikipedia.org/wiki/Dynamic_linker 或者只是在 cmets 部分联系我。
    但是关于 BSS 和静态字段,又是不共享的;每当在此类区域(共享)上执行写操作时。操作系统为其他进程创建该区域的新副本。这样可以确保两个进程都有自己的 BSS 和静态字段副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      相关资源
      最近更新 更多