2010-10-12 2 views
9

Ich möchte (in * nix) einen großen, festen Adressraum zuweisen, aber ohne Ressourcen sofort zu verbrauchen, d. H. Ich möchte einen Adressbereich reservieren und ihn später zuweisen.Wie kann ich Speicheradressen reservieren, ohne sie zuzuweisen

Angenommen, ich foo = malloc (3 * 1024 * 1024 * 1024) zu 3G zuweisen, aber auf einem 1G Computer mit 1G Swap-Datei. Es wird scheitern, oder?

Was ich tun möchte, ist zu sagen: „Gib mir einen Speicheradressbereich foo ... foo + 3G , in die ich Zuteilung sein wird“, so kann ich garantieren, dass alle Zuweisungen in diesem Bereich sind zusammenhängende, aber ohne tatsächlich die Zuteilung sofort.

Im obigen Beispiel möchte ich dem Aufruf foo = reserve_memory (3G) mit einem Aufruf bar = malloc (123) folgen, der erfolgreich war, da reserve_memory noch keine Ressourcen verbraucht hat sei im Bereich foo ... foo + 3G.

Später würde ich etwas wie allocate_for_real (foo, 0,234) tun, um Bytes 0..234 von foo's Bereich zu verbrauchen. Zu diesem Zeitpunkt würde der Kernel einige virtuelle Seiten zuweisen und sie foo ... foo + 123 + N

zuordnen. Ist das im Userspace möglich?

(Der Punkt ist, dass Objekte in foo ... müssen zusammenhängend sein und vernünftigerweise nicht bewegt werden kann, nachdem sie erstellt werden.)

Danke.

+0

Ich hoffe, Sie sind auf einer 64-Bit-Plattform, oder eine 3G-Block-Zuweisung wird wahrscheinlich nicht gelingen. – MarkR

+0

virtuell oder physisch zusammenhängend? – shodanex

Antwort

15

Kurze Antwort: es funktioniert schon so.

Etwas längere Antwort: Die schlechte Nachricht ist, dass es keine spezielle Möglichkeit gibt, einen Bereich zu reservieren, aber nicht zu reservieren. Allerdings ist die gute Nachrichten, dass, wenn Sie einen Bereich zuweisen, Linux es nicht tatsächlich zuweisen, es reserviert es nur für die Verwendung von Ihnen später.

Das Standardverhalten von Linux besteht darin, immer eine neue Zuweisung zu akzeptieren, solange die Adresse Bereich übrig ist. Wenn Sie den Speicher tatsächlich verwenden, sollten Sie jedoch etwas Speicher zur Verfügung haben oder ihn zumindest austauschen. Wenn nicht, wird der Kernel einen Prozess zum Freigeben von Speicher abbrechen, normalerweise der Prozess, der den meisten Speicher zugewiesen hat.

So wird das Problem in Linux mit Standardeinstellungen verschoben von "wie viel kann ich zuweisen", "wie viel kann ich zuordnen und dann noch am Leben sein, wenn ich den Speicher verwenden?"

Here is some info über das Thema.

+0

Das ist gut zu wissen.Können Sie mir bitte sagen, wie Sie eine Dokumentation dazu finden? – spraff

+1

@spraff: einige ---> http://www.ioremap.net/node/125 –

0

Ich denke, eine einfache Möglichkeit wäre, das mit einem großen static Array zu tun.

Auf jedem modernen System wird dies nicht dem vorhandenen Speicher zugeordnet (in der ausführbaren Datei auf der Festplatte oder im RAM Ihrer Ausführungsmaschine), es sei denn, Sie werden wirklich darauf zugreifen. Sobald Sie darauf zugreifen (und das System hat genug Ressourcen) wird es auf wundersame Weise auf alle Nullen initialisiert.

Und Ihr Programm wird ernsthaft verlangsamen, sobald Sie die Grenze des physischen Speichers erreichen und dann zufällig abstürzen, wenn Sie keinen Swap mehr haben.

+0

Ein großes statisches Array wird funktionieren, wie auch ein malloc, es ist das gleiche am Ende. –

Verwandte Themen