2010-02-01 2 views
5

다른 컴퓨터에서 RSS를 초과하는 프로그램을 실행하면 완전히 다른 동작을 보입니다. 코드는 다음과 같습니다.malloc은 다른 컴퓨터에서 다르게 동작합니다.

... 
    char** s = (char**)malloc(10000*sizeof(char*)); 

    for (i = 0; i < 10000; i++){ 
    s[i] = (char*)malloc(1000*1000*sizeof(char)); 
    if (s[i] == NULL) { 
     printf("cannot allocate memory for s[%d]",i); 
     exit(1); 
    } 
    } 

    int j = 0; 
    while(1){ 
    for (i = 0; i < 10000; i++){ 
     for (j = 0; j < 1000*1000; j++) { 
     s[i][j] = 1; 
     } 
     if ((i % 100) == 0) printf("i = %d\n", i); 
    } 
    } 
    for (i = 0; i < 10000; i++) 
    free(s[i]); 
    free(s); 
... 

위 코드는 malloc을 사용하여 약 10GB의 메모리를 할당하려고합니다. 처음 두 머신에서이 코드를 리눅스 커널 2.6에서 실행하고 마지막 하나는 리눅스 커널 2.4에서 실행했다. 다음은이 컴퓨터에서 볼 수있는 동작입니다.

Machine1 : 메모리가 메모리 오버 커밋을 사용하여 할당되지만 while 루프의 메모리 위치에 값을 할당 할 때 RSS만큼만 할당합니다. 따라서 OOM Killer는이 기계에 4GB의 메모리가있는 i = 3800이 인쇄 될 때 프로세스를 중지합니다.

Machine2 : 메모리가 메모리 오버 커밋을 사용하여 할당되고 while 루프가 영원히 계속되며 가상 메모리에서 페이지를 할당합니다. 이 프로세스는 i = 3800이 정상적으로 인쇄 된 후 조금 느려집니다.

machine3 :이 기계에는 2GB의 메모리 만 있습니다. 메모리를 할당 할 수도 없습니다. 오버 커밋이 설정되지 않았거나 커널 2.4가 malloc을 사용하여 가상 머신 페이지를 할당하는 것을 지원하지 않는 것처럼 보입니다! 따라서 첫 번째 for 루프에서 i = 2138에 대한 메모리 할당 중에 종료합니다.

원하는 작업은 machine2에서 발생하는 작업입니다. 누구도 OS가 malloc을 사용하여 가상 메모리 페이지를 할당하고 필요한 메모리가 RSS를 초과하는 동안 페이징을 시작하도록 (커널?) 옵션을 설정해야한다는 것을 알고 있습니까?

감사

+1

첫 번째 할당의'if (s! = NULL)'은 어디에 있습니까? –

+0

개인 선호 :'char ** s = (char **) malloc (10000 * sizeof (char *));'와'[i] = (char *) malloc (10000 * sizeof (char)); ''char ** s = malloc (10000 * sizeof * s);와's [i] = malloc (10000 * sizeof ** s);'을 할 것입니다. 그런 식으로's'가'char ** '에서'wchar_t **'로 장래 변경되면, 모든 malloc 호출은 필요에 따라 변경됩니다. 일반적으로 C에서'malloc()'반환 값을 캐스팅 할 필요는 없으며 일부는 (나 자신과 마찬가지로) 유지 보수를 방해하는 나쁜 생각이라고 간주합니다. –

+0

아키텍처? x86_64? –

답변

5

당신은 32 비트 시스템에서 100기가바이트을 할당하고 코드를 사용하는 것 무엇 일반 포인터를 사용하여 처리 할 수 ​​없습니다. 머신 1이 프로세스가 약 4GB에 도달 할 때 프로세스를 종료한다는 사실은 머신 2가 64 비트 OS를 실행 중임을 강력히 시사하지 않습니다.

+0

편집하고 수정 한 원본 메시지에서 실수를했습니다. 코드를 보면 100GB가 아닌 10GB의 메모리 만 요구합니다. 아무튼 기계 1과 2 모두 64 비트 OS를 실행 중입니다. 이 두 가지는 하드웨어가 동일하고 동일하게 구성 되었기 때문에 동일해야합니다. – Pirooz