Malloc, Multiheap
Standardmäßig verwendet das Subsystem malloc einen einzelnen Heapspeicher oder einen freien Speicherpool.
Es bietet jedoch auch eine optionale Funktion für mehrere Heapspeicher, die die Verwendung mehrerer Heapspeicher freien Speichers anstelle von nur einem Heapspeicher ermöglicht.
Der Zweck der Bereitstellung von Mehrfach-Heapspeicherfunktionalität im Subsystem malloc besteht darin, die Leistung von Thread-Anwendungen zu verbessern, die auf Multiprozessorsystemen ausgeführt werden. Wenn das Subsystem malloc auf die Verwendung eines einzelnen Heapspeichers beschränkt ist, werden gleichzeitige Speicherzuordnungsanforderungen serialisiert, die von Threads empfangen werden, die auf separaten Prozessoren ausgeführt werden. Das Subsystem malloc kann daher nur jeweils einen Thread bedienen, was schwerwiegende Auswirkungen auf die Multiprozessorsystemleistung hat.
Wenn die Multiheapspeicherfunktion von malloc aktiviert ist, erstellt das Subsystem malloc eine feste Anzahl Heapspeicher für seine Verwendung. Es beginnt mit der Verwendung mehrerer Heapspeicher, nachdem der zweite Thread gestartet wurde (der Prozess wird zu einem Multithread). Jede Speicherzuordnungsanforderung wird mit einem der verfügbaren Heapspeicher bedient. Das Subsystem malloc kann dann Speicherzuordnungsanforderungen parallel verarbeiten, solange die Anzahl der Threads, die gleichzeitig den Service anfordern, kleiner-gleich der Anzahl der Heapspeicher ist.
Wenn die Anzahl der Threads, die gleichzeitig Service anfordern, die Anzahl der Heapspeicher überschreitet, werden zusätzliche gleichzeitige Anforderungen serialisiert. Sofern dies nicht fortlaufend geschieht, sollte die Gesamtleistung des Subsystems malloc deutlich verbessert werden, wenn mehrere Threads Aufrufe an die Subroutine malloc in einer Multiprozessorumgebung absetzen.
malloc multiheap aktivieren
Malloc multiheap ist standardmäßig nicht aktiviert. Sie wird durch Festlegen der Umgebungsvariablen MALLOCOPTIONS aktiviert und konfiguriert. Um malloc multiheap mit den Standardeinstellungen zu aktivieren, setzen Sie MALLOCOPTIONS=multiheap vor dem Prozessstart. Wenn Sie MALLOCOPTIONS auf diese Art und Weise festlegen, wird malloc multiheap in seiner Standardkonfiguration mit 32 Heapspeichern und dem Auswahlalgorithmus für schnellen Heapspeicher aktiviert.
Malloc-Multiheap-Optionen
Die Malloc Multiheap-Optionen lauten wie folgt:
- Multiheap: n
- Rücksichtsgröße
Jede dieser Optionen wird später in diesem Dokument detailliert beschrieben.
Verwenden Sie die folgende Syntax, um eine dieser Optionen festzulegen:
MALLOCOPTIONS=[multiheap:n] | [considersize]Eine oder beide Optionen können in beliebiger Reihenfolge angegeben werden, sofern die Optionen durch Kommas getrennt sind. Beispiel:
MALLOCOPTIONS=multiheap:3,considersizeIm vorherigen Beispiel würde malloc multiheap mit drei Heapspeichern und einem etwas langsameren Auswahlalgorithmus für Heapspeicher aktiviert, der versucht, die Prozessgröße zu minimieren.
Jede Konfigurationsoption sollte nur einmal angegeben werden, wenn MALLOCOPTIONSfestgelegt wird. Wenn eine Konfigurationsoption mehrmals pro Einstellung angegeben wird, wird nur die letzte Instanz angewendet.
Die Multiheap-Optionen für Malloc werden wie folgt beschrieben:
- Multiheap: n
- Standardmäßig beträgt die maximale Anzahl der Heapspeicher, die für malloc multiheap verfügbar sind, 32. Die Option multiheap: n kann verwendet werden, um die maximale Anzahl der Heapspeicher in einen beliebigen Wert von 1 bis 32 zu ändern, wobei n die Anzahl der Heapspeicher ist. Wenn n auf einen Wert außerhalb des angegebenen Bereichs gesetzt wird, wird der Standardwert 32 verwendet. Aktivieren Sie nur so viele Heapspeicher, wie für die Prozessanforderungen erforderlich sind. Unnötigerweise aktivierte Heapspeicher können die Fragmentierung und Verschwendung erhöhen.
- rücksichtsgröße
- Standardmäßig wählt malloc multiheap den nächsten verfügbaren Heapspeicher aus. Wenn die Option considersize angegeben wird, verwendet malloc multiheap einen alternativen Algorithmus zur Heapspeicherauswahl, der versucht, einen verfügbaren Heapspeicher auszuwählen, der über ausreichend freien Speicherbereich für die Verarbeitung der Anforderung verfügt. Dies kann die Arbeitsspeichergröße des Prozesses minimieren, indem die Anzahl der sbrk -Subroutinenaufrufe reduziert wird. Aufgrund der zusätzlich erforderlichen Verarbeitung ist der Algorithmus für die Heapspeicherauswahl considersize jedoch etwas langsamer als der Standardalgorithmus für die Heapspeicherauswahl.
Wenn die Heapspeicher keinen Speicherbereich zuordnen können, gibt die Subroutine malloc NULL zurück und setzt die Fehlernummer auf ENOMEM. Wenn im aktuellen Heapspeicher kein Hauptspeicher verfügbar ist, überprüft das Subsystem malloc die anderen Heapspeicher auf verfügbaren Speicherbereich.