Aufgabenblatt 5

Speicherverwaltung

Abgabe: 11.1.2007

Bei der Speicherverwaltung mit Segmenten in Minix kann es im Laufe der Zeit, nachdem eine Anzahl von Prozessen gestartet und wieder beendet wurde, zu einer gewissen externen Fragmentierung des Arbeitsspeichers kommen, d.h. es gibt eine Reihe von nichtzusammenhängenden, unbelegten Speicherbereichen. Darum können möglicherweise Prozesse wegen Speichermangels nicht gestartet werden - obwohl insgesamt noch genügend freier Speicher vorhanden wäre, wegen der Fragmentierung aber kein ausreichend großer, zusammenhängender Speicherbereich gefunden werden kann.

Um dieses Problem zu beheben kann man den Auslagerungs-Mechanismus (swapping) von Minix aktivieren. Bei Speichermangel werden dann momentan nicht benötigte Prozesse in den Hintergrundspeicher verschoben, und der frei werdende Hauptspeicher steht für neue Prozesse zur Verfügung. Allerdings behandelt die rudimentäre Auslagerung in Minix nur die Daten- und Kellersegmente von Prozessen, Textsegemente jedoch nicht. In ungünstigen Fällen kann die durch Textsegemente verursachte Fragmentierung immer noch den Start eines Prozesses mit hoher Speicheranforderung verhindern.

Aufgabe 1

Erweitert den Auslagerungs-Mechanismus um die Behandlung von Textsegmenten. Ein Textsegment soll ausgelagert werden, wenn alle Prozesse die es benutzen bereits ausgelagert sind, und eingelagert werden, sobald es benötigt wird. Letzteres ist der Fall, wenn ein zugehöriger Prozess wieder eingelagert werden soll, oder wenn ein neu erzeugter Prozess das Textsegment ebenfalls mitbenutzen möchte.

Aufgabe 2

Verbessert die Umlagerung von Textsegementen, so dass sie bei Auslagerung einfach nur freigegeben werden. Bei der Einlagerung eines Prozesses soll das zugehörige Textsegment dann aus seiner Programmdatei wiederhergestellt werden. Dieser verbesserte Mechanismus muss auch dann noch korrekt arbeiten, wenn die Programmdatei inzwischen unter keinem Namen mehr auflösbar ist.

Hinweise

Der Auslagerungs-Mechanismus ist in /usr/src/mm/alloc.c realisiert, durch die Prozeduren swap_in() und swap_out(). Es gibt keinen eigenen Swapper-Prozess, stattdessen erfolgt die Auslagerung in alloc_mem() bei Speichermangel, und die Einlagerung als Folge diverser Vorgäge bei denen Prozesse wieder bereit werden. Die Erzeugung neuer Prozesse geschieht in do_fork() in forkexit.c sowie in do_exec() in exec.c . In exec.c gibt es ferner einige Hilfsfunktionen: Mit find_share() lassen sich gemeinsame Textsegmente ausfindig machen, und mittels rw_seg() kann man Segmente zwischen einer Datei bzw. dem Auslagerungsbereich und dem Hauptspeicher übertragen. Zuletzt erledigt mm_exit() in forkexit.c diverse Aufräumarbeiten bei der Beendigung eines Prozesses.