Skip to main content.

Navigation:

Aufgabe 2: Speicherverwaltung

Lernziel

Aufgabenbeschreibung

Der in der ersten Aufgabe implementierte Kommandointerpreter wird in dieser Aufgabe um eine Speicherverwaltung erweitert. Sie soll die Daten der internen Kommandos mit Hilfe der Methoden malloc(3), calloc(3), realloc(3) und free(3) verwalten. Der verwaltete Speicher soll zu diesem Zweck mit Hilfe der folgenden Strategien organisiert werden können.

Die Funktionalität der Speicherverwaltung soll dadurch nachgewiesen werden, dass ein binären Baum (Red-Black-Tree, ...) im Speicher aufgebaut und ausgiebig bearbeitet wird. Der Aufbau des Baums soll durch das Kommando memtest gesteuert werden. Bei jedem Aufruf dieses Kommandos soll ein Eintrag in den Baum eingefügt oder gelöscht werden. Jeder Eintrag ist durch einen Key eindeutig identifizierbar und enthält einen count großen Datenbereich. Zusätzlich soll das Kommando memory, mit dessen Hilfe die aktuelle Speicherbelegung dargestellt wird, umgesetzt werden.

bsshell> memtest [add | del] -k key [-c count]
bsshell> memory

Damit der Kommandointerpreter möglichst flexibel verwendet werden kann, soll es möglich sein, die Größe des verwendeten Speichers (in Megabyte) sowie die verwendete Speicherstrategie beim Start des Kommandointerpreters durch Parameter zu bestimmen.

prompt> bsshell [-m size] [-s bitmask | bestfit | firstfit | nextfit | worstfit]

Implementierungshinweise

Teil A
Beginnt damit die Vorgabe so zu erweitern, dass die Parameter -s strategy und -m size zur Definition der verwendeten Speicherstrategie und der Größe des verwalteten Speichers vom Kommandointerpreter akzeptiert werden. Bevor ihr dann die Instanz der Klasse BSShell erzeugt, könnt ihr den von euch zu verwaltenden Speicher der Größe size mit der Methode malloc(3) anfordern. Abschließend müsst ihr den Konstruktor der Klasse BSShell so erweitern, dass er die Speicherstrategie und den zu verwaltenden Speicher (Speicheradresse, Speichergröße) als Parameter erwartet.
Weitere Infos: getopt(3)
Teil B
Nachdem ihr den Aufruf des Interpreters um die notwendigen Parameter erweitert hab, solltet ihr die einzelnen Speicherstrategien implementieren. Dazu beginnt ihr am besten damit, die Methoden malloc(3), calloc(3), realloc(3) und free(3) in der Klasse MemoryStrategy umzusetzen. Danach könnt ihr die Speicherstrategien in Unterklassen von MemoryStrategy implementieren.
Hinweis: Beachtet, dass die Startadresse des Speichers und die Speichergröße als Variable in MemoryStrategy gespeichert werden müssen.
Teil C
Implementiert die Kommandos memory und memtest und zeigt anhand dieser Kommandos die Funktionalität der implementierten Speicherverwaltung.
Das Kommando memtest soll einen binären Baum (Red-Black-Tree, ...) in dem von euch verwaltetem Speicher erzeugen und bearbeiten. Zu diesem Zweck akzeptiert das Kommando das Operationsparameter add oder del und einen Parameter zur Identifizierung des Eintrags -k key. Wird das Kommando mit dem Operationsparameter add aufgerufen, soll ein neuer Knoten in den Baum eingefügt werden. Der hinzuzufügende Eintrag hat einen Datenbereich, dessen Größe durch den Parameter -c count bestimmt wird. Wird das Kommando mit dem Parameter del aufgerufen, wird der durch key definierte Eintrag aus dem Baum gelöscht. Der Aufruf des Kommandos memory, soll die Größe des verwalteten, belegten und freien Speichers sowie eine Liste der freien Speicherblöcke (Adresse, Größe) ausgeben.

Vorgabe

Zur Lösung der Aufgabe erhaltet ihr die zweite Vorgabe. Sie besteht aus der Vorgabe zur ersten Aufgabe sowie den für diese Aufgabe vorgegebenen Klassen.

Hilfestellung