Aufgabe 2: Speicherverwaltung
Lernziel
- Verständnis der Strategien zur Speicherverwaltung
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.
- BitMask
- BestFit
- FirstFit
- NextFit
- WorstFit
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 strategyund-m sizezur Definition der verwendeten Speicherstrategie und der Größe des verwalteten Speichers vom Kommandointerpreter akzeptiert werden. Bevor ihr dann die Instanz der KlasseBSShellerzeugt, könnt ihr den von euch zu verwaltenden Speicher der Größesizemit der Methodemalloc(3)anfordern. Abschließend müsst ihr den Konstruktor der KlasseBSShellso 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)undfree(3)in der KlasseMemoryStrategyumzusetzen. Danach könnt ihr die Speicherstrategien in Unterklassen vonMemoryStrategyimplementieren.
Hinweis: Beachtet, dass die Startadresse des Speichers und die Speichergröße als Variable inMemoryStrategygespeichert werden müssen. - Teil C
-
Implementiert die Kommandos
memoryundmemtestund zeigt anhand dieser Kommandos die Funktionalität der implementierten Speicherverwaltung.
Das Kommandomemtestsoll einen binären Baum (Red-Black-Tree, ...) in dem von euch verwaltetem Speicher erzeugen und bearbeiten. Zu diesem Zweck akzeptiert das Kommando das Operationsparameteraddoderdelund einen Parameter zur Identifizierung des Eintrags-k key. Wird das Kommando mit dem Operationsparameteraddaufgerufen, soll ein neuer Knoten in den Baum eingefügt werden. Der hinzuzufügende Eintrag hat einen Datenbereich, dessen Größe durch den Parameter-c countbestimmt wird. Wird das Kommando mit dem Parameterdelaufgerufen, wird der durchkeydefinierte Eintrag aus dem Baum gelöscht. Der Aufruf des Kommandosmemory, 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.