Implementiert jedes Betriebssystem Puffer für malloc ()?

8

Eine Menge von c / malloc () 's in einer for / while / do kann viel Zeit verbrauchen, daher bin ich neugierig, ob irgendein Betriebssystem Speicher für schnelle mallocs puffert.

Ich habe darüber nachgedacht, ob ich mallocs beschleunigen könnte, indem ich einen "gierigen" Wrapper für malloc schreibe. Z.B. wenn ich nach 1MB Speicher frage, würde der ursprüngliche Zuordner 10MB zuweisen und beim zweiten, dritten, vierten usw. Aufruf würde die malloc-Funktion einfach Speicher von dem zuerst dem "normalen" Weg zugewiesenen Block zurückgeben. Natürlich, wenn nicht genügend Speicher verfügbar ist, müssten Sie einen neuen gierigen Speicherblock reservieren.

Irgendwie denke ich, dass jemand das oder etwas Ähnliches vorher getan haben muss. Also meine Frage ist einfach: Ist das etwas, das den Speicherzuweisungsprozess erheblich beschleunigen wird? (Ja, ich hätte es versuchen können, bevor ich die Frage gestellt habe, aber ich bin einfach zu faul, um so etwas zu schreiben, wenn es nicht nötig ist)

    
Waxhead 04.09.2010, 15:46
quelle

5 Antworten

3

Alle Versionen von malloc() puffern den Typ, den Sie beschreiben, in gewissem Umfang - sie greifen einen größeren Chunk als die aktuelle Anfrage und verwenden den großen Chunk, um mehrere Anfragen zu erfüllen, aber nur bis zu einer bestimmten Anfrage. Das bedeutet, dass mehrere Anforderungen für jeweils 16 Bytes nur einmal alle 50-100 Aufrufe oder etwas in diesen allgemeinen Zeilen mehr Speicher vom Betriebssystem erfordern.

Was weniger klar ist, ist die Grenzgröße. Es kann gut sein, dass sie ein relativ kleines Vielfaches von 4 KiB gleichzeitig zuweisen. Größere Anfragen - MiB-Größenanfragen - gehen jedes Mal, wenn die Anfrage aus der Liste heraus nicht befriedigt werden kann, wieder zu mehr Speicher. Dieser Schwellenwert ist jedoch typischerweise deutlich kleiner als 1 MiB.

Einige Versionen von malloc() ermöglichen es Ihnen, ihre Zuweisungsmerkmale in mehr oder weniger großem Umfang einzustellen. Es war ein fruchtbares Forschungsgebiet - viele verschiedene Systeme. Siehe Knuth "Die Kunst der Computerprogrammierung" Band 1 (Fundamentale Algorithmen) für eine Reihe von Diskussionen.

    
Jonathan Leffler 04.09.2010, 16:11
quelle
3

Als ich vor einiger Zeit den Google Chrome-Code durchsucht habe, habe ich Ссылка gefunden. Es ist eine kostenlose, universelle und skalierbare malloc-Implementierung.

Scheinbar wird es in zahlreichen Projekten verwendet, da es die Standard-Malloc-Implementierungen in vielen realen Szenarien meist übertrifft (viele kleine Zuordnungen anstelle von wenigen großen).

Auf jeden Fall einen Blick wert!

    
Milan 04.09.2010 16:04
quelle
2

Diese Technik wird Slab Allocator genannt, und die meisten Betriebssysteme unterstützen sie, aber ich kann keine Informationen finden es ist nur für Kernel-Zuweisungen für den Benutzerbereich malloc verfügbar.

Hier finden Sie den Artikel von Jeff Bonwick , der die ursprüngliche Technik beschreibt auf Solaris.

    
Matias Valdenegro 04.09.2010 16:10
quelle
1

Google hat eine gierige Implementierung von malloc (), die in etwa dem entspricht, was Sie denken. Es hat einige Nachteile, aber es ist sehr schnell in vielen Anwendungsfällen.

    
Chris 04.09.2010 16:16
quelle
-2

Was Sie sagen, ist wahrscheinlich getan, ich weiß es nicht wirklich. Ich weiß jedoch nicht, dass die Latenz bei der Pufferung von malloc () auf Systemebene die Latenzzeit erheblich verringern würde. Sie müssen sich immer noch die Zeit nehmen, in priv zu gehen. Modus für einen Systemaufruf möglicherweise Sperren Kernel-Level-Strukturen (was bedeutet, mehr Systemaufrufe und warten auf die Sperren) und Dinge dieser Art.

Wenn Sie Ihren eigenen Speichermanager in user-space für Ihr Programm schreiben können und nur malloc () aufrufen, wenn Sie mehr Speicher für Ihren Pool benötigen, können Sie wahrscheinlich eine Verringerung der Latenz feststellen.

    
San Jacinto 04.09.2010 16:08
quelle

Tags und Links