2010-07-23 5 views
0

128M 메모리가있는 컴퓨터가 있는데이 프로그램입니다.이 프로그램을 몇 번이나 실행할 수 있습니까?

while(1) 
{  
    ptr = malloc(1024 * 1024 * 100); 
    if (NULL == ptr) 
    { 
     printf("malloc 100M Failed\n"); 
     return 1; 
    } 
    n+=100; 
    printf("malloc %dM\n", n); 
} 

출력에서 ​​malloc이 20 번 실행되는 이유는 무엇입니까?

+0

대부분의 운영 체제에서 * 가상 * 메모리를 할당합니다. 32 비트 OS의 경우 2 ~ 3GB 주변의 주소 공간이 부족할 수 있습니다. 이는보고있는 주소와 일치합니다. –

+0

"machine"은 거의 일반적인 것입니다. 이는 구현 관련 특정 질문에 너무 도움이되지 않습니다. – GManNickG

답변

1

말하기 힘들다 - 기본 OS가 어떻게 메모리를 제공하는지에 달려있다.

물리적 메모리 일 필요는 없으며 스왑 공간에 상주 할 수도 있고, 할당 할 때 대신 을 사용할 때 할당을 대신 할 수도 있습니다.

0

여기서 기본 개념은 malloc가상 메모리의 사용 가능한 메모리 블록을 할당한다는 것입니다.

운영 체제가 메모리를 할당하는 위치에 따라 여유 메모리가일 뿐이지 만 그 이상의 메모리는 필요하지 않습니다.

4

프로그램에 virtual memory이 할당되어 있기 때문입니다. 32 비트 프로세스 (Windows의 경우 - 다른 운영 체제가 약간 다름)에서 일반적으로 메모리를 할당 할 가상 주소 공간이 인 2GB의 을 얻습니다. 운영 체제는 해당 메모리를 "스왑 파일"과 실제 메모리 사이에 매핑합니다 (실제 메모리가 128MB이기 때문에 대용량의 메모리는 스왑 파일에만 저장됩니다).

그래서 100MB * 20 = "around"2GB이며, 20 루프를 실행할 수있는 이유가 설명되어 있습니다.

+0

32 비트 주소 공간은 2GB가 아닌 4GB이지만이 중 일부가 반드시 연속 할당에 사용할 수있는 것은 아닙니다. 대부분의 운영 체제는 2 ~ 3GB 사이에서 오류가 발생하기 시작할 것입니다. –

+0

하지만 실제로 스왑 파일이 없습니다. –

+0

@Paul : 좋은 지적. 정확한 비율은 OS/설정에 따라 다릅니다. @David : 플랫폼에 따라 운영 체제는 실제로 메모리를 사용하기 전까지 메모리를 커밋하지 않을 수 있습니다. 즉, 메모리를 실제로 예약합니다. 이러한 상황에서는 전체 가상 주소 공간을 "할당"할 수 있으며 읽기/쓰기를 시도 할 때만 문제가 발생합니다. –

2

실제로 메모리를 사용하지 않으므로 가상 메모리를 사용하여 커널에 과도하게 커밋 (즉, 실제로 제공 할 수있는 것보다 많은 메모리를 제공) 할 수 있습니다.

100M은 20GB에 가깝기 때문에 OS 사용을 위해 2GB를 예약하는 32 비트 OS를 사용하는 것처럼 보입니다. 사용자 공간 프로세스에 2GB의 주소 공간이 남습니다. 따라서 2GB는 컴퓨터가 실제로 얼마나 많은 메모리를 가지고 있더라도 상관없이 그러한 프로세스에서 해결할 수있는 최대 메모리 양입니다.

+0

은 합리적입니다. –

+0

@David : 예 : * NIX 시스템은 전통적으로 첫 번째 액세스에서만 가상 메모리를 할당합니다. * NIX 시스템에서 테스트하는 것은 말 그대로 Nop입니다. 예를 들어, 실제 시험을하거나 읽거나 쓰십시오. 할당 된 메모리의 모든 4K (일반 페이지 크기) 블록의 모든 첫 번째 바이트. – Dummy00001

1

가상 주소 공간은 PAE를 사용하지 않는 32 비트 플랫폼에서 2^32 바이트 여야합니다. 귀하의 플랫폼이 발을 내려 놓기 전에 그 중 절반을 할당 할 수있게하는 것처럼 보입니다.

관련 문제