Preview only show first 10 pages with watermark. For full document please download

Prozesse Und Threads Kapitel 2

   EMBED


Share

Transcript

Kapitel 2 Prozesse und Threads 2.1 Prozesse 2.2 Threads 2.3 Interprozesskommunikation 2.4 Klassische Probleme der Interprozesskommunikation 2.5 Scheduling Prozesse Das Prozessmodell Unterschied Prozess / Programm 􀂃 Prozess ist eine Aktivität 􀂃 Besteht aus Programm, Input, Output und Zustand a) Multiprogramming von vier Programmen b) Konzeptionelles Modell von vier unabhängigen sequentiellen Prozessen c) Zu einem Zeitpunkt ist nur ein Programm aktiv. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 2 Prozesserzeugung • OS muss sicherstellen, dass alle wichtigen Prozesse existieren. • Manchmal: alle Prozesse die jemals benötigt werden, werden beim Startup erzeugt • Im allgemeinen: Möglichkeit zur Erzeugung / Beendigung erforderlich Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 3 Prozesserzeugung Ereignisse, die die Erzeugung eines Prozesses auslösen 1. Initialisierung des Systems (boot) 2. Systemaufruf zum Erzeugen eines Prozesses durch einen anderen Prozess 3. Benutzeranfrage, einen neuen Prozess zu erzeugen 4. Start eines Batch Jobs Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 4 Prozesserzeugung Booten Mehrere Prozesse werden gestartet • 􀂃 Prozesse zur Interaktion mit Anwender • 􀂃 Prozesse für bestimmte Funktionen – 􀂃 Email-service – 􀂃 Drucker-Warteschlange – 􀂃 Firewall Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 5 Windows Taskmanager Prozessliste Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 6 Prozessbeendigung Bedingungen, die zum Beenden von Prozessen führen 1. Normales Beenden (freiwillig) 2. Beenden auf Grund eines Fehlers (freiwillig) 3. Beenden auf Grund eines schwerwiegenden Fehlers(unfreiwillig) 4. Beenden durch einen anderen Prozess (unfreiwillig) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 7 Prozesshierarchien • Elternprozess erzeugt Kindprozess. Kindprozess kann weitere Prozesse erzeugen. In UNIX ist das eine Prozessfamilie • Unter Windows gibt es kein Konzept einer Prozesshierarchie, alle Prozesse sind gleichwertig. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 8 Prozesszustände (1) 1. Prozess blockiert wegen Eingabe 2. Schedular wählt einen anderen Prozess 3. Schedular wählt diesen Prozess 4. Eingabe vorhanden • Mögliche Prozesszustände – rechnend (running) – blockiert (blocked) – rechenbereit (ready) • Es existieren die dargestellten Übergänge zwischen diesen Zuständen Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 9 Prozesszustände (2) • Die unterste Schicht eines prozessstrukturierten Betriebssystems behandelt Interrupts und Scheduling • Oberhalb befinden sich sequentielle Prozesse Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 10 Implementierung von Prozessen Einige Felder eines typischen Eintrags einer Prozesstabelle Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 11 Umschalten zwischen Prozessen Context Switch Aufgaben der untersten Schicht des Betriebssystems bei Auftreten einer Unterbrechung 1. 2. 3. 4. 5. 6. 7. 8. Hardware sichert Befehlszähler etc Hardware holt neuen Befehlszähler vom Interruptvektor Assemblerfunktion speichert Register Assemblerfunktion erzeugt neuen Stack C-Unterbrechungsroutine läuft (puffert Ein/- Ausgaben) Schedular sucht nächsten Prozess C-Funktion kommt zur Assemblerfunktion zurück Assemblerfunktion startet neuen aktuellen Prozess Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 12 Schritte für den Systemaufruf Adresse 0xFFFFFFFF Return zum Aufrufer Bibliotheksprogramm read Systemaufruf in den Kern 5. Put code for read in register 10. 4. 11. Erhöhe Stackpointer Benutzerraum Benutzerprogramm ruft read auf Rufe read auf 6. count = read (fd, buffer, nbytes 3. Push fd 2. Push &buffer 1. Push nbytes 9. Kernadressraum Verteilung 7. 8. fd : filedescriptor buffer : Ziel nbytes : Länge Systemaufrufbehandlung 13 Threads Das Threadmodell (1) • Traditionelles Modell: Prozess hat • einen Adressraum • einen Ausführungsfaden • Manchmal ist es wünschenswert, mehrere Ausführungsfäden zu haben Drei Prozesse mit jeweils einem Thread Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 14 Threads Das Threadmodell (2) • Traditionelles Modell: Prozess hat • einen Adressraum • einen Ausführungsfaden • Manchmal ist es wünschenswert, mehrere Ausführungsfäden zu haben • wie eigene Prozesse, aber gemeinsamer Adressraum Ein Prozess mit drei Threads Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 15 Das Threadmodell (3) 1. Spalte: Elemente werden zwischen den Threads eines Prozesses aufgeteilt 2. Spalte: Thread-eigene Elemente Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 16 Das Threadmodell (3) Jeder Thread hat seinen eigenen Stack Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 17 Einsatz von Threads (1) Ein Textprogramm mit drei Threads Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 18 Einsatz von Threads (2) Ein Web-Server mit mehreren Threads Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 19 Einsatz von Threads (3) • Grober Auszug des Codes zur vorherigen Folie. (a) Dispatcher thread (b) Worker thread Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 20 Einsatz von Threads (4) Drei Möglichkeiten, einen Server zu bauen: Modell Eigenschaften Threads Parallel, blockierende Systemdienste Prozesse (ein Thread) Nicht parallel, blockierende Systemdienste Endlicher Automat Parallel, nicht blockierende Systemdienste Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 21 Einsatz von Threads (5) Was Threads zu bieten haben: • Sie ermöglichen es, das Konzept von sequenziellen Prozessen, die blockierende Systemaufrufe (z.B. für Platten E/A) machen, beizubehalten und troztdem Parallelität zu erzielen • Blockierende Systemaufrufe vereinfachen die Programmierung und die Parallelität verbessert die Performance • Der Einzel-Thread-Server behält die Einfachheit von blockierenden Systemaufrufen bei, gibt jedoch die Performance auf. • Der dritte Ansatz bringt hohe Performance durch Parallelität, benutzt aber nicht blockierende Aufrufe und ist deshalb schwieriger zu programmieren Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 22 Realisierung von Threads im Benutzeradressraum (1) Ein Benutzer-Level Thread Paket Vorteile: • kann auch auf Betriebssystemen realisiert werden, die Threads nicht unterstützen • Umschalten zwischen Threads geht vergleichsweise schnell Run-time system – Laufzeitsystem, enthält eine Sammlung von Prozeduren, die auch Threads verwalten (thread_create, thread_exit,...) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 23 Realisierung von Threads im Benutzeradressraum (2) Ein Benutzer-Level Thread Paket Dienstag, 30. April 2013 Probleme: • Ruft ein Thread einen blockierenden Systemaufruf auf (z.B. read von Tastatur), werden alle Thread blockiert • Systemaufrufe müssten nicht blockierend implementiert werden und Anwendungsprogramme müssten dafür modifiziert werden (sehr aufwendig) • Seitenfehler eines Threads blockieren ebenso alle Threads • Startet ein Thread, kommt kein anderer an die Reihe, bis der erste von sich aus die CPU freigibt Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 24 Realisierung von Threads im Kern(1) Ein Thread Paket, verwaltet vom Kern Kern hat Thread-Tabelle, die alle Threads im System verwaltet Zur Sicherheit: Exkurs über Betriebssystemkern! Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 25 Betriebssystemkern (1) Wikipedia: Ein Betriebssystemkern oder Systemkern (engl. kernel ) ist der zentrale Bestandteil eines Betriebssystems. In ihm ist die Prozess- und Datenorganisation festgelegt, auf der alle weiteren Softwarebestandteile des Betriebssystems aufbauen. Er ist meist in der untersten Softwareschicht, hat also Zugriff auf die Hardware. Die Konstruktion eines Betriebssystemkerns gehört zum Themenbereich der Informatik und des Softwareengineerings. Gängige Anforderungen an einen Systemkern sind Parallelverarbeitung verschiedener Aufgaben (Multitasking), Einhaltung zeitkritischer Grenzen, Offenheit für unterschiedlichste Anwendungen und Erweiterungen. Nicht zum Systemkern gehörende Teile werden als Userland bezeichnet. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 26 Betriebssystemkern (2) Bestandteile Ein Systemkern ist in Schichten (oder Layer, siehe Schichtenmodell) aufgebaut, wobei die unteren (maschinennahen) Schichten die Basis für die darüberliegenden bilden. Die oberen Schichten können Funktionen der unteren Schichten aufrufen, aber nicht umgekehrt. Folgende Schichten sind vorhanden (von unten nach oben): • Schnittstelle zur Hardware (Geräte, Speicher, Prozessoren) • Speicherverwaltung (evtl. einschließlich virtuellem Hauptspeicher) • Prozessverwaltung (auch Scheduler genannt) • Geräteverwaltung (auch Device Management genannt) • Dateisysteme Wenn alle diese Funktionen im Systemkern selbst integriert sind, spricht man von einem monolithischen Kernel. Bei einem Mikrokernel finden wesentliche Teile in getrennten Prozessen statt. Daneben, bzw. zwischen den beiden liegend, gibt es noch den sogenannten Makrokernel. Auf jeden Fall außerhalb des Kernels laufen die Anwenderprozesse, die sich der vom Kernel angebotenen Funktionen bedienen, um mit der Maschine zu Dienstag, 30. April Betriebssysteme und nebenläufige kommunizieren. 2013 Anwendugen - Prozesse und Threads 27 Betriebssystemkern (3) Aufgaben eines Kernels : • Schnittstelle zu Anwenderprogrammen (Starten, Beenden, Ein-/Ausgabe, Speicherzugriff) •Kontrolle des Zugriffs auf Prozessor, Geräte, Speicher (Scheduler, Gerätetreiber, Speicherschutz). Möglichst alleiniger Zugriff des Kernels auf diese Ressourcen. •Verteilung der Ressourcen, etwa der Prozessorzeit(en) (bzw. der Prozessoren) auf die Anwenderprogramme •Strukturierung der Ressourcen, etwa Abbildung von Dateisystemen auf blockorientierte Geräte wie Festplatten, Netzwerkprotokoll-Stack auf Netzwerkkarten. •Auflösung von Zugriffskonflikten, etwa Verriegelung bei Mehrprozessorsystemen, Warteschlangen bei knappen Ressourcen •Virtualisierung der Ressourcen (Prozessor: Prozesse, Festplatte: Dateien, Netzwerkkarte: z. B. Sockets, Speicher: virtueller Speicher, Geräte: Spezialdateien) •Überwachung von Zugriffsrechten auf Dateien und Geräte bei Mehrbenutzersystemen Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 28 Betriebssystemkern (4) Schichten eines Unix Betriebssystems User Interface Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 29 Betriebssystemkern (5) Kernel Mode – User Mode Kernel und user space sind unterschiedliche Teile des Adressraumes. User space ist reservierter Bereich für applikationen (jede einen eigenen Bereich). Kernel space ist auch ein reservierter Bereich, jedoch nur einer für alle Anwendungen, die dort nicht schreiben können. Nur das Betriebssystem kann den Prozessor auf kernel mode umschalten und auf diesen Bereich zugreifen... Anwendungen laufen dagegen normalerweise nur im user mode des prozessors, und verwenden damit einen eingeschränkten Befehlssatz ist. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 30 Betriebssystemkern (6) CPU- Betriebsarten: Kernel Mode – User Mode Das Programmstatuswort der CPU enthält die aktuelle Betriebsart: kernel mode, user mode Damit wird ein Schutzsystem realisiert kernel mode: - privilegierte Betriebsart (nur für Betriebssystem) - alle Instruktionen sind erlaubt, inbes. IO auf Hardware user mode:- nicht privilegierte Betriebsart - nicht alle Instruktionen sind erlaubt (z.B. Zugriff auf Ein-/Ausgabe) - nicht alle Register dürfen verändert werden (z.B. Register für Speicherkonfiguration) Umschaltung in Kernmodus: mittels Interrupt (über SW oder HW ausgelöst) Umschaltung in Benutzermodus: mittels Maschinenbefehl bzw. PSWModifikation Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 31 Realisierung von Threads im Kern(2) Kern hat Thread-Tabelle, die alle Ein Thread Paket, Threads im System verwaltet verwaltet vom Kern Thread-Tabelle enthält Informationen über Register, Zustand... der einzelnen Threads Alle Aufrufe, die blockieren können, sind als Systemaufrufe realisiert mit höheren Kosten als Aufrufe im Laufzeitsystem – aber: wenn ein Thread blockiert, hat der Kern die Möglichkeit, einen anderen (prozesseigegnen oder fremden) Thread zu starten Fazit: flexibel, aber teuer Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 32 Hybride Implementierung Multiplexen von Benutzer-Level-Threads in Kern-Threads = Versuch, die Vorteile beider Implementierungen zu verbinden Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 33 Scheduler Activations • Ziel: – Verbindung der Funktionalität von Kern-Threads mit der Performance von Benutzeradressraum Threads • Vermeiden von unnötigen user/kernel Umschaltungen • Kern ordnet jedem Prozess virtuelle Prozessoren zu und veranlasst das Laufzeitsystem (im Benutzeradressraum) den Prozessoren Threads zuzuordnen (geht auch bei Multiprozessorsystemen) • Grundidee: Wenn der Kern weiss, dass ein Thread durch einen blockierenden Systemaufruf oder Seitenfehler blockiert hat, benachrichtigt er das Laufzeitsystem (Upcall) Das Laufzeitsystem kann seine Threads darauf hin neu schedulen, also den gegenwärtigen Thread als blockiert markieren und einen anderen starten • Problem: Fundamental reliance on kernel (lower layer) calling procedures in user space (higher layer) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 34 Pop-Up Threads Erzeugen eines neuen Threads, wenn eine Nachricht eintrifft (a) bevor die Nachricht eintrifft (b) nachdem die Nachricht eintrifft Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 35 Multithreading • • • • • • Üblich: zuerst nur ein Thread Startet weitere threads(z.B. thread_create (proc_name)) Manchmal hierarchisch, manchmal flach Wenn thread fertig: thread_exit Warten auf thread-Ende: thread_wait CPU freiwillig hergeben: thread_yield Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 36 Posix Thread Beispiel – 1 Main 1 PROGRAM ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ForThreads Funktionsbeschreibung: Thread Testprogramm Programm kreiert und startet mehrere Threads: - Worker wird mehrmals kreiert (Master-Worker) und gestartet. Diese Workerthreads arbeiten periodisch mit Hilfe eines Timers. Sie stoßen wiederum alle den selben Thread an - Thread2 ist der mittels pthread_cond_signal von Worker angestossene Thread, der in einer Endlosschleife mit pthread_cond_wait auf Aufträge wartet. Er muss vom Hauptprogramm mit pthread_cancel explizit beendet werden - Thread3 läuft als unabhängiger Thread und führt eine Anzahl Iterationen aus. Für ihn werden Scheduling-Parameter (Priorität) gesetzt. - Das Programm endet erst, wenn alle Threads abgearbeitet oder beendet sind. Geprüft wird dies mit pthread_join. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 37 Posix Thread Beispiel – 2 benutzte Posix Funktionen ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Functions: pthread_cond_init pthread_cond_broadcast pthread_cond_signal pthread_create pthread_join pthread_mutex_init pthread_mutex_lock pthread_mutex_unlock pthread_setschedparam Conditionvariable erzeugen und mit Defaultwert initialisieren Alle Thread, die auf eine bestimmte Condition-Variable hören, benachrichtigen Einen Thread, der auf eine bestimmte Condition-Variable hört, benachrichtigen Einen Thread erzeugen Synchronisieren mehrerer Threads Mutexvariable erzeugen und mit Defaultwert initialisieren Mutex locken vor broadcast Mutex unlocken nach broadcast Scheduling Verfahren und Priorität für einen Thread festlegen ! !D- Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 38 Posix Thread Beispiel – 3 Datendeklaration INCLUDE 'GEN_INCL:ST(PThreads)' EXTERNAL Test_Thread1 EXTERNAL TestF_Thread2 EXTERNAL Test_Thread3 PARAMETER PTHREAD_MUTEX_DEFAULT = 0 PARAMETER anzworkers = 4 INTEGER *4 ThrCount , SchedNr INTEGER *4 INDX , IStatus INTEGER *4 ThreadStackSize /819200/ !size_t INTEGER *4 exitval RECORD /pthread_mutex_t/ SlowMutex, WeckMutex, CountMutex, RECORD /pthread_cond_t/ WeckCond, CountCond COMMON /COM_Threads/ SlowMutex, WeckMutex, CountMutex, WeckCond, 1 CountCond, ThrCount REAL *4 x /1.0/ RECORD /pthread_t/ Worker (anzworkers) RECORD /pthread_t/ Thread2 RECORD /pthread_t/ Thread3 RECORD /pthread_attr_t/s_gl_pthread_attr RECORD /pthread_attr_t/s_gl_pthread_attr2 RECORD /sched_param/schedparam Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 39 Posix Thread Beispiel – 4 Threads erzeugen ThrCount = 0 schedparam.sched_priority = 9 !PRI_FG_MIN_NP 8 - 15! CALL pthread_mutex_init(CountMutex,%VAL(PTHREAD_MUTEX_DEFAULT)) CALL pthread_mutex_init(WeckMutex,%VAL(PTHREAD_MUTEX_DEFAULT)) ! Thread Condition Varibale initialisieren IStatus = pthread_cond_init(WeckCond, ) IStatus = pthread_cond_init(CountCond,) IStatus = pthread_attr_init(s_gl_pthread_attr) IStatus = pthread_attr_init(s_gl_pthread_attr2) IStatus = pthread_attr_setstacksize(s_gl_pthread_attr, ThreadStackSize) IStatus = pthread_attr_setstacksize(s_gl_pthread_attr2, ThreadStackSize) DO INDX = 1,anzworkers ! Eine Prozedur mehrmals als Thread erzeugen (anzworkers) IStatus = pthread_create(Worker(INDX), %VAL(PTHREAD_CREATE_JOINABLE), 1 test_thread1, %VAL(Indx)) ENDDO IStatus = pthread_create(Thread2, %VAL(PTHREAD_CREATE_JOINABLE), test_thread2, %VAL(anzworker+1)) IStatus = pthread_create(Thread3, %VAL(PTHREAD_CREATE_JOINABLE), test_thread3, %VAL(anzworker+2)) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 40 Posix Thread Beispiel – 5 benachrichten und beenden ! ! Prioritäten der Threads festlegen ! IStatus = pthread_setschedparam (%VAL(Thread3.Pointer), %VAL(Sched_Other), schedparam) ! ! Mittels Broadcast alle Threads der Variante Worker wecken ! IStatus = pthread_cond_broadcast (%REF(WeckCond)) PRINT*,'alle Threads aktiviert, Main wartet noch auf Rückmeldung ' ! ! Mittels Signal Thread2 wecken ! IStatus = pthread_cond_signal(%REF(CountCond)) ! ! Ende aller Threads abwarten/oder herbeiführen ! DO INDX = 1, anzworkers IStatus = pthread_join32(%VAL(Worker(INDX).Pointer),exitval) ENDDO IStatus = pthread_join32(%VAL(Thread3.Pointer),exitval) IStatus = pthread_cancel (%VAL(Thread2.Pointer)) IStatus = pthread_join32(%VAL(Thread2.Pointer),exitval) END Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 41 Posix Thread Beispiel – 6 test_Thread1,arbeitet periodisch, terminiert selbst SUBROUTINE test_thread1(thrnum) IMPLICIT NONE ! ! Thread wird mehrfach (Anzahl= anzworkers), konkurrierend in MAIN erzeugt ! und mittels Broadcast geweckt. ! ! Verwendete Prozeduren: ! ! pthread_cond_wait Warten auf Ereignis und aufwachen des Threads mit Mutex ! pthread_cond_timedwait Warten auf Ereignis mit Timeout (verwendbar als Timer bei Threads) ! pthread_get_expiration_np Bestimmung der Ablaufzeit des Timers indem zur Systemzeit ein ! Delta in Sekunden addiert wird ! pthread_mutex_lock WeckMutex locken für pthreadcond_wait ! INCLUDE 'GEN_INCL:ST(PThreads)' INTEGER *4 ThrCount RECORD /pthread_mutex_t/ SlowMutex RECORD /pthread_mutex_t/ WeckMutex RECORD /pthread_mutex_t/ CountMutex RECORD /pthread_cond_t/ WeckCond RECORD /pthread_cond_t/ CountCond COMMON /COM_Threads/ SlowMutex, WeckMutex, CountMutex, WeckCond, 1 CountCond, ThrCount CHARACTER * 8 CTime INTEGER *4 a , thrnum, Error, INDX /0/, IStatus RECORD /PThread_TimeSpec_T/ WaitTime, ResWaitTime Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 42 Posix Thread Beispiel – 7 test_Thread1,arbeitet periodisch, terminiert selbst CALL TIME (CTime) a = %LOC(thrnum) PRINT *, a,%LOC(a), ' thread ',a,' gestartet um:',CTime,%LOC(CTime), %LOC(WaitTime.tv_sec) WaitTime.tv_sec = 4 WaitTime.tv_nsec = 0 ! Synchronisierung der Threads mit dem Hauptprogramm mittels einer ! Condition Variablen IStatus = pthread_mutex_lock(WeckMutex) IStatus = pthread_cond_wait(WeckCond, WeckMutex) IStatus = pthread_mutex_unlock (WeckMutex) ! ! Timer definieren ! IStatus = pthread_get_expiration_np (%REF(waittime),%REF(reswaittime)) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 43 Posix Thread Beispiel – 8 test_Thread1,arbeitet periodisch, terminiert selbst DO INDX = 1,4 IStatus = pthread_mutex_lock(CountMutex) thrCount = thrCount + 1 IStatus = pthread_mutex_unlock(CountMutex) IStatus = pthread_mutex_lock (WeckMutex) IStatus = pthread_cond_timedwait(WeckCond, WeckMutex, reswaittime) Error = pthread_mutex_unlock (WeckMutex) CALL TIME (CTime) IF (IStatus .EQ. 0)THEN PRINT*,a,%LOC(a),' ', IStatus,' über Mutex/Condition rausgekommen' ELSEIF (IStatus .EQ. ETIMEDOUT) THEN PRINT*,a,%LOC(a),' Timer abgelaufen thread ',a,' Lauf:',INDX,' ',CTime ELSE PRINT*,a,%LOC(a),' Ende von Condition Wait Lauf ',INDX,' um',CTime,' Fehler ', IStatus ENDIF IStatus = pthread_get_expiration_np (%REF(waittime),%REF(reswaittime)) IStatus = pthread_cond_signal(CountCond) ! Signal an einen anderen Thread, einen anderen Thread anstoßen ENDDO PRINT*,a,%LOC(a), ' Fertig....thread',a RETURN END Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 44 Posix Thread Beispiel – 9 Endlos Thread, wird von main gestoppt SUBROUTINE test_thread2(thrnum) IMPLICIT NONE ! ! Endlos-Thread sitzt in ConditionWait und wird von anderen Threads ! via SIGNAL geweckt um dann irgendeinen Unsinn zu machen ! Zusätzlich: Sperren und Freigeben einer globalen Variablen mittels ! Mutex Lock und Unlock ! Beenden des Endlos-Threads via PTHREAD_CANCEL in MAIN ! ! Verwendete Prozeduren: ! ! pthread_mutex_init Initialisierung der Mutexvariablen ! für pthread_cond_wait ! pthread_cond_wait Aufwachen des Threads mit Mutex ! pthread_mutex_lock WeckMutex locken für pthread_cond_wait ! pthread_mutex_unlock WeckMutex freigeben nach ! pthread_cond_wait INCLUDE 'GEN_INCL:ST(PThreads)' INTEGER *4 ThrCount RECORD /pthread_mutex_t/ SlowMutex RECORD /pthread_mutex_t/ WeckMutex RECORD /pthread_mutex_t/ CountMutex RECORD /pthread_cond_t/ WeckCond RECORD /pthread_cond_t/ CountCond COMMON /COM_Threads/ SlowMutex, WeckMutex, CountMutex, WeckCond, 1 CountCond, ThrCount RECORD /pthread_mutex_t/ WaitMutex Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 45 Posix Thread Beispiel – 10 Endlos Thread, wird von main gestoppt CHARACTER * 8 CTime REAL *4 count /3.0/, x, y INTEGER *4 a, thrnum, I, IStatus IStatus = pthread_mutex_init(WaitMutex,) a = %LOC(thrnum) IStatus = 0 DO WHILE (IStatus .EQ. 0) x = SIN(count) Count = Count + 1 CALL Time (CTime) IStatus = pthread_mutex_lock(WaitMutex) IStatus = pthread_cond_wait(CountCond, WaitMutex) IStatus = pthread_mutex_unlock(WaitMutex) ! Bereich der globalen Variablen thrcount schuetzen IStatus = pthread_mutex_lock(CountMutex) thrCount = INT(Count) + 1 DO I =2,3 y = y+(y*(i+1)/(i-1)) ENDDO PRINT*,a,' y in Thread Typ 2',y PRINT*,a,' Absolute Anzahl in Thread Typ 2 ',thrcount IStatus = pthread_mutex_unlock(CountMutex) ENDDO RETURN END Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 46 Posix Thread Beispiel – 11 test_thread3 - 1 SUBROUTINE test_thread3 (thrnum) IMPLICIT NONE ! ! Thread wird in MAIN gestartet und führt Berechnungen mit ! vielen Iterationsschritten durch. Getestet (demontriert) wird die ! Prioriätssteuerung (Scheduling) dieses Threads im Verhältnis ! zu den konkurrierenden Threads. ! INCLUDE 'GEN_INCL:ST(PThreads)' LOGICAL *4 Thread_Hold INTEGER *4 ThrCount RECORD /pthread_mutex_t/ SlowMutex RECORD /pthread_mutex_t/ WeckMutex RECORD /pthread_mutex_t/ CountMutex RECORD /pthread_cond_t/ WeckCond RECORD /pthread_cond_t/ CountCond COMMON /COM_Threads/ SlowMutex, WeckMutex, CountMutex, WeckCond, 1 CountCond, ThrCount CHARACTER *8 CTime REAL *4 x REAL *4 y /1.0/ INTEGER *4 a INTEGER *4 count1 /1/ INTEGER *4 count /3/ INTEGER *4 I INTEGER *4 thrnum Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 47 Posix Thread Beispiel – 12 test_thread3 - 2 a = %LOC(thrnum) CALL TIME (CTime) PRINT *, a,' thread ',a,' gestartet um:',CTime DO count = 1, 999999 y = 1.0 x = sin(float(count)) DO I =3, 5 y = y+(y*(i+1)/(i)) ENDDO IF(MOD (count,10000) .EQ. 0) THEN PRINT*,a,' x = sin(float(count))',x,' count ',count PRINT*,a,' y in Thread Typ 3 ',y ENDIF ENDDO PRINT*,a,' y in Thread Typ 3 ',y PRINT*,a,' Fertig!..thread ',a RETURN END Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 48 Singlethread-Programme multithreadfähig machen (1) Konflikte zwischen Threads beim Gebrauch globaler Variablen Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 49 Singlethread-Programme multithreadfähig machen (2) Threads können private globale Variablen haben Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 50 Interprozesskommunikation IPC • Weil Prozesse vom Betriebssystem gegenseitig von einander geschützt werden (Speicherschutz !), braucht man eine Interprozesskommunikationen, falls Prozesse untereinander kommunizieren, aufeinander warten oder Daten und Ressourcen austauschen müssen. • Typische Fälle dafür sind: – Mehrere Prozesse müssen spezielle Daten gemeinsam verwenden. – Die Prozesse sind untereinander abhängig und müssen aufeinander warten. – Daten müssen von einem Prozess zu einem anderen weitergereicht werden. – Die Verwendung von Systemressourcen muss koordiniert werden Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 51 IPC – Techniken unter Linux Entnommen dem openbook von Galileo unter: http://openbook.galileocomputing.de/linux_unix_programmierung/Kap09000.htm#RxxKap09000040002B71F02D10D • • • • • • • • • Namenlose Pipes Benannte Pipes (FIFO Pipes) Message Queue (Nachrichtenspeicher) Semaphore Shared Memory (gemeinsamer Speicher) STREAMS Sockets Lock Files (Sperrdateien) Datei Sperren (Record Locking) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 52 IPC – Techniken unter Linux Namenlose Pipes • Pipes, wie auch FIFOs (named Pipes), sind die einzigen beiden IPCs, die garantiert auf jedem System vorhanden sind. • Eine Pipe ist ein unidirektionaler Kommunikationskanal zwischen zwei verwandten Prozessen • $ ps ax | less startet in der Shell zwei Prozesse. Einer führt das Kommando ps ax aus und schreibt das Ergebnis an die Standardausgabe. Durch die Pipe (|) wird allerdings diese Standardausgabe an den Prozess less weitergeleitet. less liest hierbei die Daten von der Standardeingabe ein und gibt aus, was ihm das Kommando ps durch die Pipe zuschickt Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 53 IPC – Techniken unter Linux -Pipes • Wenn Daten in beide Richtungen ausgetauscht werden, muss eine zweite Pipe dazu verwendet werden. Eine Pipe ist wie ein Rohr, wo Daten in die eine Seite (Prozess A) hineingesteckt werden und bei Prozess B wieder herauskommen. • Eine Pipe dient außer zur Kommunikation zwischen zwei Prozessen zur Flusskontrolle, weil eine Pipe nur eine bestimmte Menge an Daten aufnehmen kann. Ist die Pipe voll, wird ein Prozess mindestens so lange angehalten, bis mindestens ein Byte aus der vollen Pipe gelesen wurde und Platz vorhanden ist, um die Pipe wieder mit Daten zu befüllen. Andersherum: ist die Pipe leer, wird der lesende Prozess so lange angehalten, bis der schreibende Prozess etwas in diese Pipe schickt. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 54 IPC – Techniken unter Linux -Pipes • Es gibt also eine Schreibseite und eine Leseseite bei einer Pipe. Somit ist also nur eine Kommunikation in einer Richtung möglich (half-duplex): Eigenschaften von elementaren E/A-Funktionen bei Pipes • read() – liest Daten vom Ende des Puffers der Pipe, entweder – synchron (blockierend), bis sich genügend Daten in der Pipe befinden. Schreibt kein Prozess in die Pipe, blockiert read() so lange, bis der schreibende Prozess den Systemaufruf close() aufruft. Dieses Blockieren von read() eignet sich zum Synchronisieren von Prozessen. oder – asynchron (nicht blockierend) , indem mit der Funktion fcntl() das Flag O_NONBLOCK oder O_NDELAY gesetzt wird. Ist die Pipe fürs Schreiben geöffnet worden, aber momentan leer, liefert read() 0 (nicht EOF) zurück Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 55 IPC – Techniken unter Linux -Pipes • write() schreibt die Daten immer ans Ende des Pipe-Puffers, entweder . – synchron (blockierend): Ist die Pipe voll, wird der schreibende Prozess so lange blockiert, bis wieder genügend Platz zum Schreiben vorhanden ist oder – • asynchron (nicht blockierend), indem mit der Funktion fcntl() das Flag O_NONBLOCK oder O_NDELAY gesetzt wird. Bei vollem Puffer liefert der schreibende Prozess 0 zurück.. Meistens betreibt man eine Pipe blockierend. Ein Schreiben innerhalb der PIPE_BUF-Grenze ist atomar, kein anderer Prozess kann dieses Schreiben unterbrechen und selbst in die Pipe schreiben. Versucht ein Prozess, in eine Pipe zu schreiben, die noch von keinem anderen Prozess zum Lesen geöffnet wurde, wird dem Prozess das Signal SIGPIPE (broken pipe) gesendet, was standardmäßig den Abbruch des schreibenden Prozesses bedeutet. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 56 IPC – Techniken unter Linux Benannte Pipes • Mit Pipes können nur miteinander verwandte Prozesse (fork()) kommunizieren. Mit FIFOs (benannten Pipes) kann man mit einem völlig fremden Prozess kommunizieren, da solche Pipes über einen Dateinamen angesprochen werden können. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 57 IPC – Techniken unter Linux Benannte Pipes - ein Beispiel • • • • • • • • • • • • • Auf der Shell lässt sich ein FIFO folgendermaßen erstellen: $ mkfifo fifo1 Bei einem Blick ins aktuelle Arbeitsverzeichnis finden Sie das FIFO unter folgendem Eintrag: $ ls -l prw-r--r-- 1 tot users 0 2003–12–07 10:53 fifo1 Am p am Anfang erkennen Sie das FIFO. Sie könnten jetzt etwas in das FIFO schreiben: [tty1] $ echo Der erste Eintrag in das FIFO > fifo1 [tty2] $ echo Der zweite Eintrag in das FIFO > fifo1 Beide Dialogstationen blockieren im Augenblick und warten, bis die Daten im FIFO ausgelesen werden. Wir öffnen eine dritte Konsole und lesen ihn aus: [tty3] $ cat fifo1 Der zweite Eintrag in das FIFO Der erste Eintrag in das FIFO Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 58 IPC – Techniken unter Linux Benannte Pipes - Kommunikationsmodell eines FIFO (First In - First Out) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 59 IPC – Techniken unter Linux Message Queue (Nachrichtenspeicher) ist ein Mechanismus zum Austausch von Nachrichten zwischen Prozessen. Die Nachrichten werden dabei von einem Prozess an einen Speicher (der Message Queue = Nachrichtenschlange) geschickt und können dort von einem anderen Prozess abgeholt werden. • • • • Größe und Anzahl der Nachrichten werden vom System festgelegt. Die Nachricht selbst besteht aus einem Text und einem Nachrichtentyp. Die Nachrichten werden in der Reihenfolge, in der diese eintreffen, auch wieder ausgelesen. Fordert ein Prozess eine Nachricht an, so kann über eine Option angegeben werden, dass dieser entweder so lange angehalten wird, bis eine Nachricht eingeht, oder sofort zur Programmausführung zurückkehrt und eventuell einen Fehlercode ausgibt. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 60 IPC – Techniken unter Linux Message Queue Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 61 IPC – Techniken unter Linux Shared Memory • Mehrere Prozesse können auf einen gemeinsamen Datenspeicherbereich zugreifen. 1. Ein Prozess muss diesen gemeinsamen Datenspeicher anlegen. 2. Prozesse, die ebenfalls darauf zugreifen sollen, werden mit diesem Datenspeicher bekannt gemacht, indem der Speicherbereich im Adressraum der entsprechenden Prozesse eingefügt wird. Ebenfalls muss hierbei den Prozessen mitgeteilt werden, wie diese auf den Speicherbereich zugreifen können (lesend/schreibend). • Leider wurde mit dem Shared Memory IPC keine explizite Synchronisation zur Verfügung gestellt, weshalb man diese Kontrolle selbst noch mit z. B. Sperren oder Semaphoren herstellen muss. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 62 IPC – Techniken unter Linux Sockets • Sockets wurden im Berkeley-UNIX-System (BSD) als Kommunikation zwischen Prozessen auf verschiedenen Rechnern über ein Netzwerk eingeführt. Sockets können zur Kommunikation verschiedenste Protokolle benutzen, z. B. TCP/IP, UDP/IP oder UNIX Domain Sockets. Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 63 Interprozess Kommunikation IPC Race Conditions – Wettlaufsituationen Was passiert, wenn zwei Prozesse auf gemeinsam genutzten Speicher gleichzeitig zugreifen wollen? Beispiel Druckerspooler Prozess A liest in = 7 A wird unterbrochen Prozess B liest in = 7 B trägt Dateinamen an Stelle 7 und aktualisiert in auf 8 A wird aktiviert und trägt ebenfalls den Dateinamen auf Stelle 7. Datei von B wird nicht Dienstag, 30. April Betriebssysteme und nebenläufige gedruckt 2013 Anwendugen - Prozesse und Threads 64 IPC - Race Conditions –Wettlaufsituationen • Situationen, in denen zwei oder mehr Prozesse einen gemeinsamen Speicher lesen oder beschreiben und das Endergebnis davon abhängt, wer wann genau läuft, werden Race Conditions genannt. • Programme, die Race Conditions enthalten, zu debuggen, macht keinen Spaß, weil Abläufe nicht reproduzierbar sind. Sie müssen vermieden werden! Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 65 IPC - Kritische Abschnitte (1) Die Teile des Programms, in denen auf gemeinsam genutzten Speicher (Resourcen) zugegriffen wird, nennt man kritische Region oder kritischer Abschnitt •    Keine zwei Prozesse dürfen gleichzeitig in ihren kritischen Bereichen sein Es dürfen keine Annahmen über Anzahl und Geschwindigkeiten von CPUs gemacht werden Kein Prozess, der außerhalb seines kritischen Bereichs läuft, darf andere Prozesse blockieren Kein Prozess sollte ewig darauf warten müssen, in seine kritische Region einzutreten Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 66 IPC - Kritische Abschnitte (2) • Wechselseitiger Ausschluss (Mutual exclusion) unter Verwendung von kritischen Regionen Dienstag, 30. April Betriebssysteme und nebenläufige 2013 Anwendugen - Prozesse und Threads 67 IPC - Wechselseitiger Ausschluss durch aktives Warten - Unterbrechungen ausschalten Einfachste Möglichkeit: jeder Prozess kann die Interruptbehandlung im Prozessor ausschalten, wenn er in seinen kritischen Bereich eintritt. -> Schedular kann Prozess nicht unterbrechen – keine Raceconditions - Problem gelöst ! Aber: Was ist , wenn der Prozess nachher die Interruptbehandlung nicht wieder aktiviert? Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 68 IPC - Wechselseitiger Ausschluss durch aktives Warten - Variablen sperren Softwarelösung: es wird eine gemeinsame Sperrvariable (SV) beutzt. Ist SV 0, darf ein Prozess den Bereich betreten, zuvor setzt er SV 1. Notwendige Schritte: 1. SV aus dem Speicher laden 2. SV auf null testen 3. wenn nicht, weiter bei 1. 4. SV auf 1 setzten 5. kritischen Bereich betreten Angenommen, SV = 0. Was passiert, wenn der Scedular P1 im Schritt 2 unterbricht und P2 mit Schritt eins beginnt ? Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 69 IPC - Wechselseitiger Ausschluss durch aktives Warten - Strikter Wechsel (a) Process 0. a betritt, wenn turn = 0 (b) Process 1. b betritt, wenn turn = 1 "Kein Prozess, der außerhalb seines kritischen Bereichs läuft, darf andere Prozesse blockieren" kann hier verletzt werden ! Betriebssysteme und nebenläufige Dienstag, 30. April 2013 Anwendugen - Prozesse und Threads 70 IPC - Wechselseitiger Ausschluss durch aktives Warten - Petersons Lösung Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 71 IPC - Wechselseitiger Ausschluss durch aktives Warten - Petersons Lösung Angenommen, beide Prozesse rufen enter_region beinahe gleichzeitig auf: Beide speichern ihre Prozessnummern in turn Wer zuletzt kam gewinnt. Das erste Ergebnis geht verloren. z.B. turn = 1: Wenn beide Prozesse zur while Schleife kommen, führt sie Prozess 0 null mal aus und betritt die kritische Region. Prozess 1 geht in die Schleife und betritt seine kritische Region so lange nicht, bis Prozess 0 seine kritische Region verlässt. Petersons Lösung für wechselseitigen Ausschluss Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 72 IPC - Wechselseitiger Ausschluss durch aktives Warten - TSL Anweisung Eintreten und Verlassen der kritischen Region unter Verwendung der TSL Anweisung Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 73 IPC - Wechselseitiger Ausschluss durch aktives Warten - Nachteile Nachteile des aktiven Wartens: • Warten verbraucht CPU Zeit • Ist ein Process mit sehr hoher Priorität in enter_region, kommt er aus der while Schleife nicht mehr heraus, wenn ein Prozess mit sehr niedriger Priorität in leave_region einfach nie dran kommt Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 74 IPC - Sleep and Wakeup ErzeugerVerbraucher Problem Zwei Prozesse benutzen einen gemeisamen allgemeinen Puffer mit fester Größe. Der Erzeuger legt Informationen hinein, der Verbraucher nimmt sie heraus. Synchronisation ist notwendig bei Aufruf von sleep blockiert der Schedular den thread nach Aufruf von wakeup setzt ihn der Schedular wieder auf laufbereit Dienstag, 30. April 2013 Erzeuger-Verbraucher Problem Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 75 IPC - Sleep and Wakeup - Ermitteln Sie die Race Condition ! Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 76 IPC-Sleep and Wakeup –Race Condition Beispiel: 1. Puffer ist leer 2. consumer hat gerade count gelesen (= = 0) und will sleep aufrufen. 3. Schedular unterbricht consumer 4. Schedular startet producer 5. producer fügt Nachricht ein, erhöht count um 1 6. producer merkt, dass count = 1 ist und weckt den consumer, der offensichtlich schlafen muss. consumer schläft aber noch gar nicht, Weckruf geht verloren. 7. Schedular startet wieder consumer 8. consumer prüft den count, den er vorher gelesen hat (==0) und geht schlafen 9. Irgendwann erzeugt der producer neuen Eintrag und geht auch Problem ist nur, dass ein Wecksignal verloren gehen kann! schlafen. Dienstag, 30. April Betriebssysteme und nebenläufige 10. Jetzt schlafen beide für immer ! 2013 Anwendugen - Prozesse und Threads 77 IPC - Semaphoren : Erzeuger-Verbraucher Problem    Dienstag, 30. April 2013 Die down Operation eines Semaphors prüft, ob der Wert größer 0 ist.  S > 0, down erniedrigt den Wert um eins (z.B. um einen gespeicherten Weckruf zu verbrauchen) und macht einfach weiter  S = 0, Prozess oder Thread wird sofort schlafen gelegt down ist atomare (nicht unterbrechbare) Operation und verhindert deshalb Race Conditions up und down werden in der Regel als Systemaufrufe realisiert, bei denen das BS alle Unterbrechungen ausschaltet, solange es die Semaphore überprüft, sie aktualisiert und den Prozess ggf. schlafen legt Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 78 IPC Semaphoren : Erzeuger-Verbraucher Problem     Die up Operation erhöht den Wert um eins gibt es schlafende Prozesse ( in der Operation down) wird einer von ihnen geweckt, dekrementiert das Semaphore wieder auf 0 und kommt aus dem down zurück. Somit bleibt nach einem up an ein Semaphore, auf das schlafende Prozesse warten, der Wert des Semaphores immer noch auf 0, aber es gibt einen Prozess weniger, der wegen des Semaphores schläft. up ist ebenfalls eine atomare Operation . Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 79 IPC - Semaphoren       Dienstag, 30. April 2013 Die Mutex Semaphoren werden für gegenseitigen Ausschluss verwendet. Sie schützen den Puffer vor gleichzeitigem Lesen und Schreiben. Full und empty sind Synchronisationssemaphoren. Empty hält den producer an, wenn der Puffer voll ist. Full hält den Verbraucher an, wenn der Puffer leer ist kein wechselseitiger Ausschluss ! Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 80 IPC - Mutexes Realisierung von mutex_lock und mutex_unlock  vereinfachte Semaphore (kann nicht zählen, binäre Semaphore)  dient dem gegenseitigen Ausschluss, Schutz für kritischen Bereich  Ähnlich wie Folie Wechselseitiger Ausschluss durch aktives Warten (5) aber: thread_yield gibt die CPU wieder frei, kein aktives Warten Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 81 IPC - Probleme mit Semaphoren Angenommen im Code des producer steht: down (&mutex); down (&empty); insert_item(item); ... Angenommen: der consumer läuft nicht dann: producer betritt 100 mal den kritischen Bereich, dekrementiert empty auf null und geht deshalb im kritischen Bereich schlafen. Jetzt kommt der consumer und kann den kritischen Bereich nicht betreten, legt sich auch schlafen Producer wartet auf up(&empty) des consumers und der consumer wartet auf up(&mutex) des producers. Klassischer Fall eines Deadlock Programmierfehler können leicht passieren Deshalb Monitore! Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 82 IPC - Monitor (1)  Realisiert ein höherstufiges Synchronisationsprinzip als Semaphore  Ist eine Sammlung von Prozeduren, Variablen und Datenstrukturen.  Prozeduren können aufgerufen, deren Variablen aber nicht von außen geändert werden  Definitionsgemäß darf und kann immer nur ein Prozess im Monitor aktiv sein  Monitor ist ein Programmiersprachenkonstrukt, das der Compiler speziell behandlen kann  Der Compiler (nicht der Programmierer) realisiert den wechselseitigen Ausschluß Beispiel eines Monitors in Pidgin Pascal Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 83 IPC - Monitor (2) • Outline of producer-consumer problem with monitors only one monitor procedure active at one time, buffer has N slots Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 84 IPC - Monitors (3) Dienstag, 30. April Betriebssysteme und nebenläufige Solution to producer-consumer problem in Java (part 1) 2013 Anwendugen - Prozesse und Threads 85 IPC - Monitors (4) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 86 IPC – Möglichkeiten Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 87 Message Passing The producer-consumer Dienstag, 30. April Betriebssystemeproblem und nebenläufige with N messages 2013 Anwendugen - Prozesse und Threads 88 Barriers • Use of a barrier – processes approaching a barrier – all processes but one blocked at barrier Dienstag, 30. April Betriebssysteme und nebenläufige 2013 – last process Anwendugen und Threads arrives,- Prozesse all are let through 89 Dining Philosophers (1) • • • • Philosophers eat/think Eating needs 2 forks Pick one fork at a time How to prevent deadlock Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 90 Dining Philosophers (2) A nonsolution to the dining philosophers problem Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 91 Dining Philosophers (3) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads Solution to dining philosophers problem (part 1) 92 Dining Philosophers (4) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads Solution to dining philosophers problem (part 2) 93 The Readers and Writers Problem Betriebssysteme und nebenläufige A solution to the readers and writers problem Anwendugen - Prozesse und Threads Dienstag, 30. April 2013 94 The Sleeping Barber Problem (1) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 95 The Sleeping Barber Problem (2) Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Solution to sleeping barber problem. Anwendugen - Prozesse und Threads 96 Scheduling Introduction to Scheduling (1) • Bursts of CPU usage alternate with periods of I/O wait – a CPU-bound process – an I/O bound process Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 97 Introduction to Scheduling (2) Dienstag, 30. April 2013 Scheduling Algorithm Goals Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 98 Scheduling in Batch Systems (1) An example of shortest job first scheduling Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 99 Scheduling in Batch Systems (2) Dienstag, 30. April 2013 Three levelundscheduling Betriebssysteme nebenläufige Anwendugen - Prozesse und Threads 100 Scheduling in Interactive Systems (1) • Round Robin Scheduling – list of runnable processes –Dienstag, list 30. ofApril runnable processes after B uses up its quantum Betriebssysteme und nebenläufige 2013 Anwendugen - Prozesse und Threads 101 Scheduling in Interactive Systems (2) A scheduling algorithm with four priority classes Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 102 Scheduling in Real-Time Systems Schedulable real-time system • Given – m periodic events – event i occurs within period Pi and requires Ci seconds • Then the load can only be handled if m Dienstag, 30. April 2013 Ci 1  i 1 Pi Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 103 Policy versus Mechanism • Separate what is allowed to be done with how it is done – a process knows which of its children threads are important and need priority • Scheduling algorithm parameterized – mechanism in the kernel • Parameters filled in by user processes – policy set by user process Dienstag, 30. April 2013 Betriebssysteme und nebenläufige Anwendugen - Prozesse und Threads 104 Thread Scheduling (1) Possible scheduling of user-level threads • 50-msec process quantum Dienstag,•30. April Betriebssysteme und nebenläufige threads run 5 msec/CPU burst 2013 Anwendugen - Prozesse und Threads 105 Thread Scheduling (2) Possible scheduling of kernel-level threads • 50-msec process quantum threads runBetriebssysteme 5 msec/CPU burst Dienstag,•30. April und nebenläufige 2013 Anwendugen - Prozesse und Threads 106