2013-11-15 9 views
9

Also habe ich dieses Programm, das 256 MB Speicher zuweist, und nachdem der Benutzer die EINGABETASTE drückt, wird der Speicher freigegeben und beendet.Warum verbraucht malloc nicht den Speicher auf meinem Computer?

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

int main(void) { 
    char *p, s[2]; 

    p = malloc(256 * 1024 * 1024); 
    if (p == NULL) 
     exit(1); 

    printf("Allocated"); 
    fgets(s, 2, stdin); 
    free(p); 
    return 0; 
} 

Ich lief dieses Programm mehrmals und backgrounded jeder von ihnen, bis es nicht mehr genügend Speicher, der zugeordnet werden kann. Das passiert jedoch nie. Ich habe einen Linux-Befehl top ausgeführt und selbst nach dem Ausführen dieses Programms viele Male, der freie Speicher geht nie um fast so viel wie 256 MB.

jedoch auf der anderen Seite, wenn ich calloc statt malloc verwenden, dann gibt es einen großen Unterschied:

p = calloc(256 * 1024 * 1024, 1);

Nun, wenn ich das Programm und Hintergrund es laufen, und wiederholen, jedes Mal wenn ich Führen Sie es aus, der freie Speicher wird um 256 MB reduziert. Warum ist das? Warum bewirkt malloc keine Änderung des verfügbaren freien Speichers, aber calloc?

+0

Führen Sie das Programm über strace, und sehen, was es tut. (Ich würde erwarten, _both_ Versionen zu anonym/anonymousmap/dev/0, BTW) – wildplasser

+7

Es heißt "Lazy allocation". http: // Stapelüberlauf.com/questions/712683/what-is-lazy-allocation – jaeheung

+2

Die kurze, vereinfachende Antwort ist, dass, da Sie den Speicher von 'malloc' noch nicht benutzt haben, der Computer ihn Ihnen noch nicht wirklich geben muss. Mit 'calloc' muss jedoch der Speicher verwendet werden (für den Nullstellungsteil), und deshalb muss der Computer tatsächlich alles davon geben. –

Antwort

18

funktioniert nicht Speicher verwenden. Es teilt es zu.

Nachdem Sie den Speicher zugewiesen haben, verwenden Sie ihn, indem Sie einige Daten zuweisen.

size_t Size = 256 * 1024 * 1024; 
p = malloc(Size); 
if (p != NULL) { 
    memset(p, 123, Size); 
} 

Einige Plattformen implementieren malloc() ist so eine Art und Weise, dass der physikalisch Verbrauch von Speicher tritt nicht auf, bis das Byte (oder eher ein Byte innerhalb einer Gruppe oder „Seite“ von Bytes) zugegriffen wird.

calloc() kann oder nicht wirklich verwenden Sie den Speicher entweder. Ein System könnte Karte viel Speicher auf den gleichen physischen Null-Speicher, zumindest bis die Daten interessant werden. Siehe Why malloc+memset is slower than calloc?

+3

Ist 123 deine Glückszahl? 256 MB 123 123 123 123 ... Muss sehr viel Glück haben! –

3

Die calloc auf Ihrem System † tatsächlich den Speicher berührt, indem sie es löschen, und auf vielen Systemen ist der Speicher nicht wirklich zugeordnet (und damit „verbraucht“), bis er durch das Verfahren berührt wird, der sie zugeordnet ist, . Also macht einfach malloc den Speicher nicht "benutzen", bis Sie, naja, benutzen Sie ihn.

† Siehe Anmerkungen

+3

Ich denke 'calloc()' kann auch auf einigen Systemen zu betrügen http://stackoverflow.com/questions/2688466/why-mallocmemset-is-slower-than-calloc?rq=1 – chux

+1

@chux Interessant, wusste ich nicht Danke für den Link. (Inzwischen hat der Fragesteller "Calloc" und "Malloc" auf ihrem System und ihren Parametern anders gefunden.) – Arkku

+1

Einverstanden. Es ist nicht gut bekannt und trifft im Falle von OP sicherlich nicht zu. Diese hinterhältigen OS Gremlins! – chux

11

Der Speicher nicht wirklich vorhanden sein kann, vor allem, dass Sie etwas nicht tun für die Verwendung von p in Ihrem Beispiel außer Kontrolle, wenn es NULL ist. Von man malloc

Standardmäßig folgt Linux einer optimistischen Speicherzuweisungsstrategie. Das bedeutet, wenn malloc() nicht-NULL zurückgibt, gibt es keine Garantie, dass der Speicher wirklich verfügbar ist. Falls sich herausstellt, dass das System nicht genügend Arbeitsspeicher hat, werden ein oder mehrere Prozesse vom OOM-Killer beendet. Weitere Informationen finden Sie in der Beschreibung von /proc/sys/vm/overcommit_memory und /proc/sys/vm/oom_adj in proc(5) und der Linux-Kernel-Quelldatei Dokumentation /vm/overcommit-accounting.

Verwandte Themen