malloc을 사용하여 대용량 메모리 영역을 할당 한 후 /proc/[pid]/maps 파일에서 힙 영역의 범위를 확인하려고합니다. 아래는 내가 작성한 코드입니다.대용량 메모리 할당의 경우 힙 영역이 표시되지 않는 이유는 무엇입니까?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
void *p = malloc(1024LL * 1024LL * 1024LL * 4);
if (p == NULL)
{
printf("alloc fail\n");
}
//else
//{
//printf("memory allocated at %p\n", p);
//}
while (1) sleep(1);
free(p);
return 0;
}
나는 검사 할 때 은/proc/[PID]/ 파일을 매핑, 힙 영역 표시의 매핑이 없습니다.
00400000-00401000 r-xp 00000000 08:01 20185722 /home/soumen/a.out
00600000-00601000 r--p 00000000 08:01 20185722 /home/soumen/a.out
00601000-00602000 rw-p 00001000 08:01 20185722 /home/soumen/a.out
7f19f98df000-7f1af98e0000 rw-p 00000000 00:00 0
7f1af98e0000-7f1af9a9f000 r-xp 00000000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7f1af9a9f000-7f1af9c9f000 ---p 001bf000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7f1af9c9f000-7f1af9ca3000 r--p 001bf000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7f1af9ca3000-7f1af9ca5000 rw-p 001c3000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7f1af9ca5000-7f1af9ca9000 rw-p 00000000 00:00 0
7f1af9ca9000-7f1af9ccf000 r-xp 00000000 08:01 23462295 /lib/x86_64-linux-gnu/ld-2.23.so
7f1af9ea4000-7f1af9ea7000 rw-p 00000000 00:00 0
7f1af9ecc000-7f1af9ece000 rw-p 00000000 00:00 0
7f1af9ece000-7f1af9ecf000 r--p 00025000 08:01 23462295 /lib/x86_64-linux-gnu/ld-2.23.so
7f1af9ecf000-7f1af9ed0000 rw-p 00026000 08:01 23462295 /lib/x86_64-linux-gnu/ld-2.23.so
7f1af9ed0000-7f1af9ed1000 rw-p 00000000 00:00 0
7ffe71fe1000-7ffe72002000 rw-p 00000000 00:00 0 [stack]
7ffe72094000-7ffe72096000 r--p 00000000 00:00 0 [vvar]
7ffe72096000-7ffe72098000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
지금은 코드의 다른 부분의 주석 하고 다시 실행하십시오. 이번에는 힙 영역이 /proc/[pid]/maps 파일에 나타납니다. 그러나 할당되는 것보다 훨씬 작습니다.
또한 할당 영역의 시작 주소는 /proc/[pid]/maps 파일에 표시된 힙 영역 제한 내에 속하지 않습니다.
프로그램 출력 :의
memory allocated at 0x7fcab87e2010
내용 은/proc/[PID] /지도 파일 그래서 OS가 여기에 무슨 짓을하고 있습니다
00400000-00401000 r-xp 00000000 08:01 20185722 /home/soumen/a.out
00600000-00601000 r--p 00000000 08:01 20185722 /home/soumen/a.out
00601000-00602000 rw-p 00001000 08:01 20185722 /home/soumen/a.out
00bba000-00bdb000 rw-p 00000000 00:00 0 [heap]
7fcab87e2000-7fcbb87e3000 rw-p 00000000 00:00 0
7fcbb87e3000-7fcbb89a2000 r-xp 00000000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7fcbb89a2000-7fcbb8ba2000 ---p 001bf000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7fcbb8ba2000-7fcbb8ba6000 r--p 001bf000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7fcbb8ba6000-7fcbb8ba8000 rw-p 001c3000 08:01 23462292 /lib/x86_64-linux-gnu/libc-2.23.so
7fcbb8ba8000-7fcbb8bac000 rw-p 00000000 00:00 0
7fcbb8bac000-7fcbb8bd2000 r-xp 00000000 08:01 23462295 /lib/x86_64-linux-gnu/ld-2.23.so
7fcbb8da7000-7fcbb8daa000 rw-p 00000000 00:00 0
7fcbb8dcf000-7fcbb8dd1000 rw-p 00000000 00:00 0
7fcbb8dd1000-7fcbb8dd2000 r--p 00025000 08:01 23462295 /lib/x86_64-linux-gnu/ld-2.23.so
7fcbb8dd2000-7fcbb8dd3000 rw-p 00026000 08:01 23462295 /lib/x86_64-linux-gnu/ld-2.23.so
7fcbb8dd3000-7fcbb8dd4000 rw-p 00000000 00:00 0
7fff2df8f000-7fff2dfb0000 rw-p 00000000 00:00 0 [stack]
7fff2dfec000-7fff2dfee000 r--p 00000000 00:00 0 [vvar]
7fff2dfee000-7fff2dff0000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
? malloc은 메모리 할당이 참조 될 때까지 메모리 할당을 연기 할 수 있습니까? 내가
리눅스 nightfury 4.4.0-78-일반적인 # 99 - 우분투 SMP 목 4월 27일 세계 협정시 15시 29분 9초 2017 x86_64에의 x86_64에의 x86_64의 GNU/리눅스
을 사용하고
구성 GCC (우분투 5.4.0-6ubuntu1 ~ 16.04.4) 5.4.0 20160609
할당 및 무료가 최적화되지 않았습니까? 컴파일러라면 그렇게 할 수 있습니다. :) –
메모리 관리자가 처음 사용할 때 메모리를 할당 할 수 있습니다. 코드에'memset' 호출을 추가하십시오. – Ari0nhh
큰 할당은 glibc의'malloc'에 의해'mmap'을 통해 직접적으로 제공됩니다. 이것은 설명 일 수 있습니다. (아마도 printf로 볼 수있는 힙이 어쨌든 사용됩니다.) –