2017-12-12 4 views
0

Ich habe gelesen, dass wenn Sie versuchen, mehr Bytes als im RAM mit malloc() verfügbar zu reservieren, reserviert virtuellen Speicher. Zumindest unter Linux.Ich kann nicht viel virtuellen Speicher reservieren

Ich möchte eine große Menge an virtuellem Speicher zuweisen, sagen wir 100 GB. Also, ich schrieb etwas in der Art:

void* virtual_memory = malloc(100 gb int); 

Aber der zurückgegebene Zeiger ist NULL.

Ich führe diesen Code auf einem 64-Bit-Ubuntu Virtual Machine.

Was mache ich falsch?

EDIT Was ich versuche zu erreichen ist htop Werkzeug Anzeige 100GB in VIRT Spalte für meinen Prozess zu machen.

UPDATE ich malloc anrufen kann 2 GB zuweisen auf einmal 50 mal

+2

Wie groß ist Ihr Swap-Bereich? Vielleicht verwandt: https://stackoverflow.com/a/11198816/7926064 – BNT

+4

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? –

+1

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

Antwort

2

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); 
+0

Ja, es reserviert immer virtuellen Speicher. Mein Fehler. Das Reservieren von Speicher ohne Commit sieht genau so aus, wie ich es brauche. Ich werde es ausprobieren. Vielen Dank! – Lingviston

+0

Linux reserviert immer Speicher ohne Festschreiben. Wenn Sie in Linux 'malloc' aufrufen, wird kein tatsächlicher Speicher reserviert, bis Sie versuchen, ihn zu benutzen. Wenn es scheitert, liegt das daran, dass Sie ein hartes Limit pro Prozess oder pro System haben. – JeremyP

+0

@ JeremyP Wie kann ich diese Grenzwerte entfernen? Ich habe eine saubere Installation von Ubuntu 17.04 64 Bit auf einer virtuellen Maschine. – Lingviston

0

Der folgende Code die Sache für mich getan:

for (int i = 0; i < 50; ++i) { 
    malloc(int_pow(2, 31)); 
} 

Wo int_pow nur eine Implementierung kundenspezifische pow ist, die ganzen Zahlen arbeitet. Nach dem Ausführen dieser App htop Tool zeigt, dass es genau 100 GB virtuellen Speicher verwendet.

Verwandte Themen