当dll加载到内存中时,哪些部分可以在进程之间共享?

时间:2016-06-14 03:13:41

标签: dll operating-system

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

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

谁可以给我一个答案和明确的解释?

1 个答案:

答案 0 :(得分:0)

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

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

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