malloc을 호출한 후 brk 포인터는 어떻게 커지나요?

malloc을 호출한 후 brk 포인터는 어떻게 커지나요?

brk저는 Linux와 C를 처음 접했고 malloc을 호출한 후 포인터가 어떻게 커지는지 묻고 싶었습니다 . 우리는 커널이 힙의 상단을 가리키는 brk 포인터를 유지한다는 것을 알고 있습니다. 요청된 메모리 할당을 호출할 때 사용 가능한 여유 블록이 없다고 가정 malloc하고 내부 malloc호출에 대해 알고 있습니다. mmap내 질문은 다음과 같습니다.

Q1 - malloc내부적으로 호출되면 시작 주소가 실제로 첫 번째 인수로 전달됩니다. 예를 들면 다음과 같습니다.mmapmallocbrkmmap

//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.

  1. malloc실제로 기본 주소 없이 호출되면 mmap커널 에 할당을 위임합니다(정렬 제약 조건을 고려하여 요청된 크기를 조정한 후). 메모리는 기존 힙과 연속될 mmap필요가 없으며 mmap다른 할당에 재사용될 수 있습니다.

  2. mmap만지지 마세요 brk. malloc결국 사용하지 않는다면 직접 mmap호출하세요 sbrk.진행상태malloc파일 상단의 주석에 자세히 설명되어 있습니다. 코드를 따르려면 함수를 찾아 sysmalloc해당 코드의 mmapis MMAP및 is 를 기억하세요 sbrk.MORECORE

관련 정보