Vorteile der anonymen mmap über malloc unter Speicherdruck ist
Ich bin mit einigen großen array processing-code (auf einem Pentium unter Linux). Die Größen der arrays sind groß genug für die Prozesse, die zu tauschen. So weit es funktioniert, wahrscheinlich, weil ich versuche meine Lesen und schreibt aneinander. Allerdings werde ich bald behandeln müssen, dass größere arrays. In diesem Szenario würde die Umstellung auf anonyme mmapped blocks helfen ?
Wenn ja, würden Sie bitte erklären, warum.
In mein oberflächliches Verständnis, mmap implementiert eine memory-mapped-Datei montiert, die aus einer tmpfs-partition, die unter Speicherdruck würde zurückgreifen, um die swapping-Mechanismus. Was würde ich gerne verstehen, wie die mmap es besser machen als die standard-malloc (für den sake oder argument ich gehe davon aus, dass es in der Tat besser, ich weiß nicht, ob es so ist).
Hinweis: Bitte nicht vorschlagen, immer eine 64 bit und mehr RAM. Dass, leider, ist keine option.
- versuchen Sie, benchmarking...
- Ich schlage vor Wechsel zu... ach nevermind. Einfach warten, bis die Katze das bellen. Auch, Profil, Profil, Profil. Ich nicht erwarten, würde es keinen Unterschied, aber je nach Nutzungsverhalten könnte es sein.
- Weizen Der mmaped-interface implementierte. Vor der Umsetzung möchte ich wissen, ob es eine realistische chance, es besser machen und warum
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Speicher, Rücken Ihre
malloc()
Zuweisungen erfolgt durch den kernel in der gleichen Weise wie der Speicher, den Rücken private anonyme mappings erstellt mitmmap()
. In der Tat, für große Zuweisungenmalloc()
wird eine anonyme Zuordnung mitmmap()
zu Rücken ist es sowieso, so sind Sie kaum zu sehen, viel Unterschied, indem Sie explizit mitmmap()
selbst.Am Ende des Tages, wenn Ihre arbeiten eingestellt übersteigt der Größe des physikalischen Speichers, dann müssen Sie tauschen, und ob Sie anonyme mappings erstellt mit
mmap()
odermalloc()
ist nicht zu ändern. Die beste Sache, die Sie tun können, ist zu versuchen und gestalten Sie Ihren Algorithmus so, dass es gut locality of reference, die reduzieren das Ausmaß, zu dem swap weh tut.Können Sie auch versuchen zu geben, die der kernel einige Hinweise über Ihre Nutzung der Speicher mit der
madvise()
system nennen.Der wesentliche Unterschied ist hier, dass mit
malloc(3)
-ed-input-buffers Sie bitten, den kernel zu kopieren der Daten aus der Datei zugeordnet, werden Seiten, die bereits im Speicher, während mitmmap(2)
verwenden Sie einfach diese Seiten. Der erste Ansatz verdoppelt die Menge an physischen Speicher, die benötigt werden, um zu sichern, sowohl in Ihrem als auch im kernel-Puffer, während der zweite Ansatz teilt, dass der physische Speicher und erhöht nur die Anzahl der virtuellen mappings für die useland Prozess.