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 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 KlasseBSShell
erzeugt, könnt ihr den von euch zu verwaltenden Speicher der Größesize
mit der Methodemalloc(3)
anfordern. Abschließend müsst ihr den Konstruktor der KlasseBSShell
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)
undfree(3)
in der KlasseMemoryStrategy
umzusetzen. Danach könnt ihr die Speicherstrategien in Unterklassen vonMemoryStrategy
implementieren.
Hinweis: Beachtet, dass die Startadresse des Speichers und die Speichergröße als Variable inMemoryStrategy
gespeichert werden müssen. - Teil C
-
Implementiert die Kommandos
memory
undmemtest
und zeigt anhand dieser Kommandos die Funktionalität der implementierten Speicherverwaltung.
Das Kommandomemtest
soll einen binären Baum (Red-Black-Tree, ...) in dem von euch verwaltetem Speicher erzeugen und bearbeiten. Zu diesem Zweck akzeptiert das Kommando das Operationsparameteradd
oderdel
und einen Parameter zur Identifizierung des Eintrags-k key
. Wird das Kommando mit dem Operationsparameteradd
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 Parameterdel
aufgerufen, wird der durchkey
definierte 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.