c++ - 共享库地址空间

标签 c++ linux shared-libraries

当我在研究共享库时,我读到一个声明

Although the code of a shared library is shared among multiple processes, its variables are not. Each process that uses the library has its own copies of the global and static variables that are defined within the library.

我几乎没有怀疑。

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

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

谢谢!

最佳答案

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

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

回答您的具体问题:

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

关于c++ - 共享库地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8034579/

相关文章:

linux - 使用bash脚本,从文件夹中的文件名获取日期列表,列出日期,列出后缀

gcc - 从 LD 隐藏共享对象中的符号

C++ 共享库到 main.cpp

linux - 动态链接尝试全部产生静态链接的二进制文件?为什么?

c++ - 是否可以与OpenMP并行处理一个列表,该列表可以在每次迭代时添加新元素?

c++ - C++ for循环太慢

linux - 如何使用带有管道概念的排序和复制命令?

c++ - 使用常量和非常量函数 - C++

c++ - 2D引擎的场景图

Linux 内核模块 makefile 问题