Ist malloc/free ein Systemaufruf oder eine von libc bereitgestellte Bibliotheksroutine?

Lesezeit: 4 Minuten

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?

  • Wenn Sie nur die Quelle für libc hätten …

    – bk1e

    10. Dezember 2011 um 18:25 Uhr

Benutzer-Avatar
Basile Starynkevitch

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 freed 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.

  • Eigentlich, malloc und free kann noch einfacher sein, so etwas wie #define malloc(x) NULL und #define free(x) (void)1 🙂 ISO nicht erforderlich errno gesetzt werden, das ist eine POSIX-Sache. Sie würden wahrscheinlich auch abfangen wollen calloc und realloc auch.

    – paxdiablo

    30. Juli 2018 um 4:39 Uhr

  • @paxdiablo: bist du dir sicher malloc kann nur ein Makro sein? Ich dachte, es sollte eine Funktion sein (einem Funktionszeiger zuweisbar)

    – Basile Starynkevitch

    30. Juli 2018 um 5:51 Uhr

  • Guter Punkt, ich denke du hast recht, daran habe ich nicht gedacht. Sie können die errno-Einstellungen immer noch löschen.

    – paxdiablo

    30. Juli 2018 um 7:53 Uhr

Benutzer-Avatar
Alok Speichern

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.)

  • implementiert von der c-Bibliothek der Plattform, nicht vom Compiler.

    – u0b34a0f6ae

    10. Dezember 2011 um 15:05 Uhr

  • @kaizer.se: Compiler sind frei (heh!), ihre eigene Standardbibliothek zu haben, wenn sie wollen, aber das hat im Allgemeinen nicht viel Sinn.

    – dmckee — Ex-Moderator-Kätzchen

    10. Dezember 2011 um 15:27 Uhr

  • @kaizer.se: Es hängt davon ab, ob ein Compiler die von der Plattform bereitgestellte Standardbibliotheksimplementierung verwenden oder ihre eigene Implementierung derselben bereitstellen kann. Welche man wählt, hängt vom Compiler ab. Das ist die Bedeutung von Implementierungsdetail

    – Alok Speichern

    10. Dezember 2011 um 17:24 Uhr

  • Am häufigsten, malloc und free sind als Bibliotheksfunktionen implementiert, die untergeordneten Code aufrufen. Wenn ein Betriebssystem Systemaufrufe bereitstellt, die genau dem Verhalten entsprechen, das der C-Standard erfordert malloc und `free, dann könnten sie als Systemaufrufe implementiert werden. Aber ich kenne kein Betriebssystem, das dies tut (sogar Unix, der Geburtsort von C).

    – Keith Thompson

    10. Dezember 2011 um 23:37 Uhr

Benutzer-Avatar
Gabriel Süd

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.

1257020cookie-checkIst malloc/free ein Systemaufruf oder eine von libc bereitgestellte Bibliotheksroutine?

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

Privacy policy