【问题标题】:why so lib is loaded more than one time by certain process?为什么某些进程会多次加载lib?
【发布时间】:2012-09-21 04:58:45
【问题描述】:
b7f27000     84K r-x--  /lib/libpthread-2.5.so
b7f3c000      4K -----  /lib/libpthread-2.5.so
b7f3d000      4K r----  /lib/libpthread-2.5.so
b7f3e000      4K rw---  /lib/libpthread-2.5.so
b7f3f000      8K rw---    [ anon ]
b7f41000     88K r-x--  /lib/libselinux.so.1
b7f57000      8K rw---  /lib/libselinux.so.1
b7f59000    256K r-x--  /usr/lib/libncurses.so.5.5
b7f99000     32K rw---  /usr/lib/libncurses.so.5.5
b7fa1000      8K rw---    [ anon ]
b7fa3000      4K r----  /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
b7fa4000      4K r----  /usr/lib/locale/en_US.utf8/LC_PAPER
b7fa5000      4K r----  /usr/lib/locale/en_US.utf8/LC_NAME
b7fa6000      4K r----  /usr/lib/locale/en_US.utf8/LC_ADDRESS
b7fa7000      4K r----  /usr/lib/locale/en_US.utf8/LC_TELEPHONE
b7fa8000      4K r----  /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
b7fa9000      4K r----  /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
b7faa000    108K r-x--  /lib/ld-2.5.so
b7fc5000      4K r----  /lib/ld-2.5.so
b7fc6000      4K rw---  /lib/ld-2.5.so
bf96f000    228K rw---    [ stack ]
 total    23740K

为什么这些 lib 的加载时间超过了?有必要吗?为什么?

【问题讨论】:

    标签: linux memory-management loadlibrary shared-libraries pmap


    【解决方案1】:

    实际上,这些库中的每一个都只加载一次;您看到的是每个库使用的多个内存区域

    库包含代码、rodata 和数据 (+bss)。代码是只读且可执行的 (r-x),rodata 是只读的 (r--),数据(和 bss)是可读写的 (rw-)。这些是您正在查看的内存段(请注意,它们都有不同的内存保护标志和大小)。并非所有库都具有所有这些段,因此您会看到一些库只有两个(甚至一个)映射的内存区域。

    请注意,pmap 的“总”输出仅测量虚拟内存利用率(即使对于小型进程也可能非常高)。对于物理内存使用,请使用pmap -x 并查看RSS(驻留集大小)。

    【讨论】:

    • 你能不能添加代码段没有多次加载所以这不是显示内存使用情况的好方法,因为内核只有一个代码段的副本
    • 其实代码部分可以映射为MAP_PRIVATE(而不是MAP_SHARED),但是使用COW语义。这允许链接器在仅影响加载它的可执行文件的代码段内执行重定位(因为重定位取决于加载库的位置)。因此,从技术上讲,代码部分可能不会被共享。
    • 有趣——为什么还要写 CODE 部分?
    • 动态重定位。共享库在运行时加载,并且可能包含对其他库或符号的引用。过程映像包含这些符号的占位符,动态链接器(例如ld.so 在动态链接期间查找符号。
    • 谢谢,我明白了——我也明白我的深度不够 ;-) 这里 EOT
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2016-03-28
    • 2021-11-23
    • 2014-04-20
    • 2020-02-15
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多