Die Umsetzung Ihrer eigenen malloc/free mit mmap und munmap
Habe ich umgesetzt durch eigene malloc und frei mit mmap. Jetzt da Sie im Gegensatz zu frei, munmap auch dauert Länge als parameter, daher setzte ich Länge als zusätzliche Informationen in dem zugeordneten Speicher.
Den code für meine malloc und frei ist unten dargestellt. Ich möchte Fragen, ob dieser code gut ist oder bin ich fehlt noch etwas oder tut etwas auf eine falsche Weise.
void * malloc ( size_t size )
{
int *plen;
int len = size + sizeof( size ); //Add sizeof( size ) for holding length.
plen = mmap( 0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
*plen = len; //First 4 bytes contain length.
return (void*)(&plen[1]); //Memory that is after length variable.
}
void free ( void * ptr )
{
int *plen = (int*)ptr;
int len;
plen--; //Reach top of memory
len = *plen; //Read length
munmap( (void*)plen, len );
}
Ich würde vorschlagen, machen Sie einen einfachen test-Programm läuft, dass diese ein paar mal mit einer Reihe von verschiedenen Parametern, und es läuft durch Valgrind zu sehen, wenn irgendwelche Probleme auftauchen.
Gehört auf codereview.stackexchange.com ?
immer noch Probleme mit der Navigation durch alle die verschiedenen sub-Foren, von die, die Sie erwähnen, sagen, SO ' s ubuntu-forum. Könnten Sie bitte beraten, wie/wo bekommt man eine Liste von Ihnen?
klicken Sie auf den StackExchange word rechts oben auf der Seite auf der linken Seite - dies wird ein pop-up-Fenster, klicken Sie dann auf "Alle Websites"
Gehört auf codereview.stackexchange.com ?
immer noch Probleme mit der Navigation durch alle die verschiedenen sub-Foren, von die, die Sie erwähnen, sagen, SO ' s ubuntu-forum. Könnten Sie bitte beraten, wie/wo bekommt man eine Liste von Ihnen?
klicken Sie auf den StackExchange word rechts oben auf der Seite auf der linken Seite - dies wird ein pop-up-Fenster, klicken Sie dann auf "Alle Websites"
InformationsquelleAutor MetallicPriest | 2011-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Beobachtungen:
int
undsize_t
haben die gleiche Größe. Wenn Sie speichern möchten, einesize_t
Wert an der Spitze der Zuordnung, dann warum nicht Sie gerade tun? Warum einzuführenint
?mmap()
, und in der Regel Zuweisungen kann nicht kleiner sein als eine "Seite". Die meisten echten allocators versuchen zu vermeiden, fordern OS-level-Funktionalität auf jedemmalloc()
, in verschiedener Weise.mmap()
fehlschlägt, wird es wiederMAP_FAILED
, und so solltemalloc()
. So, Sie brauchen, um zu testen, dass vor de-Referenzierung der Zeiger zurückgegebenmmap()
.free(NULL)
sollte eine gültige Sache zu tun; mit Ihrer Umsetzung wird es sehr wahrscheinlich zu einem Absturz führen, da Sie nichtNULL
-überprüfen Sie das argument vor, vorausgesetzt, es ist gültig.malloc
-ed Größe ist viel kleiner als eine Seite, so dass Sie haben, um mehrere Speicher-chunks in einem (oder mehreren aufeinanderfolgenden) Seiten. Zum Beispiel, wenn Siestrdup
-ing-Namen oder die menschliche Sprache Wort, die typische Größe ist ein oder ein paar Dutzend bytes, aber die typische Größe der Seite ist 4Kbytes! Sie haben auch zu akzeptieren, großenmalloc
Anfragen und behandeln Sie speziell.Das heißt, mein Aktueller PC hat 4096 mal so viel Speicher als mein Erster PC erlaubt, auf einige Programme. Es ist also nicht auszuschließen, dass die Spielzeug-Programme ausführen könnte mit dieser Zuweisung, nur nicht versuchen, die Verknüpfung von Firefox vor. Was Sie wirklich wollen, obwohl, ist beiden Seiten pro armselige Dutzend-byte-Zuordnung, auch bekannt als "guard page after" 😉
Ja, aber die aktuelle software auf Ihrem PC ist mit vielleicht fünf tausend mehr Speicher als das, was verwendet wurde, vor. RAM ist wie Speicherplatz, ist es eher voll....
Mein RAM ist nicht voll: aktuelle Belegung des physikalischen Speichers liegt bei 50%, die meisten von denen können ausgelagert werden, um die swap-Datei. Ich sage es noch einmal, die Größe des Programms, das ausgeführt werden kann, auf meinem PC mit dieser absurd-Zuweisung ist in etwa vergleichbar mit der Größe des Programms, das ausgeführt werden könnte, die in den konventionellen Speicher auf meinem ersten PC. Das heißt nicht, dass dies ein guter - Zuweisung, nur eine, die ist besser, als völlig nutzlos.
zurück
MAP_FAILED
wenn es scheitert eher alsNULL
.InformationsquelleAutor unwind
Sollten Sie zumindest.
mmap
fehlsize_t
für die Größe, nicht eineint
. Sie könnte anders sein.int
vermutlich 4 bytes, um die Seite ausgerichtet, Daten von mmap. Dies bedeutet die Speicherung von Werten, die brauchen größere Ausrichtung in den zurückgegebenen Speicher, z.B. ein Doppel-Leistungseinbußen oder gar Abstürze auf manchen Architekturen.NULL
weitergegeben werden kostenlos (es ist eigentlich ein no-op)Für einen malloc-Implementierung, würde ich auch erwarten, dass es zumindest ein rudimentäres debugging support, z.B. versuchen zu erkennen, Doppel-frees, versuchen Sie zu erkennen, frei ' Ing ungültige Pointer -, Listen-Speicher nicht frei hatte usw.
Denken Sie daran, Ihre malloc-Implementierung kann hier sehr verschwenderisch. Wenn Sie malloc 10 bytes , werden Sie am Ende der Zuteilung 1 Seite (4096 bytes), die alle auf den physischen Speicher zugeordnet, wobei die restlichen 4082 bytes ungenutzt.
InformationsquelleAutor user964970
Lesen Sie auch c malloc auf wikipedia und aufmerksam studieren einige echte malloc-Implementierungen wie Doug Lea ' s malloc. Es gibt eine Menge Literatur zum Thema, z.B. von Wolfram Gloger und viele, viele andere.
@MetallicPriest: Sie wirklich sollte erklären, viel viel mehr, was Sie tun (ich bin nicht sehr optimistisch für Ihre Arbeit, aber Sie werden wahrscheinlich lernen, eine große Menge!)
InformationsquelleAutor Basile Starynkevitch
Sollten Sie sich nicht call mmap jedes mal, wenn Sie rufen Sie Ihre benutzerdefinierten malloc. Wie bereits erwähnt, ist es ein riesiger Aufwand, dies zu tun.
Sollten Sie eine große shared-memory - (4K zum Beispiel) und dein malloc-Funktion wird nur return Zeiger in den Bereich der Speicher, den Sie alocated.
Dann wenn man kurz auf den Speicher, erstellen Sie einen anderen 4k-shared-memory.
Müssen Sie sich nur noch zu zählen, wie viel Speicherplatz Sie verwenden und behalten Sie den überblick über Ihre Referenzen und freigeben von Speicher ist viel einfacher.
InformationsquelleAutor puikos
Sind und Sie auch nutzen sollte
-1
statt0
als die fd argument von mmap.InformationsquelleAutor remus