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
'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 |