小编典典

共享库地址空间

linux

在研究共享库时,我读了一条声明

尽管共享库的代码在多个进程之间共享,但其变量却不是。使用该库的每个进程都有其在库中定义的全局变量和静态变量的副本。

我对此几乎没有疑问。

  1. 每个进程的代码部分是否在单独的地址空间中?
  2. 共享库代码部分是否在某些全局(唯一)地址空间中。

我只是一个初学者,所以请帮助我理解。

谢谢!


阅读 424

收藏
2020-06-07

共1个答案

小编典典

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

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

要回答您的具体观点:

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