有一个类似于这个的问题,但没有针对静态, const 数据(只读数据)和linux系统的答案。 情况就是这样: 系统上的许多程序正在使用共享库。该共享库具有大量的const数据。对于链接到(并使用)共享库的每个进程,是否会在系统内存中复制const数据? 我理解(或者我认为)共享库的大小是在“高”级别对其进行计数,但掩盖下的 Linux将不会交换可执行部分的重复副本。这对静态(名称空间级别)const数据也是如此吗?
答案 0 :(得分:5)
如果共享对象libNNN.so
在只读片段中有数据(例如来自.rodata
或.text
部分),则该片段为mmap - 带{ {1}} MAP_SHARED
或dlopen
所以使用该只读数据的不同进程(加载ld.so
)确实共享包含它的物理RAM。
静态或全局读写数据将进入libNNN.so
读写MAP_PRIVATE
- ed段(来自mmap
或.bss
部分),因此每个进程都有它自己的(仍在写时复制)。
使用.data
查找objdump
使用libNNN.so
或pmap
了解pid 1234进程的内存映射。(从应用程序内部,如果需要,依次阅读/proc/1234/maps
或/proc/self/maps
你想测量。)
注意到C中的/proc/self/statm
事物经常进入const
,但是对于C ++构造的数据,情况就不再是这样了