ich gelesen, dass, wenn Sie versuchen, mehr Bytes zuzuteilen als im RAM unter Verwendung von malloc verfügbar sind(), es virtuelle Speicher reserviert
Am Anfang ist das nicht korrekt. Sie immer virtuellen Speicher zuweisen. Dieser virtuelle Speicher wird einem Bereich im physischen Speicher (RAM) oder im Auslagerungsbereich zugeordnet. Wenn der Auslagerungsbereich + physischer Speicher weniger als 100 GB beträgt, schlägt die Zuweisung fehl. Auch die libc
Implementierung kann eine so große Menge nicht zuordnen, wenn sie eine (programmierbare) Grenze hat.
aber ich habe eine seltsame Aufgabe, um 100 GB virtuellen Speicher für den Prozess in Htop Tool zu zeigen. Und es wird behauptet, dass es über eine einzige Codezeile erreichbar ist.
Ja, wenn Sie nur so viel virtuellen Speicher benötigen, können Sie Speicher reservieren, aber nicht festschreiben. Sie können lesen, wie mmap
(* NIX) oder VirtualAlloc
(Windows) für das gleiche verwendet werden können.
Wenn Sie einen bestimmten Bereich für virtuelle Adressen reservieren, teilen Sie dem Betriebssystem mit, dass Sie diesen Bereich verwenden möchten, damit kein anderer Code das verwenden kann. Aber es bedeutet nicht, dass Sie es tatsächlich verwenden können. Dies bedeutet auch, dass es keine RAM/Swap-Unterstützung benötigt. So können Sie beliebig große Mengen reservieren (weniger als 2^48 Bytes auf Ihrem 64-Bit-System natürlich).
Obwohl ich nicht sicher bin, ob htop
das in den Wert einbeziehen wird, den es zeigt, müssen Sie das ausprobieren.
Wenn dies nicht zur Anzahl der virtuellen Arbeitsspeicher beiträgt, können Sie sie einer Datei zuordnen, anstatt sie anonym zuzuordnen. Dies könnte eine 100-GB-Datei auf Ihrem System erstellen (vorausgesetzt, Sie haben so viel Platz), aber Sie sollten sogar in der Lage sein, es zu lesen/zu schreiben.
folgende Code kann auf Linux verwendet werden -
int fd = open("temp.txt", O_RDWR | O_CREAT);
void* addr = mmap(NULL, 100 * GBS, PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0);
Wie groß ist Ihr Swap-Bereich? Vielleicht verwandt: https://stackoverflow.com/a/11198816/7926064 – BNT
Und haben Sie Ihr System * über hundert Gigabyte virtuellen Speicher? Was meldet der "freie" Befehl (http://man7.org/linux/man-pages/man1/free.1.html)? Vielleicht missverstehen Sie, wie virtueller Speicher funktioniert? –
Abgesehen von obigen Kommentaren, was ist 'gb'? Ich kann mir vorstellen, wie man seinen Code durch schlechte Definitionen bricht. Tatsächlich scheint es schwierig zu sein, eine Definition zu finden, die Ihren Code mit dem folgenden 'int' kompilierbar macht. – Yunnosch