有玩strace,这在我看来,ld.so.cache和libc.so.6打开和映射到内存,几乎每一个过程。至少我尝试过的那些过程。这不是说这些进程被多次映射到进程内存中吗?
当然,这些文件很小,但这不是有点浪费内存吗?
strace 输出显示这些正在使用MAP_PRIVATEset进行 mmap'ed ,这使得它在写时复制,但每个进程似乎仍然有一个新的映射。
我的问题:
是的,每个进程都有它自己需要的库的映射。
是的,大部分数据是共享的,因此假设每个文件的相同版本是共享的,每个进程“看到”相同的物理内存(在不同的线性地址)。
您可以通过查看maps每个进程/proc/目录中的文件来查看各种映射;因为libc你会看到诸如
7f1014062000-7f10141f7000 r-xp 00000000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f10141f7000-7f10143f7000 ---p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f10143f7000-7f10143fb000 r--p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f10143fb000-7f10143fd000 rw-p 00199000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
Run Code Online (Sandbox Code Playgroud)
或者
7f4d7a8ec000-7f4d7aa81000 r-xp 00000000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7aa81000-7f4d7ac81000 ---p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7ac81000-7f4d7ac85000 r--p 00195000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7ac85000-7f4d7ac87000 rw-p 00199000 fd:0d 1444681 /lib/x86_64-linux-gnu/libc-2.24.so
Run Code Online (Sandbox Code Playgroud)
只读、可执行映射对应库中共享的可执行代码;只读映射允许访问库中共享的只读数据;读写映射是库中变量的私有映射。正如你在上面看到的,线性地址是不同的(由于地址空间布局随机化,以及不同的加载顺序);共享部分的底层物理地址是相同的,一旦它们被加载到内存中(因为映射映射底层文件,而不是直接共享内存)。
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |