2013-08-03 9 views
7

Vor kurzem sah ich den folgenden Beitrag:Wie lauten die Windows- und Linux-nativen OS/System-Aufrufe von malloc()?

Ein Speicherzuordner als malloc nicht niedriger Ebene ist. (Der Standardverteiler ruft malloc normalerweise direkt oder indirekt auf.)

Ein Zuweiser erlaubt Ihnen nur, verschiedene Zuweisungsstrategien anzugeben. Sie können beispielsweise einen Zuordner verwenden, der malloc einmal aufruft, um einen großen Speicherpool abzurufen, und dann für nachfolgende Zuordnungsanforderungen nur einen kleinen Teil dieses Pools zurückgibt.

Oder Sie können es als einen Haken verwenden, um Ihnen zu ermöglichen, einige zusätzliche Aufgabe jedes Mal durchzuführen, wenn Speicher zugewiesen oder freigegeben wird.

Was Ihre zweite Frage betrifft, ist malloc der niedrigste, den Sie ohne verlieren können. malloc wird in der Regel mit einigen OS-spezifische Speicherzuweisung Funktion implementiert, so dass die untere Ebene wäre noch. Aber das hat nichts mit Ihrer Hauptfrage zu tun, da C++ Allokatoren eine Abstraktion auf höherer Ebene sind.

aus: C++: Memory allocators

Meine Frage ist-wie malloc wird in den folgenden Betriebssystemen implementiert?

  • für Windows
  • für Linux

was sind die OS-spezifische Funktionen, die dem Namen/Implementierungen von malloc sind()?

+0

für Linux, es ist 'sbrk' –

+0

Für welche Implementierung der Standard Library? "neu"/"malloc" ist nicht notwendigerweise Teil der OS-API selbst, z. unter Windows, die nur 'HeapAlloc',' VirtualAlloc' usw. als Teil ihrer API hat. – dyp

+0

Nein, 'sbrk' ist unter Linux fast veraltet, es verwendet' mmap' –

Antwort

8

In Windows, in aktuellen Versionen von MSVC, ruft malloc (und C++ new, wie es mit den gleichen Grundlagen für die tatsächliche Speicherzuweisung Teil new implementiert) HeapAlloc(). In anderen Versionen, wie zum Beispiel g ++ mingw, ist die C-Runtime eine ältere Version, die nicht ganz so direkt an HeapAlloc aufruft, aber an der Basis geht es immer noch auf HeapAlloc - um etwas anderes zu finden, müssen wir gehen zurück zu Windows Pre-95, die eine GlobalAlloc und LocalAlloc Reihe von Funktionen hatte - aber ich glaube nicht, dass Menschen 16-Bit-Compiler in diesen Tagen verwenden - zumindest nicht für Windows-Programmierung.

In Linux, wenn Sie glibc verwenden, hängt es von der Größe der Zuordnung, ob es nennt sbrk oder mmap - mmap (mit MAP_ANONYMOUS in dem Flags) für größere Zuweisungen verwendet wird (über eine Schwelle, die ich glaube, ist 2MB in der typischen Implementierung)

+0

"In Windows in neueren Versionen" -> Verwenden das alle Implementierungen der Standardbibliotheken (von C und C++) für Windows? (Ich weiß, das MSVC tut) – dyp

+0

Da G ++ (mingw - nicht sicher, wie Cygwin funktioniert) verwendet die MSVC (obwohl eine ältere Version, die möglicherweise nicht direkt auf HeapAlloc zuordnen), ja. Mir ist keine C- oder C++ - Bibliothek bekannt, die etwas anderes als HeapAlloc verwendet, um tatsächlich eine Menge Speicher von Windows zu erhalten - es sei denn, wir gehen so weit zurück, dass 'LocalAlloc' und' GlobalAlloc' verwendet werden, aber dann reden wir 16-Bit-Fenster –

+0

Unser Projekt verwendet ptmalloc() und dlmalloc() mit MSVC unter Windows, die sbrk() mit VirtualAlloc() emulieren. –

4

Meine Frage ist - wie wird malloc in den folgenden Betriebssystemen implementiert?

Unter Linux gibt es zwei berühmte malloc Implementierungen:

dlmalloc (Doug Lea malloc)

ptmalloc

Unter Linux libc wie glibc, eglibc oder newlib zu implementieren ptmalloc oder eine Variante von ptmalloc .

Was sind die OS-spezifischen Funktionen, die/Implementierungen von malloc() genannt werden?

Auf Unix- und Linux-Systemen werden sbrk und mmap Systemaufrufe verwendet. Weitere Informationen finden Sie unter man 2 sbrk und man 2 mmap.

+1

'mmap' ist mehr verwendet als' sbrk', das veraltet ist (d. H. Nicht multithreadfreundlich ist). –

+0

@BasileStarynkevitch Zeiger auf 'mmap' hinzugefügt – ouah

1

Okay, bin ich über Linux nicht sicher, aber wenn es um die Fenster kommt ...

Speicher kann in zwei kategorisiert Orten zugeordnet werden.

1) Heaps (Process Heap, Gewohnheit schuf Heaps) siehe ->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx Funktionen wie HeapAlloc & HeapFree verwenden. LocalAlloc und LocalFree können als 'Verknüpfungen' zu HeapAlloc verwendet werden, wenn Sie im Standardprozess-Heap reservieren möchten.

2) Virtueller Speicher (normalerweise nur prozessspezifisch aufgrund von Zugriffsbeschränkungen im globalen virtuellen Speicher für die Sicherheit), mit VirtualAlloc, VirtualFree. siehe ->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx

Nach meinem Wissen wird malloc die Heap-Zuweisung Funktionen auf Windows verwenden.

Ich hoffe, das hilft.

+0

" Die globalen und lokalen Funktionen werden für die Portierung von 16-Bit-Code unterstützt "[von hier] (http://msdn.microsoft.com/en-us/library/aa366596%28v = vs.85% 29.aspx) -> nicht 'LocalAlloc' verwenden – dyp

+0

Der mit den' Heap * '- Funktionen zugewiesene Speicher ist auch" lokal "für den Prozess. IMO, Ihre Antwort schlägt vor, dass ein Heap und virtueller Speicher zwei unabhängige Dinge sind - was sie nicht sind. Ein Heap verwendet "virtuellen Speicher", d. H. Virtuellen Adressraum und physischen Speicher. So tun die 'Virtual *' Funktionen, sie befassen sich nicht nur mit virtuellem Adressraum. – dyp

+0

@DyP Der erste Kommentar ist richtig: Verwenden Sie nicht mehr 'LocalAlloc', das ist eine Spur von 16-Bit-Windows. Verwenden Sie immer 'HeapAlloc'. Aber der zweite Teil ist nicht * genau * korrekt. Selbst in Win32 sind der lokale und der globale Heap zwei etwas unterschiedliche Dinge.Speicher, der von einem zugewiesen wurde, kann nicht auf dem anderen freigegeben werden. Obwohl Sie richtig sind, dass sie semantisch ähnlich und sowohl "lokal" als auch prozessorientiert sind, sind sie nicht identisch. –

1

malloc() und Freunde gelten als Teil des Laufzeitsystems, das mit einem Compiler geliefert wird. Daher kann und verwendet jeder Compiler verschiedene OS-Aufrufe, um malloc zu implementieren.

Wie andere gesagt haben, sind unter Linux die Optionen sbrk() und mmap().

Unter Windows sind die Optionen HeapAlloc() und VirtualAlloc().

Verwandte Themen