Prozessumschaltung
Lernziele
- Auffrischen von Assemblerkenntnissen (siehe auch Assembler-Crashkurs)
- Verständnis der Abläufe beim Prozesswechsel
- Unterscheidung von aktiven und passiven Objekten
Aufgabe
Im Rahmen dieser Aufgabe soll eine einfach Prozessverwaltung, bei der
die Benutzerprozesse die Prozessorabgabe im Sinne des
Koroutinenkonzepts selber regeln, implementiert werden.
Dazu müssen einige Funktionen zum Zugriff auf die Struktur
toc
, sowie die
Klassen Coroutine
, Dispatcher
, Entrant
und Scheduler
und die Funktion kickoff
implementiert
werden. Außerdem soll oo-StuBS nun mit Application
eine Anwendung erhalten.
Die Struktur toc
sowie die Klassen Chain
und Queue
, die zur
Lösung der Aufgabe notwendig sind, werden als Vorgabe von uns
zur Verfügung gestellt.
Damit die Prozessumschaltung auch überall in oo-StuBS
ansprechbar ist, soll im zweiten Schritt der Implementierung eine globale
Instanz des Dispatchers
angelegt werden. Diese wird dann im
dritten Schritt durch eine globale Instanz scheduler
des
Schedulers
ersetzt.
Die Funktionsfähigkeit der genannten Klassen soll mit Hilfe eines
aussagefähigen Testprogramms gezeigt werden. Dazu soll in der
main
-Methode aus der ersten Aufgabe zusätzlich
eine globale Instanz scheduler
der Klasse
Scheduler
angelegt und ein erster Benutzerprozess
application
(ein Objekt der Klasse Application
)
erzeugt werden, der seinerseits weitere Benutzerprozesse erzeugt.
Testet auch die Methoden Scheduler::exit()
und
Scheduler::kill(Entrant& item)
aus.
Implementierung
Zum Testen empfiehlt es sich, die Gesamtaufgabe in drei Teile zu zerlegen und mit dem Testen der Teile B und C erst dann zu beginnen, wenn Teil A (bzw. B) fertig implementiert und ausreichend getestet wurde.
Teil A
Hier wird der Koroutinenwechsel realisiert. Es müssen
also zunächst nur die Zugriffsfunktionen auf die Struktur
toc
und die Klasse
Coroutine
implementiert werden.
Zum Testen der Lösung sollten in Application
(hier
noch als Spezialisierung der Klasse Coroutine
) mehrere
Benutzerprozesse (die ebenfalls von Coroutine
abgeleitet
werden müssen) erzeugt werden, die jeweils nach einigen
Anweisungen den Prozessor an die nächste Koroutine abgeben.
Teil B
Nach der Umsetzung des Koroutinenwechsels kann als
nächstes der Dispatcher
implementiert werden. Im
Testprogramm sollte der Koroutinenwechsel nun
ausschließlich über den Dispatcher laufen.
Teil C
Abschließend sollte der Scheduler
(benötigt
die Prozessabstraktion Entrant
) hinzugefügt werden.
Im Testprogramm müssen die Anwendung und die Benutzerprozesse
(nun als Spezialisierungen der Klasse Entrant
) beim Scheduler
angemeldet werden.
Dadurch ist es nicht länger nötig, dass sie sich gegenseitig kennen,
denn die Auswahl des nächsten Prozesses wird durch den Scheduler
übernommen.
Vorgaben
Die Implementierung der Klassen Chain und Queue haben wir bereits
für Euch erledigt und einen Teil von
toc
geben wir
auch vor (siehe vierte Vorgabe).