archive 와 shared 라이브러리의 차이
안녕하세요..
최근 리눅스에서 프로그램을 만들고 있는데
같은 SDK를 archive/shared 라이브러리로 만들고
각각 만든 프로그램을 실행시켜보면
각 프로세스의 메모리 사용량이
archive 보다 shared가 더 많이 차지 합니다.
(shared을 경우 dlopen을 사용하진 않습니다.)
쉐어드 라이브러리를 이용해서 프로세스를 여러개 실행시키면
메모리 사용량이 줄어들지 않고 일정한 크기대로 계속 늘어 나는 것을 볼 수 있었습니다.
text영역이 공유라이브러리에서 공유 된다고 알고 있는데요.
메모리 영역을 보면 archive 는 text영역이 크고
shared는 text영역이 확 줄고 data영역이 큰데
어떠한 이유에서 커지는지 잘 모르겠습니다.
(보통 data영역은 초기화되지 않은 전역 변수가 들어가는 것으로 알고 있습니다...)
혹시 개인적으로 만든 라이브러리 컴파일 옵션이 잘못됐나 싶어
/usr/lib/pthread.a 와 .so로 테스트 해본 결과 똑같았습니다.
저도 책에서 봐온바로는 공유 라이브러리는 공유를 하기때문에 메모리 사용에 유리한 이점을 가지고 있다라고 알고 있었는데
제가 잘못 알고 있는지 그런 결과가 안나와서 이렇게 질문을 올립니다.
질문요약
1. shared library는 text영역이 확 줄고 data 부분이 늘어났는지 궁금합니다.
2. text영역이 줄어든 만큼 공유하는 영역이 줄긴 했지만 그부분이라도 공유가 되어 2번째 프로세스 부터는
메모리 사용량이 줄어야 될 것 같은데 왜 메모리가 일정하게 늘어나는지 궁금합니다.
3. 만약 메모리 사용량이 일정하게 늘어난다면 shared library를 사용하는 장점은 라이브러리 패치나 버그시에 프로그램을 컴파일 하지 않고
라이브러리만 컴파일 된다는 장점만 있는것인지 궁금합니다.
읽어주셔서 감사합니다.
참고
테스트 시에 main()내용은 .a .so 모두 같음.
elfread -S 을 사용해서 메모리 영역을 확인.
메모리 사이즈
./top RES 확인.
/proc/process id/status 에서 VmSize, VmRSS 확인.
댓글 달기