Ich möchte virtuellen Adressraum reserviert in meinem Prozess für Speicher, der zuvor verwendet wurde, aber derzeit nicht benötigt wird. Ich interessiere mich für die Situation, in der der Host-Kernel Linux ist und konfiguriert ist, um eine Überbelegung zu verhindern (was durch eine detaillierte Abrechnung des gesamten festgeschriebenen Speichers geschieht).Müssen mmap/mprotect-readonly null Seiten in Richtung festgeschriebenem Speicher gezählt werden?
Wenn ich nur die Daten, die meine Anwendung nicht mehr von der Belegung des physischen Speichers oder die Auslagerung auf die Festplatte (Ressourcenverschwendung so oder so) verhindern will, kann ich den Kernel, der es nicht benötigt, oder mmap
neue Nullseiten über Spitze davon. Aber keiner dieser Ansätze wird notwendigerweise die Menge an Speicher reduzieren, die als festgeschrieben gilt, und die anderen Prozesse können dann nicht verwendet werden.
Was passiert, wenn ich die Seiten durch neue Nullseiten ersetze, die schreibgeschützt sind? Meine Absicht ist, dass sie nicht auf festgeschriebenen Speicher zählen, und weiter, dass ich später mprotect
verwenden kann, um sie beschreibbar zu machen, und dass es fehlschlagen würde, wenn sie beschreibbar über das festgeschriebene Speicherlimit gehen würde. Ist mein Verständnis richtig? Ob das funktioniert?
Ein Nur-Lese-Seite sollte nicht in einem Verfahren in Betracht gezogen werden begehen Ladung (Ich habe keinen Bezug zur Hand haben, so ist dies keine Antwort) und Linux bietet die MAP_NORESERVE Flag, das Sie ein noch geben sollte stärker Garantie. Aber ich muss fragen: Warum hast du das Bedürfnis, Speicher zu reservieren, der nicht benutzt wird? – Anon
Bad Things (tm) würde passieren, wenn die gleichen virtuellen Adressen durch "mmap" (zufällig) zugeordnet wurden, ohne dass das Programm davon Kenntnis hatte. :-) Wie bei MAP_NORESERVE befürchte ich, dass die Seiten nicht gezählt werden, auch wenn ich sie später beschreibbar mache. Ich nehme an, ich könnte sie einfach mit neuen Nullseiten überlesen. –
Welche schlimmen Dinge würden passieren? Warum muss Ihr Programm den zuvor verwendeten Adressraum niemals wiederverwenden? Das scheint sehr ungewöhnlich. – Angus