Ist die Speicherzuweisung ein Systemaufruf?

Lesezeit: 5 Minuten

Jims Benutzeravatar
Jim

Ist die Speicherzuweisung ein Systemaufruf? Zum Beispiel, malloc und new. Wird der Heap von verschiedenen Prozessen gemeinsam genutzt und vom Betriebssystem verwaltet. Was ist mit privatem Heap? Wenn die Speicherzuweisung im Heap vom Betriebssystem verwaltet wird, wie teuer ist das?

Ich hätte auch gerne ein paar Links zu Orten, wo ich mehr über dieses Thema lesen kann.

Benutzeravatar von André Caron
Andre Caron

Im Algemeinen, malloc und new Führen Sie nicht bei jedem Aufruf einen Systemaufruf aus. Sie verwenden jedoch einen untergeordneten Mechanismus, um große Speicherseiten zuzuweisen. Unter Windows ist der untere Mechanismus VirtualAlloc(). Ich glaube, auf POSIX-Systemen ist dies etwas gleichwertig mmap(). Beide führen einen Systemaufruf aus, um dem Prozess auf Betriebssystemebene Speicher zuzuweisen. Nachfolgende Zuordnungen verwenden kleinere Teile dieser großen Seiten, ohne dass ein Systemaufruf erfolgt.

Der Heap ist normalerweise ein innerer Prozess und wird nicht von Prozessen gemeinsam genutzt. Wenn Sie dies benötigen, verfügen die meisten Betriebssysteme über eine API zum Zuweisen geteilte Erinnerung. Ein portabler Wrapper für diese APIs ist im verfügbar Boost.Interprozess Bibliothek.

Wenn Sie mehr über die Speicherzuweisung und den Zusammenhang mit dem Betriebssystem erfahren möchten, sollten Sie einen Blick in ein gutes Buch über Betriebssysteme werfen. Ich empfehle immer Modern Operating Systems von Andrew S. Tanenbaum, da es sehr einfach zu lesen ist.

  • Auf Linux-Systemen brk(2) und sbrk(2) daneben verwendet werden mmap(2). Ich möchte auch erwähnen, dass Knuths AOCP Vol. I ist auch eine großartige Referenz für die Speicherzuweisung.

    – jmbr

    30. Juni 2011 um 6:19 Uhr

  • Dies hängt von der Laufzeit ab. Mit Visual Studio 2010 Release Library malloc und free call HapAlloc / HeapFree direkt, daher gibt es für jede Allokation einen Systemaufruf. VirtualAlloc wird dann von den Heap-Funktionen verwendet.

    – Suma

    30. Juni 2011 um 6:27 Uhr


  • @Suma: HeapAlloc ist kein Systemaufruf und führt nicht unbedingt einen Systemaufruf aus.

    – Benutzer541686

    29. August 2013 um 6:46 Uhr

  • @Mehrdad HeapAlloc ist in der kernel32.dll definiert, wenn das kein System ist, was dann?

    – Suma

    29. August 2013 um 10:29 Uhr

  • @Suma: Ein “Systemaufruf” ist nicht als “in Kernel32 definiert” definiert. Ein Systemaufruf wird (genauer gesagt) als etwas definiert, das die aufruft syscall oder sysenter Anweisung. Diese Anleitung ist drin ntdll.dllnicht kernel32.dll. Und sie sind innerhalb von Funktionen, deren Namen mit beginnen Nt und Zwnicht Rtl. Und tatsächlich, HeapAlloc Anrufe RtlAllocateHeapwas geht nicht unbedingt Systemaufrufe durchführen.

    – Benutzer541686

    29. August 2013 um 14:49 Uhr

Benutzeravatar von Mat
Matte

(Unter der Annahme eines Betriebssystems mit Speicherschutz. Kann z. B. bei eingebetteten Geräten nicht der Fall sein.)

Ist die Speicherzuweisung ein Systemaufruf?

Nicht unbedingt jede Zuordnung. Der Prozess muss den Kernel aufrufen, wenn sein Heap nicht bereits groß genug für die angeforderte Zuweisung ist, aber C-Bibliotheken fordern normalerweise größere Blöcke an, wenn sie dies tun, um die Anzahl der Systemaufrufe zu reduzieren.

Wird der Heap von verschiedenen Prozessen gemeinsam genutzt und vom Betriebssystem verwaltet. Was ist mit privatem Heap?

Der Heap wird nicht von Prozessen gemeinsam genutzt. Es wird jedoch zwischen Threads geteilt.

Wie teuer Systemaufrufe für die Kernel-Speicherzuweisung sind, hängt vollständig vom Betriebssystem ab. Da dies sehr häufig vorkommt, können Sie davon ausgehen, dass es unter normalen Umständen effizient ist. In Situationen mit wenig RAM wird es kompliziert.

Sarats Benutzeravatar
Sarat

Siehe die mehrschichtige Speicherverwaltung in Win32.

Geben Sie hier die Bildbeschreibung ein

Die Speicherzuweisung ist immer ein Systemaufruf, aber die Zuweisung erfolgt als Seiten. Wenn in den festgeschriebenen Seiten Speicherplatz verfügbar ist, weist der Speichermanager den angeforderten Speicherplatz zu, ohne den Kernelmodus zu ändern. Das Beste an HeapAlloc ist, dass es eine feine Kontrolle über die Zuweisung bietet, wobei Virtual Alloc die Zuweisung für eine einzelne Seite rundet. Dies kann zu einer übermäßigen Nutzung des Arbeitsspeichers führen.

Grundsätzlich werden der Standard-Heap und die privaten Heaps gleich behandelt, außer dass die Standard-Heap-Größe während der Verknüpfungszeit angegeben wird. Die Standard-Heap-Größe beträgt 1 MB und wächst nach Bedarf.

  • "Memory allocation is always a system call" Dies impliziert, dass jeder Anruf an malloc() führt zu einem Systemaufruf (Übergang in den Kernel-Modus), der zu 100 % falsch ist.

    – Jonathon Reinhart

    27. Februar 2015 um 1:57 Uhr

Benutzeravatar von Zarathustra
Zarathustra

Speicherzuordnungsfunktionen und Sprachanweisungen wie malloc/free und new/delete sind keine Systemaufrufe. Malloc\free ist Teil der C\C++-Bibliothek und new\delete ist Teil des C++-Laufzeitsystems. Aufrufe von beiden können gelegentlich zu den Systemaufrufen führen. In den anderen Sprachen wird die Speicherzuordnung auf ähnliche Weise implementiert.

Im Allgemeinen kann die Speicherverwaltung nicht ohne Einbeziehung des Betriebssystems implementiert werden, da der Speicher eine der Hauptsystemressourcen ist und aufgrund dieser globalen Speicherverwaltung durch den Betriebssystemkern erfolgt. Aber aufgrund der Tatsache, dass die Systemaufrufe relativ teuer sind, versuchen die Leute, Sprachen und Speicherzuweisungsbibliotheken so zu gestalten, dass die Anzahl der Systemaufrufe minimiert wird.

Wie ich weiß, ist Heap eine prozessinterne Entität. Das bedeutet, dass alle Speicherzuweisungs-/Freigabeanforderungen vollständig vom Prozess selbst verwaltet werden. Das Betriebssystem kennt nur den Speicherort und die Größe des Heapspeichers und bedient zwei Arten von Anforderungen vom prozessinternen Speicherverwaltungssystem:

add memory page at virtual address X
release memory page from virtual address X

Das lokale Speicherverwaltungssystem fordert diese Dienste an, wenn es entscheidet, dass es nicht genügend Speicher im Speicherpool des Heaps hat, und wenn es entscheidet, dass es zu viel Speicher im Speicherpool des Heaps hat. Trotz der Tatsache, dass die Speicherzuweisung normalerweise so ausgelegt ist, dass die Anzahl der Systemaufrufe minimiert wird, bleibt sie immer noch ungefähr teurer als die Speicherzuweisung auf dem Stack. Dies liegt daran, dass die Algorithmen zur Speicherzuweisung und Freigabe von Heap viel komplexer und teurer sind als die gleichen von Stack.

1412960cookie-checkIst die Speicherzuweisung ein Systemaufruf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy