maximaler Speicher, den malloc zuordnen kann

Ich habe versucht herauszufinden, wie viel Speicher ich maximal auf meinem Computer malloc (1 GB RAM 160 GB HD Windows-Plattform) kann.

Ich habe gelesen, dass der maximale Speicher, den malloc zuweisen kann, auf physischen Speicher beschränkt ist (auf Heap).

Auch wenn ein Programm den Speicherverbrauch auf ein bestimmtes Niveau überschreitet, funktioniert der Computer nicht mehr, weil andere Anwendungen nicht genügend Speicher erhalten, den sie benötigen.

Um das zu bestätigen, schrieb ich ein kleines Programm in C:

int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } } 

Ich hatte gehofft, dass es eine Zeit geben würde, in der die Speicherzuweisung fehlschlagen würde und die Schleife unterbrochen würde, aber mein Computer hing wie eine Endlosschleife.

Ich wartete ungefähr eine Stunde und musste schließlich meinen Computer herunterfahren.

Einige Fragen:

  • Verteilt malloc auch Speicher von HD?
  • Was war der Grund für das oben genannte Verhalten?
  • Warum hat die Schleife zu keinem Zeitpunkt unterbrochen?
  • Warum gab es keinen Zuteilungserrors?

    Ich habe gelesen, dass der maximale Speicher, den malloc zuweisen kann, auf physischen Speicher beschränkt ist (auf Heap).

    Falsch: Die meisten Computer / Betriebssysteme unterstützen virtuellen Speicher, unterstützt durch Festplattenspeicher.

    Einige Fragen: malloc Speicher von HDD auch?

    malloc fragt das Betriebssystem, das wiederum Speicherplatz benötigt.

    Was war der Grund für das oben genannte Verhalten? Warum ist die Schleife zu keiner Zeit unterbrochen worden?

    Warum gab es keinen Zuteilungserrors?

    Sie haben zu einem Zeitpunkt immer zu wenig nachgefragt: Die Schleife wäre irgendwann kaputt gegangen (nachdem Ihre Maschine aufgrund des großen Überschusses an virtuellem und physikalischem Speicher und dem damit einhergehenden extrem häufigen Festplattenzugriff, der als “Thrashing” bezeichnet wird, verlangsamt wurde “) Aber es hat deine Geduld schon vorher erschöpft. Versuchen Sie stattdessen, stattdessen jeweils ein Megabyte zu bekommen.

    Wenn ein Programm den Speicherverbrauch auf ein bestimmtes Niveau überschreitet, funktioniert der Computer nicht mehr, weil andere Anwendungen nicht genügend Speicher erhalten, den sie benötigen.

    Ein totaler Stopp ist unwahrscheinlich, aber wenn eine Operation, die normalerweise ein paar Mikrosekunden dauern würde, zig Millisekunden dauert, können diese vier Grössenordnungen sicherlich das Gefühl geben , dass der Computer im Grunde gestoppt hat und was normalerweise dauern würde Eine Minute könnte eine Woche dauern.

    Ich weiß, dass dieser Thread alt ist, aber für jeden, der es selbst ausprobieren möchte, benutze diesen Code

     #include  int main() { int *p; while(1) { int inc=1024*1024*sizeof(char); p=(int*) calloc(1,inc); if(!p) break; } } 

    Lauf

     $ gcc memtest.c $ ./a.out 

    Beim Ausführen füllt dieser Code seinen RAM, bis er vom coreel getötet wird. Calloc anstelle von malloc verwenden, um eine “faule Auswertung” zu verhindern. Ideen aus diesem Thread: Malloc Memory Fragen

    Dieser Code füllte schnell meinen RAM (4Gb) und dann in ungefähr 2 Minuten meine 20Gb Swap-Partition, bevor sie starb. 64bit Linux natürlich.

    malloc führt eine eigene Speicherverwaltung durch und verwaltet selbst kleine Speicherblöcke. Letztendlich verwendet es jedoch die Win32 Heap-functionen , um Speicher zuzuordnen. Sie können sich malloc als “Gedächtnis-Reseller” vorstellen.

    Das Windows-Speichersubsystem umfasst physischen Speicher (RAM) und virtuellen Speicher (HD). Wenn der physische Speicher knapp wird, können einige der Seiten vom physischen Speicher auf den virtuellen Speicher auf der Festplatte kopiert werden. Windows macht das transparent.

    Standardmäßig ist der virtuelle Speicher aktiviert und belegt den verfügbaren Speicherplatz auf der Festplatte. Daher wird der Test so lange ausgeführt, bis entweder der gesamte virtuelle Speicher für den process reserviert wurde (2 GB für 32-Bit-Windows) oder die Festplatte gefüllt wurde.

    Versuche dies

     #include  #include  main() { int Mb = 0; while (malloc(1< <20)) ++Mb; printf("Allocated %d Mb total\n", Mb); } 

    Enthalten Sie stdlib und stdio dafür.
    Dieser Extrakt stammt aus tiefen c-Geheimnissen .

    Ich weiß nicht, warum das fehlgeschlagen ist, aber eine Sache, die zu beachten ist, ist, dass “malloc (4)” möglicherweise nicht 4 Byte ergibt, also ist diese Technik nicht wirklich eine genaue Methode, um Ihre maximale Größe zu finden.

    Ich habe das hier aus meiner Frage herausgefunden.

    Wenn Sie beispielsweise 4 Byte Speicher deklarieren, könnte der Speicherplatz direkt vor Ihrem Speicher die Ganzzahl 4 enthalten, um dem coreel anzuzeigen, um wie viel Speicher Sie gebeten haben.

    Der C90-Standard garantiert, dass Sie mindestens ein Objekt mit einer Größe von 32 KB erhalten können. Dies kann statischer, dynamischer oder automatischer Speicher sein. C99 garantiert mindestens 64 kBytes. Für jedes höhere Limit, beziehen Sie sich auf die Dokumentation Ihres Compilers.

    Außerdem ist mallocs Argument eine size_t und der Bereich dieses Typs ist [0, SIZE_MAX], so dass das Maximum, das Sie anfordern können, SIZE_MAX ist. Dieser Wert variiert bei der Implementierung und ist in .

    Wenn Sie zum ersten Mal irgendeine Größe an * p zuweisen, verlassen Sie diesen Speicher jedes Mal, wenn Sie ihn nicht referenzieren. Das bedeutet

    Zu einem Zeitpunkt reserviert Ihr Programm Speicher von nur 4 Bytes

    . Wie kann man dann sagen, dass Sie den gesamten Arbeitsspeicher belegt haben, weshalb das SWAP-Gerät (temporärer Speicherplatz auf der Festplatte) nicht zur Diskussion steht. Ich kenne einen Speicherverwaltungsalgorithmus, bei dem, wenn kein Programm auf den Speicherblock verweist, dieser Block berechtigt ist, Speicheranforderungen für Programme zuzuweisen. Aus diesem Grund beschäftigen Sie sich nur mit RAM Driver und können daher keine anderen Programme bedienen. Auch das ist ein hängendes Referenzproblem.

    Antwort: Sie können höchstens den Arbeitsspeicher Ihrer RAM-Größe zuweisen. Weil kein Programm Zugriff auf das Swap-Gerät hat.

    Ich hoffe, Ihre Fragen haben alle zufriedenstellende Antworten.