Öffentliche Methoden |
| Scheduler () |
| Konstruktor.
|
void | schedule () |
| Starten des Schedulings.
|
void | ready (Entrant &that) |
| Anmelden eines Prozesses zum Scheduling.
|
void | exit () |
| Selbstbeenden des aktuellen Prozesses.
|
void | kill (Entrant &that) |
| Beenden eines beliebigen Prozesses.
|
void | resume () |
| Auslösen eines Prozesswechsels.
|
void | set_idle_thread (int cpuid, Entrant *thread) |
| Setzt einen dedizierten Idle-Thread für die entsprechende CPU.
|
void | sleep_until_IRQ () |
| Legt den aktuellen Prozessor schlafen, solange keine Prozesse vorhanden sind.
|
| Dispatcher () |
| Konstruktor.
|
Coroutine * | active () |
| Hiermit kann abgefragt werden, welche Koroutine gerade im Besitz des aktuellen Prozessors ist.
|
void | go (Coroutine &first) |
| Mit dieser Methode wird die Koroutine first im Life-Pointer des aktuellen Prozessores vermerkt und gestartet.
|
void | dispatch (Coroutine &next) |
| Diese Methode setzt den Life-Pointer des aktuellen Prozessors auf next und führt einen Koroutinenwechsel vom alten zum neuen Life-Pointer durch.
|
Implementierung des Schedulers.
Der Scheduler verwaltet die Ready-Liste (ein privates Queue Objekt der Klasse), also die Liste der lauffähigen Prozesse (Entrant Objekte). Die Liste wird von vorne nach hinten abgearbeitet. Dabei werden Prozesse, die neu im System sind oder den Prozessor abgeben, stets an das Ende der Liste angefügt.
void Scheduler::kill |
( |
Entrant & |
that | ) |
|
Beenden eines beliebigen Prozesses.
Mit dieser Methode kann ein Prozess einen anderen (that) beenden. In OOStuBS genügt es einfach den Prozess that von der Ready-Liste zu entfernen. Er wird somit nie wieder vom Prozessor ausgeführt werden. In MPStuBS ist die Implementierung etwas kniffliger, da der Prozess that auch während der Ausführung von kill auf anderen Prozessoren laufen kann. Wird that nicht in der Ready-Liste gefunden, so muss in seinem Prozesskontrollblock (Coroutine) vermerkt werden, dass der Prozess beendet werden soll. Dies muss in resume überprüft werden, bevor ein Prozess wieder in die Ready-Liste eingetragen wird.
- Parameter
-
that | Prozess, der beendet werden soll. |
void Scheduler::sleep_until_IRQ |
( |
| ) |
|
Legt den aktuellen Prozessor schlafen, solange keine Prozesse vorhanden sind.
Diese Funktion legt den aktuellen Prozessor schlafen, solange die Ready-Liste leer ist. Wenn ein Interrupt auftritt, und deshalb die CPU aus dem Schlafmodus aufwacht, muss geprüft werden, ob wieder Prozesse bereit sind. Ist dies der Fall, so kann wieder die reguläre Prozessausführung fortgesetzt werden. In MPStuBS wird diese Funktion von IdleThread verwendet. In OOStuBS werden keine dedizierten Idlethreads benötigt, weswegen auch diese Funktion überflüssig ist.
Erneute Implementation in Guarded_Organizer.