在我学习共享库的时候,我读到了一句话:
尽管共享库的代码被多个进程共享,但它的变量并不被共享。使用该库的每个进程都有自己的全局和静态变量的副本,这些变量在库中定义。
我只有几个疑问。
- 每个进程的代码部分是否在单独的地址空间中?
- 共享库的代码部分是否在某个全局(唯一)地址空间中?
我是一个初学者,请帮助我理解。
谢谢!
在我学习共享库的时候,我读到了一句话:
尽管共享库的代码被多个进程共享,但它的变量并不被共享。使用该库的每个进程都有自己的全局和静态变量的副本,这些变量在库中定义。
我只有几个疑问。
我是一个初学者,请帮助我理解。
谢谢!
共享库通过将文件映射到进程地址空间的某个部分来加载到进程中。当多个进程加载同一个库时,操作系统只需让它们共享同一块物理内存。
可修改的库部分(例如静态全局变量)通常以写时复制模式加载,因此当尝试进行写操作时,会发生页面错误,内核通过将受影响的页面复制到另一个物理内存页面(仅针对该进程),重新映射到新页面,然后才最终完成写操作。
回答您的具体问题: