/ / Speicher ordnungsgemäß mit einem Pool von Strukturen - c, memory, memory-management, pool

Behandeln Sie Speicher ordnungsgemäß mit einem Pool von Strukturen - c, Speicher, Speicherverwaltung, Pool

Ich habe ein Programm mit drei Pools von Strukturen. Für jeden benutze ich eine Liste der verwendeten Strukturen und eine andere für die nicht verwendeten Strukturen. Während der Ausführung verbraucht das Programm Strukturen und gibt sie bei Bedarf an den Pool zurück. Außerdem gibt es einen Müllsammler, der die "Zombie" -Strukturen säubert und in den Pool zurückgibt.

Zu Beginn der Ausführung zeigt der virtuelle Speicher erwartungsgemäß etwa 10 GB * zugewiesenen Speicher. Wenn das Programm den Pool verwendet, erhöht sich der RSS-Speicher.

Obwohl die verwendeten Knoten wieder im Pool sind,Als nicht verwendete Knoten markiert, nimmt der RSS-Speicher nicht ab. Ich erwarte das, weil das Betriebssystem nicht weiß, was ich mit dem Speicher mache, und nicht merken kann, ob ich es wirklich nutze oder einen Pool verwalte.

Was ich möchte, ist, den ungenutzten Speicher zu zwingen, zum virtuellen Speicher zurückzukehren, wann immer ich möchte, zum Beispiel, wenn der RSS-Speicher über X GB ansteigt.

Gibt es eine Möglichkeit, mit dem Speicherzeiger einen Speicherbereich zu markieren, um ihn in den virtuellen Speicher zu legen? Ich weiß, dass dies die Verantwortung des Betriebssystems ist, aber vielleicht gibt es eine Möglichkeit, dies zu erzwingen.

Vielleicht sollte mir das egal sein, was denkst du?

Danke im Voraus.

  • Hinweis 1: Dieses Programm wird im High Performance Computing verwendet, deshalb "verwendet" es diese Menge Speicher.

Ich gebe ein Bild von der Poolnutzung gegenSpeichernutzung für einige Dateien. Wie Sie sehen, ist der plötzliche Rückgang der Poolnutzung auf den Garbage Collector zurückzuführen. Was ich gerne sehen würde, ist dieser Rückgang in der Speichernutzung.

Struct Pools Usage & Memory Usage

Antworten:

1 für die Antwort № 1

Sie können dies tun, solange Sie Ihr Gedächtnis über mmap und nicht über malloc zuordnen. Sie möchten das verwenden madvise Funktion mit der POSIX_MADV_DONTNEED Streit.

Denken Sie daran, mit madvise zu laufen POSIX_MADV_WILLNEED bevor Sie sie erneut verwenden, um sicherzustellen, dass sich tatsächlich Speicher hinter ihnen befindet.

Dies garantiert zwar nicht das Auslagern der Seiten, gibt dem Kernel jedoch einen deutlichen Hinweis, dies zu tun, wenn er Zeit hat.