玩strace
,在我看来,ld.so.cache
几乎libc.so.6
每个进程都打开并映射到内存。至少我尝试过的那些过程。这不是意味着这些进程被多次映射到进程内存中吗?
当然,这些文件非常小,但是这不是有点浪费内存吗?
strace 输出显示这些正在使用MAP_PRIVATE
set 进行映射,这使其成为写时复制,但似乎每个进程都有一个新映射。
我的问题:
- 我是否正确理解正在发生的事情?也就是说,是否真的有这些文件的新副本映射到每个需要它们的进程(似乎是每个进程)的内存中?
- 是否正在进行某种类型的内存共享?也就是说,由于映射是写时复制,是否有很多进程在查看相同的物理内存位置?
是的,每个进程都有自己的所需库映射。
是的,大部分数据是共享的,所以每个进程“看到”相同的物理内存(在不同的线性地址),假设每个文件的相同版本是共享的。
maps
您可以通过查看每个进程/proc/
目录中的文件来查看各种映射;因为libc
你会看到诸如或者
只读的、可执行的映射对应于库中的共享可执行代码;只读映射允许访问库中共享的只读数据;读写映射是库中变量的私有映射。正如您在上面看到的,线性地址是不同的(由于地址空间布局随机化和不同的加载顺序);共享部分的底层物理地址是相同的,一旦它们被加载到内存中(因为映射映射底层文件,而不是直接映射共享内存)。