有人告诉我,一般来说,Linux 会避免加载同一个共享库的多个副本。我的问题实际上是关于这种机制有多强大。如果同一库的多个副本存在于系统的多个位置,它们会在内存中共享吗?如果您 dlopen()'d 库(与仅链接它),这有什么不同。
问问题
100 次
2 回答
1
使用对mmap(2)系统调用的多次调用来加载动态库(通过动态加载程序ld.so(8)或dlopen(3),通常使用来自 的代码) 。ld.so
通常,只读数据和代码是MAP_SHARED
. 因此 RAM(以及由 MMU 和内核强制执行的内存映射)在所有进程之间共享。
当然,真正重要的是-ed(或-ed)的inode 。所以同一个共享库的两个文件副本不会被共享。(最好使用符号链接)。mmap
execve
通过顺序读取可以了解进程1234的内存映射/proc/1234/maps
。例如,cat /proc/$$/maps
在终端中尝试。有关伪文件系统的详细信息,请参见proc(5) 。/proc/
也试试lsof
于 2013-09-14T19:13:06.823 回答
1
如果库作为磁盘上的多个文件存在,则它不是共享的,因为系统无法确定它们实际上是相同的。
于 2013-09-14T19:22:48.597 回答