2011-03-05 3 views
2

정적 라이브러리 10 개에 대해 연결 중입니다.정적 라이브러리 효과 메모리 사용 대신 공유 라이브러리를 사용합니까?

동적 라이브러리를 사용할 때 바이너리 파일 크기가 줄어들고 있습니다.

동적 라이브러리를 사용하면 메모리 사용량이 줄어들지 않습니다.

하지만 수석은 공유 라이브러리를 사용하면 메모리 사용량이 줄어들 것이라고 말했습니까? (동일한 실행 코드에 대해 여러 프로세스가 실행중인 경우)

해당 진술이 맞습니까?

그는 라이브러리에 사용 된 함수의 복사본이 중복되지 않으므로 메모리 사용량이 적을 것이라고 말했습니다. 그 프로세스의 n 인스턴스를 생성 할 때.

프로세스가 포크를 시작하면 10 명의 자식이됩니다. 그럼 정적 라이브러리 대신 동적 라이브러리를 사용하면 전체 메모리 사용량이 줄어 듭니까?

답변

8

, 동적 라이브러리가 많이 저장하지 않습니다. 최신 OS에서 프로세스를 포크하면 모든 페이지가 실제로 복사되지 않고 복사시 기록으로 표시됩니다. 따라서 귀하의 정적 라이브러리는 이미 귀하의 프로세스 사본 10 장 사이에서 공유됩니다.

그러나 저장할 수있는 곳은 동적 라이브러리가 다른 프로세스와 동일한 프로세스가 아닌 프로세스에서 공유되는 경우입니다. 따라서 다른 프로세스와 동일한 glibc.so를 사용하는 경우 두 프로세스는 관련이없는 프로세스이지만 glibc.so의 물리적 페이지를 공유합니다.

+0

하하. 우리의 답변이 얼마나 유사한 지 유쾌합니다. 이탤릭체로 된 단어 "different"까지 줄곧 있습니다. –

+0

글쎄, 그 대답은 정말 분명하다. :) –

+0

의심의 여지를 없애기위한 @thanks. :) –

4

주어진 프로세스를 포크하는 경우에는 대부분의 운영 체제에서 copy-on-write를 사용하기 때문에 차이가 없어야합니다. 즉, 페이지가 업데이트되면 페이지 만 복사되므로 공유 라이브러리의 코드 세그먼트와 같은 항목에 영향을 미치면 안됩니다.

다른 한편으로 프로세스는 정적으로 링크되어 있으면 코드를 공유 할 수 없습니다. libc를 고려해보십시오. 거의 모든 바이너리 링크가 ... 정적으로 링크되어 있으면 수십 개의 printf 복사본이 메모리에 저장됩니다.

중요한 이유가없는 한, 바이너리를 정적으로 링크해서는 안됩니다.

관련 문제