Wenn malloc/free als Bibliotheksroutine in libc implementiert ist, dann wird es auf der implementiert sbrk Systemaufruf oder die mmmap Systemaufruf oder etwas anderes?
Und um allgemein zu sein, funktioniert die deklarierte Funktion in sys/syscall.h enthält ALLE Systemaufrufe in der Zielmaschine?
Sehr oft, malloc
und free
verwenden untergeordnete virtuelle Speicherzuweisungsdienste und weisen mehrere Seiten (oder sogar Megabytes) auf einmal zu Systemaufrufe wie mmmap und munmap (und vielleicht sbrk). Häufig malloc
lieber wiederverwenden bisher free
d Speicherplatz, falls relevant. Die meisten malloc
Implementierungen verwenden verschiedene und unterschiedliche Strategien für “große” und “kleine” Allokationen usw.
Beachte das virtuellen Adressraum kann begrenzt werden, zB mit setrlimit(2). Verwendung unter Linux pmap(1) und proc(5) um mehr über den virtuellen Adressraum eines Prozesses zu erfahren (z /proc/self/maps
für dein eigenes bzw /proc/1234/maps
– auch die pmap 1234
Befehl – für den Prozess von PID 1234).
Sie könnten sich Ihr GNU ansehen libc Quellcode, schauen Sie in den Quellcode anderer C-Standardbibliotheken (wie z musl-libc), lesen über malloc
Implementierungenwählen Sie einige aus andere oder eigene implementieren oder verwenden spur experimentell herauszufinden.
Lies das Syscalls-Manpage (dh Systemaufrufe(2)) und die Datei <asm/unistd.h>
für eine Liste der Systemaufrufe.
ein sehr schnelles malloc
(Ich glaube, dass dies die schnellste Implementierung von sein könnte malloc
; jedoch ist es nicht sehr nützlich; es entspricht den Standards, z n1570 oder besser)
Ich bin der festen Überzeugung, dass der C-Standard sehr vage ist malloc
und free
. Ich bin mir ziemlich sicher, dass die folgenden Funktionen den Buchstaben (aber nicht den Geist) des Standards respektieren:
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
Natürlich wirst du codieren calloc
und realloc
entsprechend.
(Übrigens jeder Code mit malloc
sollte gegen seinen Ausfall getestet werden, aber einige tun dies – fälschlicherweise – nicht; malloc
zurückkehren kann NULL
bei Fehlern und die Leute sollten gegen diesen Fall testen)
Die GNU libc bietet Ihnen Haken für deine eigene malloc
Funktionen (und Sie könnten wahrscheinlich sogar verwenden Böhms Garbage Collector transparent durch sie). Diese Hooks könnten veraltet sein und sind nicht standardmäßig.
Wenn Sie GNU libc verwenden, schauen Sie auch in Mallinfo(3) und malloc_stat(3) und damit verbundene Funktionen.
malloc
und free
sind Standard-C-Bibliotheksfunktionen, die von jeder C-Implementierung implementiert werden müssen.
Der C-Standard definiert lediglich, wie sich diese Funktionen verhalten und welches Verhalten von ihnen erwartet wird. Wie sie zu implementieren sind, bleibt der jeweiligen Implementierung überlassen.
Kurz gesagt handelt es sich um Implementierungsdetails der von Ihnen verwendeten Implementierung.
(Eine “Implementierung” besteht aus dem Compiler, dem Linker, der Laufzeitbibliothek und wahrscheinlich noch einigen anderen Dingen.)
Sie können auch eine alternative Implementierung für verwenden malloc
und free
wenn Sie einen anderen Speicherzuordner verwenden. Zum Beispiel die Speicherzuordner horten wird manchmal verwendet, um die Leistung von Multithread-Anwendungen zu verbessern.
Wenn Sie nur die Quelle für libc hätten …
– bk1e
10. Dezember 2011 um 18:25 Uhr