• Keine Ergebnisse gefunden

Aufgabe1:Nicht-präemptivespriorisiertesUser-SpaceScheduling Übungszettel4

N/A
N/A
Protected

Academic year: 2021

Aktie "Aufgabe1:Nicht-präemptivespriorisiertesUser-SpaceScheduling Übungszettel4"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Übungen zur Vorlesung Betriebssysteme I Studiengang Informatik WS 09/10

AG Betriebssysteme FB3 Jan Peleska, Florian Lapschies Ausgabe: 14.12.2009 Abgabe: 07.01.2010

Übungszettel 4

Aufgabe 1: Nicht-präemptives priorisiertes User-Space Scheduling

Implementiert eine Scheduler-Bibliothek (scheduler.c/scheduler.h) auf Basis von setjmp()/longjmp()in C. Als Basis könnt ihr das Beispiel aus der Vorlesung verwenden. Beach- tet aber folgende Änderungen: a) es sollen keine LWPs unterstützt werden; b) es sollen keine Arrays zur Verwaltung der Threads eingesetzt werden; c) das Scheduling ist priorisiert. Die Dateimangling.hkann unverändert verwendet werden.

Die folgenden Funktionen sollen zur Verfügung gestellt werden:

Registrieren eines Threads

int schedRegisterUserThread(schedFuncPtr_t func, void *args,

unsigned int argsize, char *name,

unsigned int prio);

Ein neuer User-Thread wird beim Scheduler registriert, indem ein Funktionspointerfunc auf die Thread-Funktion übergeben wird. Ausserdem werden die Parameter als void–Pointerargs und die Größe dieses Pointersargsizebenötigt.nameist der Name des Threads, der zur Iden- tifizierung dient.prioist eine statische Priorität: Der Scheduler aktiviert einen Thread mit der Prioritätprioin jedemprio-tem Scheduling-Zyklus. Hat jedoch mindestens ein Thread die Prio- rität 0, werden in jedem Zyklus ausschließlich die Threads mit der Priorität 0 nacheinander aktiviert.

Der Scheduler registriert den Thread, indem er ihn in einer Ringliste abspeichert.

Die Rückgabewerte sind wie folgt:

• -2: nicht genug Speicher vorhanden

• -1: fehlerhafte Parameter

• 0: erfolgreiche Registrierung Entfernen eines Threads

void schedUnregisterUserThread(char *name);

Ein Thread wird nach Beendigung aus der Ringliste entfernt. Dies kann zum einen durch er- folgreiche Beendigung des Threads mit returnerfolgen (impliziter Aufruf vonschedUnregiste- rUserThread()) oder durch einen expliziten Aufruf vonschedUnregisterUserThread()von aussen, z.B. durch einen Signalhandler.

(2)

In dieser Funktion werden alle allokierten Speicherbereiche freigegeben und der Thread aus der Ringliste entfernt. Der zu löschende Thread wird mit Hilfe seines Namensname identifi- ziert.

Scheduling

void schedActivateUserThread();

Die registrierten Threads werden nach dem oben beschriebenen Prinzip geschedult. Wenn alle Threads beendet sind (oder keine vorhanden), beendet sich der Scheduler.

Freiwillige Abgabe der CPU void schedYield()

Die functionschedYield()sorgt dafür, dass ein korrekter Kontextwechsel stattfindet.

Änderung der Priorität

int schedPrio(char *name, unsigned int prio)

Die FunktionschedPrio()ändert die Priorität des angegebenen Threads.

Die Rückgabewerte sind wie folgt:

• -1: fehlerhafte Parameter

• 0: erfolgreiche Änderung der Priorität Hilfsfunktion

Starten und Beenden von Threads void schedWrapper()

Die FunktionschedWrapper() sorgt dafür, dass ein Thread korrekt gestartet und beendet wird.

Sie wird intern im Scheduler verwendet.

Aufgabe 2: Ringpuffer mit Threads und Scheduling

In dieser Aufgabe soll die Schedulingbibliothek in einem Anwendungsprogramm verwendet werden.

Schreibt einen Prozess, der drei User–ThreadsTF,TKundTDmit der Bibliothek aus Aufgabe 1 verwaltet, die über einen Ringpuffer miteinander kommunizieren.

• TFliest in einer Schleife jeweils ein einzelnes Zeichen aus einer Datei und schreibt dieses Zeichen dann als Hexadezimal–String in den Ringpuffer. Am Ende jeden Schleifendurch- laufs wird mit schedYield() die CPU freiwillig abgegeben. Kann der String nicht in den Ringpuffer geschrieben werden, weil dieser voll ist, wirdschedYield()aufgerufen und es wird bei der nächsten Aktivierung erneut versucht. Wenn das Ende der Datei erreicht ist, beendet sichTF.

TFläuft stets mit der Priorität2.

(3)

• TDliest in einer Schleife einen einzelnen Eintrag aus dem Ringpuffer und gibt ihn auf stdout aus. Am Ende jeden Schleifendurchlaufs oder wenn der Ringpuffer leer ist wird mitschedYield()die CPU freiwillig abgegeben.

TDläuft bei der ersten Aktivierung zunächst mit der Priorität0.

• TKliest in einer Schleife ein einzelnes Zeichen vonstdinund schreibt dieses als String in den Ringpuffer. Am Ende jeden Schleifendurchlaufs wird mitschedYield() die CPU frei- willig abgegeben.

TKläuft bei der ersten Aktivierung zunächst mit der Priorität0. SollteTKinnerhalb von drei Sekunden kein Zeichen von stdinlesen können, wird die Priorität vonTDund die von TK selbst auf 1 gesetzt und mit schedYield() die CPU freiwillig abgegeben. Sobald wieder ein neues Zeichen vonTKgelesen wird, wird die Priorität vonTDundTKwieder auf0zurückgesetzt.

Im Ergebnis werden also keine neuen Zeichen aus der Datei gelesen, solange Eingaben aufstdinkommen. Verwendet hierbeiselect(), um nicht–blockierendes Lesen von der Stan- dardeingabe zu gewährleisten.

Der Ringpuffer entspricht dem einfachem Ringpuffer, so wie er euch in der Vorlesung vorge- stellt wurde: Im Ringpuffer werden lediglich Zeiger auf Strings gespeichert und die Zeichen- ketten selber liegen dann im Heap. Der Ringpuffer soll 30 Einträge groß sein.

Der Prozess (und zuvor seine Threads) sollen bei Auftreten der SignaleSIGTERMundSIGINT sauber beendet werden.

Hinweise

Die Abgabe erfolgt als Ausdruck am Ende der Vorlesung und zusätzlich elektronisch über das Subversion Repository. Die Dokumentation der Aufgabenlösung ist in LaTeX anzufertigen.

Bitte vergesst nicht die Namen aller Gruppenmitglieder mitanzugeben.

Referenzen

ÄHNLICHE DOKUMENTE

„Wenn die Liberalen keine bes- sere Welt mehr wollen, können sie die Welt, wie sie ist, auch nicht bewah- ren.“ Plädiert wird deshalb für mehr statt weniger demokratisches

Those who have not previously worked with a solder- masked board will find that it takes considerably less solder to make a good joint since the solder does not spread out

Obwohl die C20 nur eine von sieben Beteiligungsgruppen ist, bietet sie einen normativen Horizont für die Politik und kommt der Vertretung der zivilgesellschaftlichen

a) Unvereinbarkeit des Hauptsacheurteils mit der isolierten Feststellung der Zuständigkeit des Schiedsgerichts, Art. 45 Abs. 1 lit. c/d Brüssel Ia-VO? . Vereinbarkeit

XMT Page in Forms Mode (FW2 Only) This feature transmits all unprotected data and transmittable protected data on the page from the start-of-transmission point,

6 Damit wurde jedoch zugleich eine inhaltliche Differenz markiert, vertrat doch der mitgliederstarke Zentralverband die Position, dass es sich ausschließlich bei

Juni 2018 konnten die Schulen Zuschüsse für Fahrten im ersten Schulhalbjahr 2018/19 bean- tragen. Von den insgesamt 114 Fahrten bleiben 71 innerhalb Deutsch- lands, zwölf mit Zielen

Ältere Men- schen haben daher ein erhöhtes Risiko für eine chronische Über- säuerung, da Säure nicht mehr aus- reichend ausgeschieden und neutra- lisiert werden