2017-05-24 3 views
2

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은 메모리 할당이 참조 될 때까지 메모리 할당을 연기 할 수 있습니까? 내가

  1. 리눅스 nightfury 4.4.0-78-일반적인 # 99 - 우분투 SMP 목 4월 27일 세계 협정시 15시 29분 9초 2017 x86_64에의 x86_64에의 x86_64의 GNU/리눅스

  2. 을 사용하고

    구성 GCC (우분투 5.4.0-6ubuntu1 ~ 16.04.4) 5.4.0 20160609

+1

할당 및 무료가 최적화되지 않았습니까? 컴파일러라면 그렇게 할 수 있습니다. :) –

+1

메모리 관리자가 처음 사용할 때 메모리를 할당 할 수 있습니다. 코드에'memset' 호출을 추가하십시오. – Ari0nhh

+3

큰 할당은 glibc의'malloc'에 의해'mmap'을 통해 직접적으로 제공됩니다. 이것은 설명 일 수 있습니다. (아마도 printf로 볼 수있는 힙이 어쨌든 사용됩니다.) –

답변

3

는 C 표준은 malloc()의 구현은 어떤 메모리를 할당 할 수없는, 힙에 대해 아무 말도, 그렇게하지 않습니다 적합한 방법. 이는 예를 들어 메모리 관리를 제공하지 않는 플랫폼의 데이터 세그먼트에 고정 된 대형 버퍼에서 발생할 수 있습니다.

glibc의 경우 기본값으로 malloc은 요청 된 청크가 충분히 큰 경우 mmap을 사용하여 메모리를 할당합니다. 전통적인 힙 (sbrk 통해)은 작은 할당에만 사용됩니다.