icana 8 RENOGEN
Während der Bearbeitung der letzten Aufgaben
muss der häufig schon Speicher dynamisch allokiert und wieder freigegeben werden.
Dazu wurde Listening Counselingacağım und 5-Est plata verwendet.
In dieser Übung wollen wir uns mal genauer anschauen, was Free und malloc eigentlich
leisten und wie man diese beiden Funktionen selbst implementieren kann.
Dazu schauen wir uns nochmal an, wie die beiden Funktionen aufgebaut sind.
Die Funktion malloc erhält als Argument die Größe des angeforderten Speichers.
Der Rückgabewert ist entweder ein Zeiger auf genau diesen Speicherbereich, der allokiert
wurde, oder eben ein Fehlerwert.
Wenn man diesen Speicher nun wieder freigeben möchte, muss man auf dem Zeiger, den man
von malloc bekommen hat, die Free Funktion aufrufen.
Jetzt können wir uns an dieser Grafik einmal verdeutlichen, wie das überhaupt intern aussieht,
wenn man mit malloc und free auf dem heap arbeitet.
Der heap steht dabei für den Speicherbereich, der dem Programm dynamisch zur Laufzeit zur
Verfügung steht.
Der große Block in dieser Skizze steht dabei für den gesamten Speicher, der im heap zur
Verfügung steht.
Der dabei schraffierte Teil ist bereits belegter Speicher, der zum Beispiel durch eine malloc
Operation an den Nutzer rausgegeben wurde.
Und jetzt können wir uns überlegen, welche Informationen muss ein System, das die Operation
malloc und free bereitstellt, speichern, damit es auf Basis des Heaps Speicher verwalten kann.
Zunächst einmal haben wir die grundsätzliche Unterscheidung zwischen dem Bereich, der bereits
belegt ist, und Bereichen, die noch frei sind.
Je nachdem müssen wir uns leicht unterschiedliche Informationen speichern.
Für die freien Blöcke müssen wir uns einmal wegspeichern, an welcher Stelle diese freien
Blöcke liegen und wie groß sie sind. Für belegte Blöcke hingegen reicht es,
wenn wir wissen, wie groß der belegte Block ist, weil der Nutzer, der durch
malloc den Speicher angefordert hat, dann selbst für die Verwaltung des
Speichers zuständig ist und bei der Freigabe des Speichers durch free den
Ort wieder mitteilt. An der Stelle können wir kurz überlegen,
welche Datenstruktur sich dafür eignet, genau diese Information wegzuspeichern.
Im Prinzip kann man da sein gesamtes AOD-Wissen draufschmeißen, um eine
möglichst effiziente Datenschruktur zu bauen, die es schnell ermöglicht, einen
passenden Speicherbereich zu finden, um die Reaktionszeit eines mallocks so
gering wie möglich zu halten. Im Falle von SP reicht es jedoch, wenn
ihr auf eine verkettete Liste zurückgreifen, da sich Diesel einfach
implementieren lässt und für die Zwecke vollkommen ausreichend ist.
Das bedeutet, wenn wir eine Freispeicherverwaltung auf Basis einer
verketteten Liste machen möchten, müssen wir eine Liste erstellen, die nur
nach die freien Speicherblöcke verwaltet. Das bedeutet, ein Listenelement
beinhaltet einmal die Größe der freien Speicherblöcke und deren Position im
Speicher. Jetzt können wir uns einmal vorstellen, wie die Verwendung einer
solchen beschriebenen Freispeicherverwaltung aussieht, wenn wir
dafür zum Beispiel die Listneuementierung aus Aufgabe eins heranziehen.
Typischerweise, sieht die30r Implementierung so aus, dass für jeden
Auffruf vonaftert ein neues malloc aufgerufen wird. Damit Platz für ein
neues Listelement geschaffen werden kann. Wenn wir damit aber eine
Freispeicherverwaltung implementieren wollen, stürzen wir schnell auf das Problem,
dass für ein Insert ein Malloc aufgerufen wird und das Malloc wiederum versucht,
Zugänglich über
Offener Zugang
Dauer
00:05:00 Min
Aufnahmedatum
2020-05-24
Hochgeladen am
2020-05-25 00:16:24
Sprache
de-DE