2012-09-21 34 views
0
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會被加載多於多次?是需要的嗎?爲什麼?爲什麼這樣的lib被某個進程加載了一次以上?

回答

3

實際上,每個庫只加載一次;你看到的是每個庫使用的多個內存區域

庫包含代碼,rodata和數據(+ bss)。代碼是隻讀和可執行的(r-x),數據只讀(r--),數據(和bss)是可讀寫的(rw-)。這些是您正在查看的內存段(請注意,它們都有不同的內存保護標誌和大小)。並非所有庫都具有所有這些段,因此您會發現某些庫只映射了兩個(或甚至一個)內存區域。

請注意,pmap的「總計」輸出僅測量虛擬內存利用率(即使對於小型進程也可能非常高)。對於物理內存使用,請使用pmap -x並查看RSS(常駐集大小)。

+0

您可以添加代碼段不會多次加載,因爲內核只有一個代碼段副本 –

+1

實際上,代碼段可能被映射爲MAP_PRIVATE(而不是'MAP_SHARED'),但是使用COW語義。這允許鏈接程序在代碼段中執行重定位,隻影響其加載的可執行文件(因爲重定位取決於加載庫的位置)。所以,從技術上講,代碼段可能不會被共享。 – nneonneo

+0

有趣 - 爲什麼代碼部分也需要寫出來? –

相關問題