본문 바로가기
Borland

여러 시스템 환경에서 할당가능한 메모리

by leo21c 2008. 8. 23.

여러 시스템 환경에서 할당가능한 메모리

From. http://kldp.org/node/68576

할당가능한 메모리량에 대해 질문이 있습니다.
일단 초단순 코드를 만들어봤습니다.

#include
#include
#define ARRAY_SIZE 50000000

int main(void)
{
double dSizeKB = 0;
double dSizeMB = 0;
double dSizeGB = 0;
double dFactorKB = 1./(1024.);
double dFactorMB = dFactorKB/1024.;
double dFactorGB = dFactorMB/1024.;

for(int i = 1 ; i < 10000; ++i)
{
int* p = new int[ARRAY_SIZE];
dSizeKB = (double)(ARRAY_SIZE)*double(i*4)*dFactorKB; //KB
dSizeMB = (double)(ARRAY_SIZE)*double(i*4)*dFactorMB; //MB
dSizeGB = (double)(ARRAY_SIZE)*double(i*4)*dFactorGB; //GB

if(0 != p)
printf("Size(%d) = %.10g (KB) | %.10g (MB) | %.10g (GB)\n",i, dSizeKB, dSizeMB, dSizeGB);
else
printf("Cannot allocate any more memory\n");

getch();
}
return 0;
}

int의 배열을 계속 메모리 할당하여 더이상 할당못할 때까지 메모리를 할당하는 것이죠.
테스트는 5가지로 해봤습니다.

1) 32bit Windows -32bit Application
2) 64bit Windows -32bit Application
3) 64bit Windows -64bit Application
4) 64bit Linux -32bit Application
5) 64bit Linux -64bit Application

결론부터 말하면,
1), 2)의 경우, 약 1.9GB까지 할당 후, 더이상 메모리를 할당하지 못하고
3)의 경우, 약 5.4GB까지 할당 후, 더이상 메모리를 할당하지 못하더군요.

특이사항이라면 1)의 경우에는 메모리를 더이상 할당하지 못하게 되면 p가 NULL로 나올 뿐인데,
2), 3)의 경우에는 프로그램이 비정상 종료를 하더군요. (프로그램 설정 상의 문제일 수도 있습니다.)

여하튼,
일단 32bit Application의 경우, 역시 예상하던대로 약 2GB까지밖에 메모리를 사용하지 못한다는 점을 확인할 수 있었고,
64bit Application의 경우, 어마어마한 양까지 메모리를 할당할 수 있지 않을까?라는 생각을 했는데, 그와달리,
약 5.4GB정도까지밖에 메모리를 할당하지 못한다는 점을 확인할 수 있었습니다.

이번엔 한번 Linux(SUSE)에서 실행을 해봤습니다.
4)의 경우에는 약 3.7GB
5)의 경우에는 약510.7 GB 까지 할당이 되더군요.

여기서 내릴 수 있는 결론은 일단 다음과 같습니다.

1) win32 application이 최대로 사용할 수 있는 메모리는 windows가 32bit이든 64bit이든, 약 2GB이다.
2) wib64 application이 최대로 사용할 수 있는 메모리는 약 5.4GB이다.

입니다.

사실 32bit 시스템에서 이론적으로 사용할 수 있는 메모리양은 4GB인데,
32bit windows에서는 여러 제약때문에 실제로 Application이 쓸 수 있는 메모리양이 2GB가 된 지라,
내심 64bit windows에서는 Application이 쓸 수 있는 메모리양이 4GB가 되기를 바랬는데 그게 아닌 모양입니다.

더불어, win64 application은 이론적으로는 16TB의 메모리를 이용할 수 있는데 (물론 물리적 메모리의 한계로 아직은 그럴 수 없겠지만요)
고작 5.4GB의 메모리밖에 사용하지 못한 점은 이해가 안가네요.
리눅스에서는 500GB도 넘게 할당이 가능했는데 말이죠.

제가 나름대로 체크해본 내용에 대해서 혹시 의견을 달아주신다면 정말 감사하겠습니다.

끝으로, 제가 각 환경에서 돌린 출력내용을 덧붙이겠습니다.

/////////////////////////////////////////////////////////
// win32 in x64
/////////////////////////////////////////////////////////
Size(1) = 195312.5 (KB) | 190.7348633 (MB) | 0.1862645149 (GB)
Size(2) = 390625 (KB) | 381.4697266 (MB) | 0.3725290298 (GB)
Size(3) = 585937.5 (KB) | 572.2045898 (MB) | 0.5587935448 (GB)
Size(4) = 781250 (KB) | 762.9394531 (MB) | 0.7450580597 (GB)
Size(5) = 976562.5 (KB) | 953.6743164 (MB) | 0.9313225746 (GB)
Size(6) = 1171875 (KB) | 1144.40918 (MB) | 1.11758709 (GB)
Size(7) = 1367187.5 (KB) | 1335.144043 (MB) | 1.303851604 (GB)
Size(8) = 1562500 (KB) | 1525.878906 (MB) | 1.490116119 (GB)
Size(9) = 1757812.5 (KB) | 1716.61377 (MB) | 1.676380634 (GB)
Size(10) = 1953125 (KB) | 1907.348633 (MB) | 1.862645149 (GB)
Cannot allocate any more memory
Cannot allocate any more memory

/////////////////////////////////////////////////////////
// win32 in x64
/////////////////////////////////////////////////////////
Size(1) = 195312.5 (KB) | 190.7348633 (MB) | 0.1862645149 (GB)
Size(2) = 390625 (KB) | 381.4697266 (MB) | 0.3725290298 (GB)
Size(3) = 585937.5 (KB) | 572.2045898 (MB) | 0.5587935448 (GB)
Size(4) = 781250 (KB) | 762.9394531 (MB) | 0.7450580597 (GB)
Size(5) = 976562.5 (KB) | 953.6743164 (MB) | 0.9313225746 (GB)
Size(6) = 1171875 (KB) | 1144.40918 (MB) | 1.11758709 (GB)
Size(7) = 1367187.5 (KB) | 1335.144043 (MB) | 1.303851604 (GB)
Size(8) = 1562500 (KB) | 1525.878906 (MB) | 1.490116119 (GB)
Size(9) = 1757812.5 (KB) | 1716.61377 (MB) | 1.676380634 (GB)
Size(10) = 1953125 (KB) | 1907.348633 (MB) | 1.862645149 (GB)

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Press any key to continue . . .

/////////////////////////////////////////////////////////
// win64 in x64
/////////////////////////////////////////////////////////
Size(1) = 195312.5 (KB) | 190.7348633 (MB) | 0.1862645149 (GB)
Size(2) = 390625 (KB) | 381.4697266 (MB) | 0.3725290298 (GB)
Size(3) = 585937.5 (KB) | 572.2045898 (MB) | 0.5587935448 (GB)
Size(4) = 781250 (KB) | 762.9394531 (MB) | 0.7450580597 (GB)
Size(5) = 976562.5 (KB) | 953.6743164 (MB) | 0.9313225746 (GB)
Size(6) = 1171875 (KB) | 1144.40918 (MB) | 1.11758709 (GB)
Size(7) = 1367187.5 (KB) | 1335.144043 (MB) | 1.303851604 (GB)
Size(8) = 1562500 (KB) | 1525.878906 (MB) | 1.490116119 (GB)
Size(9) = 1757812.5 (KB) | 1716.61377 (MB) | 1.676380634 (GB)
Size(10) = 1953125 (KB) | 1907.348633 (MB) | 1.862645149 (GB)
Size(11) = 2148437.5 (KB) | 2098.083496 (MB) | 2.048909664 (GB)
Size(12) = 2343750 (KB) | 2288.818359 (MB) | 2.235174179 (GB)
Size(13) = 2539062.5 (KB) | 2479.553223 (MB) | 2.421438694 (GB)
Size(14) = 2734375 (KB) | 2670.288086 (MB) | 2.607703209 (GB)
Size(15) = 2929687.5 (KB) | 2861.022949 (MB) | 2.793967724 (GB)
Size(16) = 3125000 (KB) | 3051.757813 (MB) | 2.980232239 (GB)
Size(17) = 3320312.5 (KB) | 3242.492676 (MB) | 3.166496754 (GB)
Size(18) = 3515625 (KB) | 3433.227539 (MB) | 3.352761269 (GB)
Size(19) = 3710937.5 (KB) | 3623.962402 (MB) | 3.539025784 (GB)
Size(20) = 3906250 (KB) | 3814.697266 (MB) | 3.725290298 (GB)
Size(21) = 4101562.5 (KB) | 4005.432129 (MB) | 3.911554813 (GB)
Size(22) = 4296875 (KB) | 4196.166992 (MB) | 4.097819328 (GB)
Size(23) = 4492187.5 (KB) | 4386.901855 (MB) | 4.284083843 (GB)
Size(24) = 4687500 (KB) | 4577.636719 (MB) | 4.470348358 (GB)
Size(25) = 4882812.5 (KB) | 4768.371582 (MB) | 4.656612873 (GB)
Size(26) = 5078125 (KB) | 4959.106445 (MB) | 4.842877388 (GB)
Size(27) = 5273437.5 (KB) | 5149.841309 (MB) | 5.029141903 (GB)
Size(28) = 5468750 (KB) | 5340.576172 (MB) | 5.215406418 (GB)
Size(29) = 5664062.5 (KB) | 5531.311035 (MB) | 5.401670933 (GB)

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

/////////////////////////////////////////////////////////
// Linux32 in 64bitLinux
/////////////////////////////////////////////////////////
Size(1) = 195312.5 (KB) | 190.7348633 (MB) | 0.1862645149 (GB)
Size(2) = 390625 (KB) | 381.4697266 (MB) | 0.3725290298 (GB)
Size(3) = 585937.5 (KB) | 572.2045898 (MB) | 0.5587935448 (GB)
Size(4) = 781250 (KB) | 762.9394531 (MB) | 0.7450580597 (GB)
Size(5) = 976562.5 (KB) | 953.6743164 (MB) | 0.9313225746 (GB)
Size(6) = 1171875 (KB) | 1144.40918 (MB) | 1.11758709 (GB)
Size(7) = 1367187.5 (KB) | 1335.144043 (MB) | 1.303851604 (GB)
Size(8) = 1562500 (KB) | 1525.878906 (MB) | 1.490116119 (GB)
Size(9) = 1757812.5 (KB) | 1716.61377 (MB) | 1.676380634 (GB)
Size(10) = 1953125 (KB) | 1907.348633 (MB) | 1.862645149 (GB)
Size(11) = 2148437.5 (KB) | 2098.083496 (MB) | 2.048909664 (GB)
Size(12) = 2343750 (KB) | 2288.818359 (MB) | 2.235174179 (GB)
Size(13) = 2539062.5 (KB) | 2479.553223 (MB) | 2.421438694 (GB)
Size(14) = 2734375 (KB) | 2670.288086 (MB) | 2.607703209 (GB)
Size(15) = 2929687.5 (KB) | 2861.022949 (MB) | 2.793967724 (GB)
Size(16) = 3125000 (KB) | 3051.757812 (MB) | 2.980232239 (GB)
Size(17) = 3320312.5 (KB) | 3242.492676 (MB) | 3.166496754 (GB)
Size(18) = 3515625 (KB) | 3433.227539 (MB) | 3.352761269 (GB)
Size(19) = 3710937.5 (KB) | 3623.962402 (MB) | 3.539025784 (GB)
Size(20) = 3906250 (KB) | 3814.697266 (MB) | 3.725290298 (GB)

/////////////////////////////////////////////////////////
// Linux64 in 64bitLinux
/////////////////////////////////////////////////////////
................................................................
................................................................
Size(2732) = 533593750 (KB) | 521087.6465 (MB) | 508.8746548 (GB)
Size(2733) = 533789062.5 (KB) | 521278.3813 (MB) | 509.0609193 (GB)
Size(2734) = 533984375 (KB) | 521469.1162 (MB) | 509.2471838 (GB)
Size(2735) = 534179687.5 (KB) | 521659.8511 (MB) | 509.4334483 (GB)
Size(2736) = 534375000 (KB) | 521850.5859 (MB) | 509.6197128 (GB)
Size(2737) = 534570312.5 (KB) | 522041.3208 (MB) | 509.8059773 (GB)
Size(2738) = 534765625 (KB) | 522232.0557 (MB) | 509.9922419 (GB)
Size(2739) = 534960937.5 (KB) | 522422.7905 (MB) | 510.1785064 (GB)
Size(2740) = 535156250 (KB) | 522613.5254 (MB) | 510.3647709 (GB)
Size(2741) = 535351562.5 (KB) | 522804.2603 (MB) | 510.5510354 (GB)
Size(2742) = 535546875 (KB) | 522994.9951 (MB) | 510.7372999 (GB)
Aborted