有人告诉我,一般来说,Linux 会避免加载同一个共享库的多个副本。我的问题实际上是关于这种机制有多强大。如果同一库的多个副本存在于系统的多个位置,它们会在内存中共享吗?如果您 dlopen() 了库(与仅链接它相比),这有什么不同吗?
最佳答案
通过多次调用 ld.so(8) 来加载动态库(通过动态加载器 dlopen(3) 或通过 mmap(2) ,它通常使用 ld.so
中的代码)。系统调用。
通常,只读数据和代码是 MAP_SHARED
。因此 RAM(以及 MMU 和内核强制执行的内存映射)在所有进程之间共享。
当然,真正重要的是 inode这是 mmap
-ed(或 execve
-ed)。因此,不会共享同一共享库的两个文件副本。 (最好使用符号链接(symbolic link))。
顺序阅读/proc/1234/maps
即可了解进程1234的内存映射。例如,在终端中尝试 cat/proc/$$/maps
。参见 proc(5)有关 /proc/
伪文件系统的详细信息。也试试 lsof
关于linux - 如果同一个共享库被不同的应用程序和不同的目录加载,它是否在内存中共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18803095/