Ich schreibe ein Programm (ein Theorembeweiser, wie es passiert), dessen Speicherbedarf "so viel wie möglich, bitte" ist; das heißt, es kann immer besser sein, indem mehr Speicher verwendet wird, für praktische Zwecke ohne Obergrenze, also ist es eigentlich notwendig, genau so viel Speicher zu verwenden, wie verfügbar ist, nicht mehr und nicht weniger. Ich kann herausfinden, wie man Daten priorisiert, um den Speicher mit dem niedrigsten Wert zu löschen, wenn der Speicher knapp wird; Das Problem, das ich versuche zu lösen, ist, wie man es erkennt, wenn das passiert.
Idealerweise hätte ich gerne einen Systemaufruf, der sagt "wie viel Speicher noch übrig ist" oder "haben wir nicht genug Speicher?"; soweit ich das beurteilen kann, gibt es so etwas nicht?
Natürlich kann malloc aus dem Speicher signalisieren, indem es 0 zurückgibt, und neu kann einen Handler aufrufen; Das sind keine idealen Signale, aber wären besser als nichts. Ein Problem ist jedoch, dass ich wirklich wissen möchte, wann das physische Gedächtnis ausgeht, so dass ich es vermeiden kann, tief in den Tausch einzudringen und dadurch alles zum Stillstand kommen zu lassen; Ich glaube nicht, dass es eine Möglichkeit gibt zu fragen "Müssen wir schon tauschen?" oder sagen Sie dem Betriebssystem: "Tauschen Sie nicht auf meinem Konto, scheitern Sie einfach meine Anforderungen, wenn es dazu kommt"?
Ein anderer Ansatz wäre, herauszufinden, wie viel RAM sich in der Maschine befindet und wie viel Speicher das Programm gerade benutzt. Soweit ich weiß, gibt es im Allgemeinen keine Möglichkeit, Ersteres zu sagen? Ich habe auch den Eindruck, dass es keinen zuverlässigen Weg gibt, letzteres zu sagen, außer dass malloc / free mit einer Buchhalterfunktion umschlossen wird (was dann in C ++ problematischer ist).
Gibt es irgendwelche Ansätze, die ich vermisse?
Das Ideal wäre eine tragbare Lösung, aber ich vermute, dass das nicht passieren wird. Andernfalls wäre eine Lösung, die unter Windows funktioniert und eine andere, die unter Unix funktioniert, nett. Wenn das nicht klappt, könnte ich mit einer Lösung zurechtkommen, die unter Windows funktioniert, und einer anderen, die unter Linux funktioniert.
Ich denke, der nützlichste und flexibelste Weg, den gesamten verfügbaren Speicher zu nutzen, besteht darin, dem Benutzer die Angabe zu geben, wie viel Speicher er verwenden soll.
Lassen Sie den Benutzer es in eine Konfigurationsdatei oder über eine Schnittstelle schreiben und erstellen Sie dann einen Zuordner (oder etwas Ähnliches), der nicht mehr als diesen Speicher zur Verfügung stellt.
Auf diese Weise müssen Sie keine Statistiken über den aktuellen Computer finden, da dies immer durch die Tatsache beeinflusst wird, dass das Betriebssystem auch andere Programme ausführen könnte. Sprechen Sie nicht einmal über die Art und Weise, wie das Betriebssystem den Cache verwaltet, die Unterschiede zwischen 32 und 64 Bit, wodurch der Adressraum Ihre Zuweisungen einschränken kann.
Am Ende ist die menschliche Intelligenz (vorausgesetzt, der Benutzer kennt den Kontext der Verwendung) preiswerter zu implementieren, wenn er vom Benutzer bereitgestellt wird.
Wenn Sie auf malloc
setzen, um 0 zurückzugeben, wenn kein Speicher verfügbar ist, kann dies unter Linux zu Problemen führen, da Linux übergibt Speicherzuweisungen . malloc
gibt normalerweise einen gültigen Zeiger zurück (außer der Prozess ist außerhalb des virtuellen Adressraums), aber der Zugriff auf den Speicher, auf den er zeigt, kann die " OOM Killer ", ein Mechanismus, der Ihren Prozess oder einen anderen Prozess im System zum Erliegen bringt. Der Systemadministrator kann dieses Verhalten anpassen .
Die beste Lösung, die ich mir vorstellen kann, ist die Abfrage, wie viele Seitenfehler innerhalb der letzten Sekunde aufgetreten sind. Wenn viel Swapping stattfindet, sollten Sie wahrscheinlich etwas Speicher freigeben, und wenn nicht, können Sie versuchen, mehr Speicher zuzuweisen.
Unter Windows kann WMI Ihnen wahrscheinlich einige Statistiken geben kann verwenden.
Aber es ist ein schwieriges Problem, da es keine harte Grenze gibt, können Sie das OS fragen und dann unter bleiben. Sie können Speicher weiterhin weit über den Punkt hinaus zuweisen, an dem Ihnen der physische Speicher ausgegangen ist, was bedeutet, dass Sie Ihren Prozess durch exzessives Auslagern lahmlegen.
Also das Beste, was Sie wirklich tun können, ist eine Art Annäherung.
Sie können Speicher weiterhin über den Punkt hinaus zuweisen, an dem es sinnvoll ist - d. h. das, was das Betriebssystem erfordert, um wichtige Dinge auszutauschen oder auszulagern. Das Problem ist, es ist nicht unbedingt einfach zu sagen, wo das ist.
Wenn Ihre Aufgabe eine (signifikante) IO ausführt, müssen Sie noch etwas für die OS-Puffer übrig haben.
Ich empfehle nur zu prüfen, wie viel es in der Maschine gibt, und dann einen Betrag als Funktion davon zuzuweisen (Anteil, oder lasse etwas frei usw.).
Tags und Links c c++ windows linux memory-management