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: 다음과 같습니다.malloc
s 요구사항은 미리 저장된 공간에서 충족될 수 있습니다. 그래서 이 mallocs는 실제로 전화를 하지 않았습니다.brk
, 그것은 에 있어서 최적화입니다.malloc
. 다음 번에 해당 경계를 넘어 크기를 조정하려면, 새로운brk
다은우)).mmap
임계값).
언급URL : https://stackoverflow.com/questions/30542428/does-malloc-use-brk-or-mmap
'programing' 카테고리의 다른 글
프로그래밍 방식으로 스프링 부트 응용 프로그램 다시 시작 / 스프링 컨텍스트 새로 고침 (0) | 2023.09.14 |
---|---|
지정되지 않은 크기의 배열에 대한 포인터(*p)[]"C++에서는 불법이지만 C에서는 합법입니다. (0) | 2023.09.14 |
문자열 변수에 추가 (0) | 2023.09.14 |
wocommerce에 등록하고 로그인 페이지로 리디렉션할 때 자동 로그인을 방지하시겠습니까? (0) | 2023.09.14 |
핀터레스트 '핀잇' 워드프레스 블로그 텍스트 전용 숏코드 링크 (0) | 2023.09.14 |