Praktische Einführung mit Virtualisierung
Stefan Bosse
Universität Koblenz - FB Informatik
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen ::
Lernziele
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Taxonomie
Wie können Prozesse kommunizieren? Kommunikation ist örtlich, temporal und zustandsbasiert mit Daten.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Taxonomie
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Taxonomie
Prozesse und Threads können lokal auf dem gleichen Rechner oder mithilfe der Netzwerksoftware des Betriebssystems in einer verteilten Umgebung kommunizieren.
bsdp
Überblick über Synchronisation und Kommunikation
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Taxonomie
IPC-Verfahren aus Sicht der Programmierung
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Taxonomie
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
Unter nachrichtenbasierten Verfahren fassen wir alle Mechanismen zusammen, die einen Datenaustausch zwischen Prozessen und Threads mithilfe von Systemfunktionen bewerkstelligen.
Datenabgrenzung bei der Kommunikation
Die Datenabgrenzung bei der Kommunikation hängt von der Form der ausgetauschten Daten ab. Diese ist bestimmend für mögliche Lösungen der Datenabgrenzung.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
E/A ist auch Kommunikation, aber zunächst nur zwischen Prozessen und Geräten.
Beim Datenaustausch mittels Paketen kommen feste, oft standardisierte Datenformate zum Einsatz.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
Unter einer synchronen Kommunikation versteht man den Fall, dass der Sender warten muss, bis der Empfänger zur Entgegennahme der Daten bereit ist (Rendezvous). Bei der asynchronen Kommunikation läuft der Sender hingegen weiter, auch wenn der Empfänger gerade nicht für den Datenempfang bereit ist.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
Synchrone und asynchrone Kommunikation
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
send (destination, &message);receive (source, &message);
Programmierschnittstelle für die synchrone und asynchrone Nachrichtenkommunkation. Bei einer synchronen Art können beide Funktionen den Prozess blockieren. Ein Nachrichtenpuffer message
trägt eine Identifikation (Textname, Deskriptor, Handle o.Ä.).
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
bsdp
Vergleich von synchroner und asynchroner Kommunikation
Bei der synchronen Kommunikation übergibt der Sender die Nachricht direkt an den Empfänger. Typischerweise wird der Datenaustausch in dieser Situation in der Art eines Rendezvous erledigt. Nur wenn sowohl Sender als auch Empfänger bereit sind, kann die Datenübertragung stattfinden.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
Auch bei der Grerätekommunikation kann A. vs S. unterschieden werden.
Viele Programmiersprachen sind vom Paradigma her strikt sequenziell. Es ist nicht möglich mehrer Operationen parallel auszuführen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Nachrichtenbasierte Verfahren
function callback(status,data) { if (!status) print("Error:",status) else if (data) processData(data) }send('edu-9.de','mymessage1',callback) // Time 1send('ag-0.de','mymessage2',callback) // Time 2receive('edu-9.de',callback) // Time 3receive('ag-0.de',callback) // Time 4print('I am finished with my computation. Waiting for I/O completion')// Time 10: callback(...)// Time 12: callback(...)
Asynchone E/A mit Callback Funktionen am Beispiel von JavaScript
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Vergleich von Kommunikationsverfahren
bsdp
Vergleich von Kommunikationsverfahren: Speicherbasiert versa nachrichtenbasiert.
Ein Datenaustausch mittels Speicher kann mithilfe von Systemfunktionen erfolgen oder in Selbstverwaltung, nachdem ein gemeinsamer Speicherbereich eingerichtet wurde.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Vergleich von Kommunikationsverfahren
Threads besitzen ein inherentes geteiltes Specihermodell und können somit unmittelbar ohne weitere System- und Hilfsfunktionen über getilte Speichervariablen kommunizieren, anders als isolierte Prozesse.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Vergleich von Kommunikationsverfahren
void* create_shared_memory(size_t size) { // Our memory buffer will be readable and writable: int protection = PROT_READ | PROT_WRITE; // The buffer will be shared (meaning other processes can access it), but // anonymous (meaning third-party processes cannot obtain an address for it), // so only this process and its children will be able to use it: int visibility = MAP_SHARED | MAP_ANONYMOUS; // The remaining parameters to `mmap()` are not important for this use case, // but the manpage for `mmap` explains their purpose. return mmap(NULL, size, protection, visibility, -1, 0);}...void* shmem = create_shared_memory(16);int * counter = (int*)&shmem[0];*counter=0;int pid = fork();if (pid == 0) { // child process *counter++;} else { // parent process *counter--;}
SHM für zwei Prozesse, hier als "Vererbung" durch das Forking vpn Kindprozessen
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Vergleich von Kommunikationsverfahren
Welchen Wert hat die Zählervariable am Ende? Gibt es Gebote? Wir nehmen einen Mehrkernrechner an.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Vergleich von Kommunikationsverfahren
Welchen Wert hat die Zählervariable am Ende? Gibt es Gebote? Wir nehmen einen Mehrkernrechner an.
Keine Ahnung. Die möglichen Ergebniswerte von counter können {-1,0,1} sein. Das Ergebnis ist nicht deterministisch.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Vergleich von Kommunikationsverfahren
Andrew Forney
Vergleich von Kommunikationsverfahren: Nachrichtenbasiert versa speicherbasiert.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Verbindungsorientierung
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Verbindungsorientierung
Halb- und Vollduplex-Betrieb
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Verbindungsorientierung
Diese Kommunikationsform empfiehlt sich, wenn nur einzelne Datentransfers, aber möglicherweise an viele verschiedene Empfänger, nötig sind.
bsdp
Vergleich von verbindungsorientierter und verbindungsloser Kommunikation.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Empfängeradressierung
Empfängeradressierung bei der Kommunikation
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Empfängeradressierung
Bei einem unicast (1:1) wird genau ein bestimmter Empfänger angesprochen. Bei einem multicast (1:m) wird eine definierte Gruppe an Empfängern (m) adressiert. Der anycast übermittelt Daten an irgendeinen Empfänger, mindestens einen einzigen (1:1..n). Der broadcast schließlich geht an alle Empfänger (n), die sich finden lassen (1:n). Welche Empfängeradressierung eine Lösung unterstützt, ist implementationsabhängig. Meistens ist es aber nur der unicast.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Empfängeradressierung
Erfolgen bei einem Datenaustausch alle Übertragungen mit der gleichen Priorität, so werden sie bei einer Zwischenpufferung in der FIFO-Reihenfolge abgelegt.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Empfängeradressierung
Der gepufferte Nachrichtenaustausch eignet sich zur Realisierung eines Client/Server-Betriebs.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Empfängeradressierung
Client/Server-Prinzip mittels Meldungen
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Pipe als Verbindungskanal zweier Prozesse
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Pipe als Verbindungskanal zweier Prozesse
int main(){ int fds[2]; // Für Pipe-Dateideskriptoren char *text = "Hallo da!\n"; // Zu transferierender Text char buffer [5]; // Lesepuffer int count, status; // Leseanzahl bzw. Endstatus pipe(fds); // Unnamed pipe erzeugen if (fork() == 0) { // Kindprozess 1: dup2(fds[1], 1); // stdout auf Pipe-Eingang legen close(fds[0]); // Pipe-Ausgang schließen write(1,text,strlen(text)+1); // Text in Pipe schreiben } else if (fork() == 0) { // Kindprozess 2: dup2(fds[0], 0); // Pipe-Ausgang auf stdin legen close(fds[1]); // Pipe-Eingang schließen while ((count = read(0, buffer, 4)) != 0) { // Wiederholt auslesen buffer[count]= 0; // »string terminating zero« printf("%s", buffer); // Laufend ausgeben } } else { // Elternprozess: close(fds[0]); // Pipe-Ausgang schließen close(fds[1]); // Pipe-Eingang schließe wait(&status); // Warte auf erstes Kind wait(&status); // Warte auf zweites Kind } exit(0);}
Ein einfaches Zwei-Prozess-Kommunikationssystem über Pipers
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Pipe als Verbindungskanal zweier Prozesse
Hier werden die Pipes als "virtuelle" Dateien über ds Dateisystem von Prozessen mit üblichen Read und Write Operationen geteilt.
Client/Server-Konstellation mit benannten Unix-Pipes
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Message Queues
Die Unix-Pipes sind gut geeignet für die Übertragung von Daten, wenn eine klare Abgrenzung der einzelnen gesendeten Daten voneinander nicht notwendig ist (Bytestrom). Stehen gut definierte Meldungen im Vordergrund, so bieten sich die Message Queues an.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Message Queues
bsdp
Aufbau einer Message Queue
Eine Meldung besteht immer aus den zwei Teilen msg_typ und msg_txt, die den Meldungstyp und den Meldungsinhalt repräsentieren. Wie in einer eigenen Applikation ein Meldungstyp deklariert werden kann, zeigt nachfolgendes Beispiel:
struct meine_nachricht { long msg_typ; char msg_txt[100];}
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Bisher wurde nachrichtenbasierte Kommunikation eingeführt. Nebem dem Nachrichtenaustausch (Kooperation) ist aber auch die Konfliktlösung bei Wettbewerb wichtig, also eine sequenzielle Synchronisation.
Vorteilhafter als eine Lösung mit Selbstverwaltung ist der Einsatz von sogenannten Semaphoren. Es handelt sich dabei um Betriebssystem- und Synchronisationsobjekte für die Absicherung und Synchronisation von Prozessen bzw. Datenkonsistenz. Der Semaphor und ihre Operationen P und V wurden 1962 von E. Dijkstra erstmals systematisch entwickelt und dargestellt
Wir unterscheiden wieder zwei Arten der Prozessinteraktion:
Der Semaphor kann zur Synchronisation für beide Arten verwenden werden.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
bsdp
Semaphor mit einer Identität (Instanzenbezeichnung), den Operationen P/V und den Attributen Zähler (für Marken) und Warteschlange (für Prozesse)
Der Semaphor implementiert einen geschützten Zähler (Marken, Tokens) mit einer Prozesswarteschlange:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
(Oben) Definition der P-Operation: Der aufrufende Prozess erhält entweder sofort eine Marke oder muss warten, bis eine verfügbar wird (dazu wird er an die Warteschlange des Semaphors angefügt). (Unten) Definition der V-Operationen: Der aufrufende Prozess übergibt eine Marke entweder dem Semaphor oder einem am Semaphor wartenden Prozess, der damit wieder weiterlaufen kann.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Es existieren zwei Grundtypen von Semaphoren:
Die Unteilbarkeit der P- und V-Operationen muss durch ihre Implementierung sichergestellt werden. Mögliche Lösungen dafür sind:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Eine zweite Implementierungsfrage betrifft die Art des Wartens an der Semaphor-Warteschlange.
In der Regel heißt dies, dass der Prozess für die Dauer des Wartens blockiert wird, d.h. die CPU freigibt und in den Zustand »Wartend« wechselt (passives Warten). Dies erlaubt anderen Prozessen die Wartezeit zu nutzen.
Unter speziellen Bedingungen kann jedoch ein aktives Warten die bessere Lösung sein:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Für diese speziellen Situationen bieten manche Betriebssysteme einen speziellen Semaphortyp an, der als Spinlock bezeichnet wird (ein passender deutscher Begriff fehlt).
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Eine hervorragende Bedeutung fällt Semaphoren bei der Absicherung kritischer Bereiche zu, indem sie den wechselseitigen Ausschluss sicherstellen.
Kritischer Bereich bedeutet der Schutz von Daten und Wahrung der Konsistenz von Daten. Nicht der Programmcode muss geschützt werden, sonder die Daten die er verarbeitet.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Absicherung kritischer Bereiche mittels Semaphor (Beispiel)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Eine weiter Anwendung ist Kooperation ind Produzenten-Konsumenten Systemen mit einem Datenpuffer (Kapazität N Datensätze).
Es gibt zwei Situationen die mit Semaphoren abgesichert werden können:
Die Operationen (Write, Read) verändern dann die Semaphoren und können blockieren (; ist ein Zeitschritt):
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Synchronisierte Datenwarteschlange mit Semaphoren für Produzenten-Konsumenten Systeme
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Und es geht schief: Das Problem der fünf dinierenden Philosophen ist ein Beispiel für Deadlocks (Verklemmung) in verteilten und parallelen (asynchronen) Systemen mit Kommuniaktion!
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Bisher haben wir nur Kommunikationskanäle wie Sockets oder Pipes kennen gelernt. Mit denen kann unter bestimmten Bedingungen ein Semaphor implementiert werden.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
Protokoll: <ID>+
für V und <ID>-
für P Operation und ID als Prozessnummer 1,2,3,..,N
channel req,ack1,ack2,... ; waiters = [] ; counter = INITwhile (!terminate) { received=read(req) messages=split(received,2) // 1+2- => [1+,2-] for(message of messages) { switch (message[1]) { case '+': if (length(waiters)) { next=head(waiters); waiters=tail(waiters) write(ack[next],'!') } else { counter++; } write(ack[Number(message[0]),'!') ; break case '-': if (counter>0) { counter--; write(ack[Number(message[0]),'!') } else { push(waiters,Number(message[0])) } ; break } }}
Der Semaphor Master Prozess
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Mutualer Ausschluss und Semaphor
function P() { write(req,String(myid)+'-') reply=read(ack[myid])}function V() { write(req,String(myid)+'+') reply=read(ack[myid]) }
Der Semaphor Klienten Prozess
Stefan Bosse - Grundlagen der Betriebssysteme - Modul Y Kommunikation und Synchronisaztion von Prozessen :: Zusammenfassung