Welche Möglichkeiten gibt es, um den Speicherbedarf in C-Programmen unter Linux (* nix) zu minimieren?Minimieren des Speicherbedarfs in C-Programmen
Soweit ich weiß, verwendet libc malloc() entweder brk() oder mmap(). Speicher, der mit brk() zugewiesen wurde, kann wegen Speicherfragmentierung normalerweise nicht zurückgegeben werden.
Mein Programm sollte 24/7 arbeiten und es eine Menge malloc() - s und free() - s. Nach dem Start geht RSS auf etwa 100 MB. Es ist zu viel, weil ich sicher weiß, dass in einem bestimmten Moment weniger als 100 MB Daten im Speicher sind.
Wahrscheinlich ist es brk() Fragmentierungsproblem.
Also, was sind meine Optionen hier?
Sollte ich eine andere malloc() - Implementierung verwenden, die nur mmap() verwendet? Sollte ich etwas anderes machen? Kann ich etwas über das Problem mit dem Speicherabdruck lesen?
Danke.
Die Verwendung von 'mmap()' für jede Zuweisung wäre nicht nur langsam, sondern erhöht wahrscheinlich die Speichernutzung, da jede Zuweisung dann auf die Größe einer Speicherseite aufgerundet wird (mindestens 4k auf den meisten Plattformen). – alanc
Grundsätzlich, wenn Sie eine Menge von identischen Allocs haben, rollen Sie Ihre eigene Freelist und reservieren Sie eine Tonne von Blöcken vor.Sie können hier eine nette, lockfreie Freelist finden; http://www.liblfds.org (Interessensbekundung: Ich bin der Autor). Ich habe gerade einen Benchmark dieser Freelist gegen eine Mutex-Freelist gemacht; es ist 10x schneller auf einem Kern, 100x schneller auf zwei! –
Danke. Es ist definitiv nicht undicht. Ich werde weiter untersuchen. –