如果两个应用程序之间有共享库,那么每个应用程序是否在运行时使用它自己的库副本?如果他们使用相同的库实例,那么库中的全局变量会发生什么?
答案 0 :(得分:3)
这取决于操作系统。在大多数类Unix系统中,共享库使用与位置无关的代码,因此代码段(保存指令和只读变量)使用的内存可以在进程之间共享,但每个进程仍然有自己的数据段(持有其他变量)。
答案 1 :(得分:2)
对于类Unix操作系统,当您第一次执行应用程序时,映射库地址空间的两个进程的页表将指向加载库的内存中的相同帧。
但是,映射库的数据部分的页表是使用Copy on Write
机制处理的。一旦您尝试编写全局变量,操作系统将创建包含该变量的页面的特定于进程的副本,并相应地重新映射该过程的页表。
答案 2 :(得分:1)
每个程序在其自己的内存空间中创建库的新实例。它们不共享,2个程序不会看到彼此的数据。
看看如何加载动态库:http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries
静态链接库也是如此,除了不是在运行时加载,它们在编译时链接。