programing

malloc()는 brk() 또는 mmap()을 사용합니까?

muds 2023. 9. 14. 00:03
반응형

malloc()는 brk() 또는 mmap()을 사용합니까?

c 코드:

// program break mechanism
// TLPI exercise 7-1

#include <stdio.h>
#include <stdlib.h>

void program_break_test() {
    printf("%10p\n", sbrk(0));

    char *bl = malloc(1024 * 1024);
    printf("%x\n", sbrk(0));

    free(bl);
    printf("%x\n", sbrk(0));

}

int main(int argc, char **argv) {
    program_break_test();
    return 0;
}

다음 코드를 컴파일할 때:

 printf("%10p\n", sbrk(0));

경고 팁을 받습니다.

format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’

질문 1:그럴까요?


그리고 난 후에malloc(1024 * 1024), 프로그램 브레이크가 바뀌지 않은 것 같습니다.

출력은 다음과 같습니다.

9b12000
9b12000
9b12000

질문 2: 프로세스는 추후 사용을 위해 시작할 때 힙에 메모리를 할당합니까?아니면 컴파일러가 할당할 시점을 바꿉니다.그렇지 않으면, 왜?


[update] 요약 : brk() 또는 mmap()

TLPI와 체크맨 페이지(TLPI 저자의 도움을 받아)를 검토한 결과, 이제 어떻게 하는지 이해합니다.malloc()사용하기로 결정함brk()아니면mmap(), 다음과 같이

mallopt()의 동작을 제어하기 위한 매개 변수를 설정할 수 있습니다.malloc(), 그리고 이름이 붙은 매개변수가 있습니다.M_MMAP_THRESHOLD, 일반적으로:

  • 요청된 메모리가 그 메모리보다 작을 경우,brk()사용됩니다.
  • 요청된 메모리가 메모리보다 크거나 같으면,mmap()사용됩니다.

매개 변수의 기본값은128kb(내 시스템에서는) 하지만 테스트 프로그램에서는 1Mb를 사용했습니다.mmap()선택되었습니다, 요청된 메모리를 32kb로 변경했을 때,brk()사용될 것입니다.

책은 TLPI 147쪽과 1035쪽에서 그 부분을 언급했는데 그 부분을 잘 읽지 않았습니다.

매개 변수에 대한 자세한 정보는 다음에 대한 man page에서 확인할 수 있습니다.mallopt().

우리가 프로그램을 바꿔서 어디에 있는지 확인하면,malloc'd 메모리는:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void program_break_test() {
  printf("%10p\n", sbrk(0));

  char *bl = malloc(1024 * 1024);
  printf("%10p\n", sbrk(0));
  printf("malloc'd at: %10p\n", bl);

  free(bl);
  printf("%10p\n", sbrk(0));

}

int main(int argc, char **argv) {
  program_break_test();
  return 0;
}

아마도 그것이 좀 더 명확할 것입니다.sbrk변하지 않을 겁니다우리에게 준 기억은malloc전혀 다른 위치로 매핑되고 있습니다.

사용할 수도 있습니다.strace리눅스 상에서 어떤 시스템 호출이 이루어지는지 확인하고 그것을 알아봅니다.malloc사용중입니다.mmap할당을 수행하는데 필요가 있습니다.

malloc사용에 제한되지 않습니다.sbrk메모리를 할당합니다.예를 들어, 사용할 수도 있습니다.mmap대형 지도를 그리다MAP_ANONYMOUS메모리 블록; 정상적으로mmap는 데이터 세그먼트에서 멀리 떨어진 가상 주소를 할당합니다.

다른 가능성도 있습니다.특히.malloc, 표준 라이브러리의 핵심 부분이 되는 것은 그 자체가 표준 라이브러리 기능에만 국한되는 것이 아닙니다. 운영 체제별 인터페이스를 사용할 수 있습니다.

사용하는 경우malloc당신의 코드에서, 그것은 전화할 것입니다.brk()처음에는 힙에서 0x21000 바이트를 할당했습니다. 이것이 인쇄한 주소입니다. 그래서 질문 1: 다음과 같습니다.mallocs 요구사항은 미리 저장된 공간에서 충족될 수 있습니다. 그래서 이 mallocs는 실제로 전화를 하지 않았습니다.brk, 그것은 에 있어서 최적화입니다.malloc. 다음 번에 해당 경계를 넘어 크기를 조정하려면, 새로운brk다은우)).mmap임계값).

언급URL : https://stackoverflow.com/questions/30542428/does-malloc-use-brk-or-mmap

반응형