这是来自一个smaps文件:
b750d000-b76bc000 r-xp 00000000 08:01 918842 /lib/i386-linux-gnu/libc-2.23.so
我相信p
中的r-xp
表示它是私有的。为什么会这样?如果将每个.so文件的副本加载到不同进程的不同内存地址中,这是否会破坏共享库的目的?这种私人装载有什么优势?
答案 0 :(得分:0)
MAP_PRIVATE
对应man mmap
。 MAP_PRIVATE
声称:
rw-p
:创建私有写时复制映射。映射的更新对映射同一文件的其他进程不可见,并且不会传递到基础文件。 [...]
只要不进行修改,所有进程将共享此VMA的物理内存页面(它们也与内核缓存共享)。在给定流程中修改虚拟页面时,此流程的页面将被复制(取消共享)(写时复制)。
让我们来看看:
$ cat /proc/self/maps 00400000-0040c000 r-xp 00000000 08:11 529223 /bin/cat 0060b000-0060c000 r--p 0000b000 08:11 529223 /bin/cat 0060c000-0060d000 rw-p 0000c000 08:11 529223 /bin/cat [...]
第一个和第二个VMA是只读的。它们(通常)不会被修改,并且(通常)将被所有进程共享。
第三个VMA(arrayShuffle
)是可写的,但在一个进程中的修改必须在其他进程中也不可见。此VMA包含(可变)全局变量,这些变量不由不同进程共享。