2012-07-25 2 views
2

저는 응용 프로그램의 메모리 사용량을 줄이려고했습니다. 이전 질문에서 계속 : GDB - can I find large data elements in memory 나는 가장 큰 범인의 대부분을 찾아서 제거했습니다.정적 데이터 (.bss)는 언제 할당됩니까?

nm --size-sort은 실행 파일의 .bss 섹션에서 큰 항목을 찾는 데 매우 중요했습니다.

pmap에 표시된 메모리 사용 공간이 매우 많이 감소했습니다. 그러나 다른 시스템 (Ubuntu Pangolin, gcc 4.6.3)에서이 작업을 계속하는 동안, 나는 실행중인 프로세스의 메모리 사용량이 .bss 크기보다 훨씬 적으며 확실히 적당하다는 것을 알았습니다.

디버거를 통해 코드를 실행하면 .bss 섹션의 가장 큰 기호가 데이터에 액세스 할 때까지 실제로 할당되지 않은 것처럼 보입니다 (즉, 큰 기호 중 하나에서 배열 요소를 설정할 수 있습니다. 메모리 사용량은 16MB 증가 함).

.bss 섹션은 0으로 초기화되었으므로 가상 주소 공간을 할당하는 구현을 쉽게 상상할 수 있지만 실제 메모리가 사용될 때까지 실제로 할당하지는 않습니다.

이것은 실제 행동의 차이점입니까, 아니면 시스템 간의보고 차이입니까?

답변

3

리눅스에서 초기화되지 않은 페이지는 모두 메모리의 동일한 "제로화 된"물리적 페이지에 매핑됩니다. 쓰기 중 복사 (copy-on-write) 방법을 사용하면 해당 페이지의 메모리에 쓸 때 페이지가 복사되고 새 페이지에 다시 매핑되므로 응용 프로그램의 메모리 사용량이 증가합니다. 이런 소리가 나는 것은 당신이 생각하는대로 일어나는 일입니다. 이것은 모든 Linux 배포판에 적용됩니다.

+0

매우 합리적입니다. 나는 이것이 얼마나 오랫동안 사실인지 당신이 알고 있다고 생각하지 않습니까? 엄청난 메모리 사용량을 보여주는 시스템은 2007 년 (SLES 10.1)입니다. – asc99c

+0

리눅스는 이와 같이 제로 페이지를 오랫동안 처리해 왔습니다. 공유 된 ZERO_PAGE는 리눅스 2.4에 존재하며 페이지 폴트 핸들러의 copy-on-write 지원도 마찬가지이다. – ncultra

관련 문제