![malloc을 호출한 후 brk 포인터는 어떻게 커지나요?](https://linux55.com/image/180618/malloc%EC%9D%84%20%ED%98%B8%EC%B6%9C%ED%95%9C%20%ED%9B%84%20brk%20%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%8A%94%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%BB%A4%EC%A7%80%EB%82%98%EC%9A%94%3F.png)
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