2014-11-18 2 views
2

에서 메모리를 소모하지 않습니다 ('은 calloc'는 자동으로이 질문에 대한 대답에 따라 RAM

은 calloc 실제로 메모리를 만지지 않는 것이 그것에 0을 써 넣는다) 따라서 OS가 실제 RAM (또는 스왑)으로 할당을 지원하고 있음을 확신 할 수있다. 이것은 malloc보다 느린 이유이기도하다. (OS는 또한 다른 프로세스를 스와핑하여 적절한 메모리 영역을 찾아야 만한다.)

따라서 직접 시도하기로 결정했다.

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

#define ONE_MB = 1048576 

int main() { 
    int *p = calloc(ONE_MB, sizeof(int)); 

    int n; 
    for(n = 0; n != EOF; n = getchar()) ; /* Gives me time to inspect the process */ 

    free(p); 
    return 0; 
} 

이 응용 프로그램을 실행 한 후 Windows의 작업 관리자는 RAM에서 352KB 만 사용되었다고합니다.

calloc memory allocation

내가 할당 된 1MB의 블록이 OS에 의해 RAM과 백업되지 않은 것 같습니다. 내가 수동으로 배열 malloc를 호출하고 초기화 할 경우 반면에


그러나 :

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

#define ONE_MB = 1048576 

int main() { 
    int *p = malloc(sizeof(int) * ONE_MB); 

    int n; 

    /* Manual Initialization */ 
    for(n = 0; n < ONE_MB; n++) 
     memory[n] = n; 

    for(n = 0; n != EOF; n = getchar()) ; /* Gives me time to inspect the process */ 

    free(p); 
    return 0; 
} 

작업 관리자 실제로 응용 프로그램에서 사용되는 RAM의 4.452KB이 있음을 보여줘 것 .

malloc and manual init memory allocation


는 그의 주장에 대한 이삭이 잘못 되었습니까? 그렇다면 calloc은 무엇을합니까? 전체 메모리 블록을 0으로 만들지 않으므로 " 이 (가)"으로 변경됩니다.

그럴 경우 첫 번째 샘플에 RAM이 사용되지 않는 이유는 무엇입니까?

+0

'calloc()'은 메모리를 사용하지 않고, 그것을 할당합니다. http://stackoverflow.com/questions/19991623/why-is-malloc-not-using-up-the-memory-on-my-computer/19991656#19991656 "calloc 실제로 메모리를 만지는"참조하십시오 반드시 그렇지는 않습니다 . 페이지 스와핑을 사용하면 모든 제로 메모리가 적어도 작성된 데이터가 흥미로울 때까지 동일한 위치에 매핑 될 수 있습니다. – chux

+0

귀하의 질문에 귀하가 링크 된 동일한 게시물의 댓글에 답변 된 것으로 보입니다. –

+0

'할당 된 블록이 대부분 운영 체제에서 제공하는 새로운 제로 페이지로 구성되어 있다면, 그 블록을 그대로 둘 수 있습니다. ' 저는 1MB를 할당 할 것입니다. 처음부터 모두 0 일 가능성은 무엇입니까? –

답변

2

그가 처음으로 블록에 0을 써야하기 때문에 그는 더 느렸다는 점에서 잘못되었습니다. (calloc() 같은 블록에 사용되는 경우에만 아닌 경우)

모든 스마트 코딩 OS는 이러한 목적으로 같은 블록을 준비하고 calloc()를 호출하는 경우 그것은 단지 대신 프로세스에 제로 메모리와 같은 블록을 할당 초기화되지 않은 것은> < 일 수 있습니다. malloc()으로 전화하십시오.

그래서 같은 방식으로 메모리 블록을 처리합니다. 그리고 컴파일러/OS가 당신이/아직 전체 1MB를 필요로하지 않는다고 결정한다면 그것은 또한 당신에게 제로화 된 메모리의 1MB 블록을 제공합니다.

그가 얼마나 옳았는지 : 무겁게 calloc()으로 전화를 걸고 메모리를 사용하면 OS가 대기 시간에 준비된 메모리가 0이 될 수 있습니다.

이것은 실제로 시스템이 약간 느리게되는 원인이됩니다. 왜냐하면 os가 calloc()을 호출하여 블록에서 먼저 0을 작성해야하기 때문입니다.

하지만 전혀 : malloc/calloc이 호출시 메모리를 할당해야하는지 또는 메모리를 사용 중인지에 대한 규정이 없습니다. 따라서 특별한 예는 OS 처리에 따라 다릅니다.