2017-11-12 12 views
-1

나는 malloc 전화로 이상한 문제에 직면하고있다. 나는 거대한 배열 (GB 단위의 크기)을 사용하는 프로그램에서 일하고 있는데, 배열에 대한 메모리를 할당하려고 할 때 malloc 찾을 수 있는데, malloc은 내 RAM (64GB)보다 큰 크기를 할당 할 때도 성공합니다. . 아래왜 RAM보다 큰 배열을 할당 할 수 있습니까?

참조 코드 :

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


#define Sixteen_G 16000000000 

int main() { 
    int *c = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *d = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *e = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *f = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *g = (int *)malloc(sizeof(int)*Sixteen_G); 
    if(c == NULL) 
      printf("c Allocation failed\n"); 
    if(d == NULL) 
      printf("d Allocation failed\n"); 
    if(e == NULL) 
      printf("e Allocation failed\n"); 
    if(f == NULL) 
      printf("e Allocation failed\n"); 
    if(g == NULL) 
      printf("e Allocation failed\n"); 
    else 
      printf("All arrays allocated\n"); 
    return 0; 
} 

위의 코드의 출력은 다음과 같습니다

All arrays allocated 

또한 크기 >= 17GBmalloc 단일 호출은 실패하지만, 16GB를 여러 번 호출이 전달된다. malloc에 ​​내 시스템의 RAM 크기가 단지 64기가바이트 때, 그 많은 메모리를 할당 할 수있는 이유

누군가는 설명 할 수, 또한 단일/다중 통화

+0

'else'는'if (g == NULL)'검사에만 속하고 다른 검사에는 속하지 않습니다. –

+0

시스템에서 특정 malloc 구현이 어떤 시스템인지 알려주는 사람이있을 수 있습니다. C 언어 사양은 그 자체로 문제를 말하지 않습니다. –

+0

문제에 관해서는 RAM 크기가 64GB이지만 실제 크기 * 메모리 크기 또는 가상 메모리 크기라고 말합니까? –

답변

4

에 정확히 malloc 작품 당신은 memory overcommitment을 해제 할 수 있습니다 방법에 대해 설명합니다.

this 질문을 참조 (난 정말이 기능을 싫어하는).

코드는 test against malloc failure이어야합니다.

virtual address space에 대해 자세히 알아보십시오. this도 참조하십시오.

+1

당신의 대답에 감사 드리며, 저는 Linux에서 overcommit에 대한 좋은 페이지를 발견했습니다. 같은 문제에 직면 할 수있는 다른 사람들을 위해 여기에서 언급하고 싶었습니다. https://www.etalabs.net/overcommit.html – anirudh