2010-07-28 14 views
12

Ich möchte mein eigenes dynamisches Speicherverwaltungssystem implementieren, um neue Funktionen hinzuzufügen, die zur Speicherverwaltung in C++ beitragen.Wie werden malloc und free implementiert?

Ich benutze Windows (XP) und Linux (Ubuntu). Was ist erforderlich, um Funktionen wie "malloc" und "free" zu implementieren? Ich denke, dass ich die niedrigsten Systemaufrufe verwenden muss.

Für Windows habe ich die Funktionen gefunden: GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy und HeapFree.

Für Linux habe ich keine Systemaufrufe für Heap-Management gefunden. Unter Linux sind malloc und free Systemaufrufe, nicht wahr?

Dank

Edit:
C++ bietet keine Garbage Collector und Garbage Collector ist langsam. Einige Zuordnungen sind leicht zu befreien, aber es gibt Zuordnungen, die einen Garbage Collector benötigen.

Ich möchte diese Funktionen implementieren und neue Features hinzufügen:
* Immer wenn free() aufgerufen wird, überprüfen Sie, ob der Zeiger zu Heap gehört.
* Hilfe bei der Garbage Collection. Ich muss einige Informationen über den zugewiesenen Block speichern.
* Verwenden Sie mehrere Heaps (HeapCreate/HeapDestroy unter Windows). Ich kann einen ganzen Haufen mit seinen zugewiesenen Blöcken schnell löschen.

+1

Sie sollten sich Boos Pools Allokatoren ansehen: http://www.boost.org/doc/libs/1_43_0/libs/pool/doc/index.html –

+2

Sind Sie sicher, dass HeapAlloc ein System (Kernel) Aufruf ist? Diese können auf der Benutzerseite implementiert werden und einige verborgene Funktionen des privaten Kernels auslösen, wenn der Prozess mehr Speicher benötigt. – doron

+0

Squall - das klingt merkwürdig wie eine Hausaufgabe aus dem Wortlaut. Ja? Nein? –

Antwort

14

Unter Linux sind malloc und free keine Systemaufrufe. malloc/free ruft Speicher vom Kernel ab, indem es das Datensegment erweitert und schrumpft (falls möglich), indem es die Systemaufrufe brk verwendet sowie anonymen Speicher mit mmap anfordert - und malloc verwaltet den Speicher innerhalb dieser Regionen. Einige grundlegende Informationen, die Sie finden können: here

+0

Eigentlich ist 'sbrk' nicht ein Systemaufruf, sondern eine Bibliotheksfunktion. – Borealid

3

brk ist der Systemaufruf, der unter Linux verwendet wird, um malloc und free zu implementieren. Versuchen Sie die Manpage für Informationen.

Sie haben die Windows-Sachen schon runter.

Die anderen Antworten hier zu sehen, würde ich gerne feststellen, dass Sie wahrscheinlich das Rad neu erfinden; Es gibt viele gute malloc Implementierungen da draußen. Aber Programmierung malloc ist eine gute Gedankenübung - werfen Sie einen Blick here für eine nette Hausaufgabe (ursprünglich CMU-Code), die das gleiche umsetzt. Ihre Shell gibt Ihnen aber ein bisschen mehr, als das Linux OS tatsächlich tut :-).

4

Wenn Sie einfach die Systemaufrufe einwickeln, dann werden Sie wahrscheinlich nichts mit der Verwendung des Standard-malloc gewinnen - das ist alles, was sie tun.

Es ist häufiger zu malloc (oder HeapAlloc() etc) ein einzelner Speicherblock am Anfang des Programms und verwalten Sie die Zuordnung in diese selbst, das kann effizienter sein, wenn Sie wissen, dass Sie erstellen werden/eine Menge kleiner Speicherblöcke regelmäßig zu verwerfen.

4

In * nix wird malloc() auf der C-Bibliotheksebene implementiert. Es verwendet brk()/sbrk(), um das Datensegment zu vergrößern/verkleinern, und mmap/munmap, um Speicherzuordnungen anzufordern/freizugeben. Eine Beschreibung der in glibc und uClibc verwendeten malloc-Implementierung finden Sie unter this page.

+0

Es ist nützlich. Vielen Dank. – Squall

0

Garbage Collector ist langsam

Dies ist eine völlig sinnlose Aussage. In vielen praktischen Situationen können Programme durch die Verwendung eines Garbage-Collectors, insbesondere in Multithread-Szenarien, eine deutliche Leistungssteigerung erzielen. In vielen anderen Situationen wird Garbage Collectors eine Leistungsstrafe auferlegt.

+0

Wie wäre es mit Garbage Collector * in der Regel * langsam – Chani

0

Versuchen Sie http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html für Zeiger.

Dies ist ein kurzer Leistungsvergleich mit Hinweisen auf acht verschiedene malloc/free-Implementierungen. Ein guter Ausgangspunkt, denn ein paar gute Referenzstatistiken helfen Ihnen festzustellen, ob Sie die verfügbaren Implementierungen verbessert haben oder nicht.