共享库地址空间

时间:2011-11-07 09:17:29

标签: c++ linux shared-libraries

在我学习共享库时,我读了一个声明

  

虽然共享库的代码是在多个库之间共享的   进程,其变量不是。每个使用该库的进程   拥有自己定义的全局变量和静态变量的副本   在图书馆内。

我只是怀疑。

  1. 每个进程的代码部分是否在单独的地址空间中?
  2. 共享库代码部分是否在某些全局(唯一)地址空间中。
  3. 我只是一个首发,所以请帮助我理解。

    谢谢!

1 个答案:

答案 0 :(得分:20)

通过将文件内存映射到进程的地址空间的某些部分,将共享库加载到进程中。当多个进程加载相同的库时,操作系统只是让它们共享相同的物理RAM。

可以修改的库的部分(例如静态全局变量)通常以写时复制模式加载,因此当尝试写入时,发生页面错误,内核通过将受影响的页面复制到RAM的另一个物理页面(仅适用于该进程),映射重定向到新页面,最后写入操作完成。

回答您的具体问题:

  1. 所有进程都有自己的地址空间。进程之间共享物理内存对于每个进程都是不可见的(除非他们故意通过共享内存API这样做)。
  2. 所有数据和代码都存在于物理RAM中,这是一种地址空间。但是,您可能看到的大多数地址都是属于一个或另一个进程的地址空间的虚拟内存地址,即使该“进程”是内核。