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가 특정 프로세스에 의해 두 번 이상로드 되었습니까?

답변

3

사실, 각 라이브러리는 한 번만로드됩니다. 당신이보고있는 것은 다중 라이브러리 각 라이브러리에 의해 사용되는입니다.

라이브러리에는 코드, 막대 데이터 및 데이터 (+ bss)가 들어 있습니다. 코드는 읽기 전용으로 실행 가능하며 (r-x), rodata는 읽기 전용 (r--)이고 데이터 (및 bss)는 읽기 - 쓰기 (rw-)입니다. 이들은보고있는 메모리 세그먼트입니다 (모든 메모리 보호 플래그와 크기가 다릅니다). 모든 라이브러리에 이러한 세그먼트가 모두있는 것은 아니므로 일부 라이브러리에는 매핑 된 메모리 영역이 두 개 (또는 심지어 한 개) 여야합니다.

pmap의 "total"출력은 가상 메모리 사용 만 측정합니다 (작은 프로세스 일지라도 매우 높음). 실제 메모리 사용의 경우 pmap -x을 사용하고 RSS (상주 세트 크기)을 살펴보십시오.

+0

코드 섹션을 두 번 이상 추가 할 수 없으므로 커널에 코드 세그먼트 사본이 하나만 있기 때문에 메모리 사용량을 표시하는 것은 좋지 않습니다. –

+1

실제로 코드 섹션은'MAP_PRIVATE'에 매핑 될 수 있습니다 ('MAP_SHARED' 대신에) COW 의미론을 사용합니다. 이렇게하면 링커는 코드 섹션 내에서로드 된 실행 파일에만 영향을주는 재배치를 수행 할 수 있습니다 (재배치는 라이브러리가로드되는 위치에 따라 다르기 때문에). 따라서 기술적으로 코드 섹션은 공유되지 않을 수 있습니다. – nneonneo

+0

흥미로운 - 왜 CODE 섹션을 써야합니까? –