brk
저는 Linux와 C를 처음 접했고 malloc을 호출한 후 포인터가 어떻게 커지는지 묻고 싶었습니다 . 우리는 커널이 힙의 상단을 가리키는 brk 포인터를 유지한다는 것을 알고 있습니다. 요청된 메모리 할당을 호출할 때 사용 가능한 여유 블록이 없다고 가정 malloc
하고 내부 malloc
호출에 대해 알고 있습니다. mmap
내 질문은 다음과 같습니다.
Q1 - malloc
내부적으로 호출되면 시작 주소가 실제로 첫 번째 인수로 전달됩니다. 예를 들면 다음과 같습니다.mmap
malloc
brk
mmap
//not 100% correct onlyfor demo purpose
// void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
void *malloc(size_t size){
...
mmap(brk, size,...);
... //line x
}
Q2 - 내부의 다른 코드 섹션(위의 x번째 줄 뒤)이 커지 malloc
나요 brk
? 아니면 mmap
내부적으로 성장하게 놔두나요 brk
?
답변1
세부 사항은 구현에 따라 다르지만 malloc
적어도 Doug Lea의 구현(GNU C 라이브러리에서 기본적으로 사용되는 구현)에서는 독립적으로 사용 mmap
됩니다 sbrk
.
malloc
실제로 기본 주소 없이 호출되면mmap
커널 에 할당을 위임합니다(정렬 제약 조건을 고려하여 요청된 크기를 조정한 후). 메모리는 기존 힙과 연속될mmap
필요가 없으며mmap
다른 할당에 재사용될 수 있습니다.mmap
만지지 마세요brk
.malloc
결국 사용하지 않는다면 직접mmap
호출하세요sbrk
.진행상태malloc
파일 상단의 주석에 자세히 설명되어 있습니다. 코드를 따르려면 함수를 찾아sysmalloc
해당 코드의mmap
isMMAP
및 is 를 기억하세요sbrk
.MORECORE