2012-06-25 2 views
3

glibc의 malloc 구현은 응용 프로그램이 사용되지 않는 (즉, 해제 된 메모리 청크) 시스템을 다시 릴리스 할 수 있도록하는 malloc_trim() 호출을 지원합니다 (구현 세부 사항 : 음수 인수로 sbrk()를 호출하면 프로그램의 데이터 세그먼트가 축소됨)). 그러나이 기능은 주요 영역에서만 작동합니다. 다중 스레드 프로그램에서 해제 된 청크를 유지하는 여러 영역이 있습니다. 이 호출이 다른 경기장에서도 메모리를 해제하지 않는 이유는 무엇입니까?malloc_trim()이 주 영역에서만 작동하는 이유는 무엇입니까?

+1

아마도 할당 된 것보다 다른 영역에서 메모리를 비우는 것이 좋지 않기 때문에 ... 힙 상단의 메모리 만 비울 수 있습니다. – AJG85

답변

2

메인 이외의 아레나는 mmap을 사용하여 시스템에서 할당되므로 sbrk을 사용하여 시스템에 메모리를 반환 할 수 없습니다. glibc가 mremap을 사용하여 이러한 다른 영역을 축소 할 수 있습니다. 또한 malloc_trim은 경기장 끝에서 메모리 만 반환 할 수 있습니다. 경기장 중간에 빈 블록이 있으면 해당 메모리를 해제 할 방법이 없습니다.

+0

Geoff, 답장을 보내 주셔서 감사합니다. 나는 이것을 glibc 코드에서 연구 중이며,이 질문을 내가 찾은 것에 대한 대답으로 업데이트 할 것이다. – Specksynder

+0

Geoff, 감사합니다. 당신의 대답은 정확합니다. 'sbrk'는 프로그램의 데이터 세그먼트 만 줄이기 위해 사용할 수 있으므로 malloc_trim은 거기에있는 주요 영역에서만 작동합니다. – Specksynder

관련 문제