Version [22462]
Dies ist eine alte Version von BSys05Kommunikation erstellt von RonnyGertler am 2013-03-26 19:28:36.
Betriebssysteme (Betriebssystemtheorie) - Kapitel 5 - Kommunikation
Inhalte von Dr. E. Nadobnyh
Definition und Überblick
Eine Kommunikation ist ein expliziter Datenaustausch zwischen kooperierenden Prozessen.
Kommunikation und Synchronisation
Eine Synchronisation ist eine Koordination von Prozessen im zeitlichen Ablauf oder beim Ressourcen-Zugriff.
1) Bei der Kommunikation über gemeinsame Speicherobjekte (speicherbasierte Kommunikation) greifen Prozesse direkt auf
die Speicherobjekte (Speicher, Dateien) und deswegen brauchen Prozesse für die Synchronisation zusätzliche Mittel, z.B.
Semaphoren.
2) Beim Nachrichtenaustausch (nachrichtenbasierte Kommunikation) rufen Prozesse Systemfunktionen auf und werden vom Betriebssystem automatisch synchronisiert.
5.1. Shared Memory
Definition und Eigenschaften
Shared Memory ist ein Hauptspeicherbereich, der:
- mittels der Systemaufrufe eingerichtet wird,
- für mehrere Prozesse sichtbar ist.
Eigenschaften:
- Der eigentliche Datenaustausch kann ohne weitere Systemhilfe durchgeführt werden.
- Ein gegenseitiger Ausschluss ist nicht garantiert.
- Der gemeinsame Speicher wird als eine speicherbasierte Datei gestaltet.
Eine Speicherbasierte Datei (Pseudodatei, memory mapped file, MMF) ist eine Abbildung einer ganzen Datei oder ihren Teil im Hauptspeicher. Daher können Dateiinhalte durch den üblichen Zeiger effizient gelesen und gespeichert werden.
Typische Systemaufrufe
Schritte | Windows | Unix |
Öffnen und Schliessen |
CreateFileMapping(...); CloseHandle(...); |
shm_open(...); shm_unlink(...); |
Einblenden und Ausblenden |
... p =MapViewOfFile(...); //p-Pointer UnmapViewOfFile(...); |
... p =mmap(...); close(...); |
Speicher- Zugriff durch Zeiger | *p=...; | *p=...; |
Bemerkungen:
1) Beim Einblenden liefert das Betriebssystem dem Prozess die Startadresse des gemeinsamen Speichers.
2) Beim Ausblenden wird diese Startadresse ungültig gemacht.
⇒ Demo 1.
5.2. Nachrichtenaustausch
Definition
1) Beim Nachrichtenaustausch (Message Passing ) werden zwei Grundfunktionen (Systemaufrufe) vom System bereitgestellt:
send(empfänger, &nachricht);
receive(sender, &nachricht);
Bemerkung: & ist ein Adressoperator (C-Schreibweise).
2) Die gesendeten, aber noch nicht empfangenen Nachrichten (Botschaften) werden automatisch vom Betriebssystem im Nachrichtenpuffer zwischengespeichert.
3) Die empfangenen Nachrichten werden in den Empfänger-Speicherbereich gespeichert und aus dem Nachrichten-puffer entfernt.
Eigenschaften
1) Der Nachrichtenpuffer entkoppelt den Ablauf des Senders und des Empfängers und hilft, Geschwindigkeitsunterschiede auszugleichen. Mit dem Puffer arbeiten Sender und Empfänger asynchron.
2) Die beteiligten Prozesse werden synchronisiert:
- Ein Empfänger wird bei leerem Zwischenspeicher blockiert.
b )Ein Sender wird bei vollem Zwischenspeicher blockiert.
3) Nachrichtenaustausch ist gut geeignet für kleinere Datenmengen, weil die Verwendung von Systemfunktionen mit zeitlichem Aufwand verbunden ist. Ein Datenaustausch von großen Datenmengen kann über einen gemeinsamen Speicher effizienter umgesetzt werden.
Nachrichtenaustausch und Erzeuger-Verbraucher-Problem
Die Lösung des Problems durch Nachrichtenaustausch enthält keine zusätzlichen Synchronisationsmechanismen und sieht deswegen kompakt aus.
Message Queue und Pipe
Diese klassische Formen des Nachrichtenaustausches sind ähnlich:
1) Eine Message Queue (Nachrichtenschlange) ist eine geordnete Liste von Nachrichten.
Eigenschaften:
- Queues erlauben es einem Prozess, beliebige Nachrichten zu anderen Prozessen zu schicken.
- Die Nachrichten können in Queue nach Priorität sortiert werden.
2) Eine Pipe ist ein unidirektionaler Kanal zwischen zwei Prozessen.
Eigenschaften:
- Ein Prozess schreibt in den Kanal einen Strom von Bytes, den der andere Prozess lesen soll.
- Alle Bytes werden nach FIFO-Prinzip (First In First Out) gepuffert, d.h. die Reihenfolge von Bytes bleibt erhalten.
Der wichtige Unterschied zwischen Message Queue und Pipe ist der Umgang mit den Nachrichtengrenzen:
a) bei Queue sind die Nachrichtengrenzen klar definiert,
b) bei Pipe sind die Nachrichtengrenzen unsichtbar.
Eine Nachricht kann durch eine Pipe z.B. in zwei Teilen gesendet und in drei Teilen empfangen werden.
5.3. Pipes
Definition und Eigenschaften
Pipe (Pipeline) ist ein unidirektionaler Kanal zwischen zwei Prozessen.
1) Die Pipe ist die älteste Technik für Interprozesskommunikationen. Pipe stammt ursprünglich aus der Unix-Welt.
2) Bevor zwei Prozesse mittels einer Pipe kommunizieren können, müssen sie zuvor diesen Kanal einrichten.
3) Pipe hat ein FIFO-Puffer. Typische Länge des Puffers ist 5KB.
4) Die Pipe-Synchronisation wird vom Betriebssystem bereitgestellt.
Begriffsverwirrung: Pipeline ist mehrstufige Befehlsausführung in der CPU.
Implementierungen
1) Eine Pipe ist eine Pseudodatei. Nur im DOS war es tatsächlich eine temporäre Datei.
2) Lesen und Schreiben einer Pipe ist sehr ähnlich einer Datei.
3) Unix und Windows NT haben zwei Pipe-Varianten:
- Unnamed Pipes (Pipes, Anonyme Pipes) können nur zwei verwandte Prozesse verbinden.
- Named Pipes (Benannte Pipes) können mehrere eliebigen Prozesse verbinden. Benannte Pipes haben ehr Möglichkeiten als anonyme.
Eigenschaften im Vergleich
1) Anzahl der Modi.
Unix–Pipes arbeiten mit Byteströmen (byte streams). Windows-Pipes haben zwei Modi: Byte und Nachricht.
2) Netzwerkfähigkeit.
Unix-Pipes ermöglichen die rechnerlokale Prozess-Kommunikation.
Windows-Named-Pipes sind netzwerkfähig. Sie wurden ür homogene (nur unter Windows) Client-Server-Systeme entworfen.
3) Direktionalität.
Unix-Pipes sind unidirektional.
Windows-Named-Pipes können unidirektional und bidirektional verwendet werden. ´
Typische Systemaufrufe
Systemaufrufe | Windows | Unix |
Erzeugen | CreateNamedPipe(); | mkfifo(); |
Verbinden |
ConnectNamedPipe(); CreateFile(); |
open(); |
Nachrichtenaustausch |
WriteFile(); ReadFile(); |
write(); read(); |
Schliessen |
DisconnectNamedPipe(); CloseHandel(); |
unlink(); |
⇒ Demo 2
5.4. Sockets
Definition und Eigenschaften
Ein Socket ist ein Objekt, welches als Endpunkt für die bidirektionale Verbindung dient. Jeder Endpunkt verbindet ein Prozess mit dem Betriebssystem und dann mit dem Kommunikationssystem.
1) Sockets gehören zu der klassischen Form der rechnerübergreifenden Kommunikation. Sie wurden 1983 in Berkeley Universität entwickelt.
2) Sockets verbinden Prozesse auf entfernten oder derselben Maschine.
3) Sockets bilden eine plattformunabhängige, standardisierte Schnittstelle und sind heute auf allen wichtigen Betriebssystemen (auch Unix, Windows) vorhanden.
Analogie: Telefonsteckdose.
Logische Verbindung mit Sockets
Eine Verbindung zwischen zwei Sockets kann als zwei unidirektionale Pipes dargestellt werden. Die Nachrichten werden gleichzeitig in beiden Richtungen übertragen.
Legende: BS+KS – Betriebssystem und Kommunikationssystem
Client-Server-Betrieb
1) Definition
Client-Server-Betrieb ist eine Art des Nachrichtenaustausches:
- Ein Client (Auftraggeber) ist ein Prozess, der Dienstleistungen beantragt.
- Ein Server (Auftragsnehmer) ist ein Prozess, der Dienstleistungen erbringt.
2) Funktionsweise
- Ein Client sendet zum Server einen Auftrag (Anfrage, Request).
- Wenn der Server den Auftrag erledigt hat, liefert er die Antwort (Reply) an den Client zurück.
3) Eigenschaften
- Prinzipiell ist die Client-Server-Kommunikation asymmetrisch: Zuerst muss der Server und anschließend der Client gestartet werden.
- Ein Server kann gleichzeitig mit mehreren Clients kommunizieren.
- Beide können auf dem gleichen oder verschiedenen Rechner laufen.
Socket im Client-Server-Betrieb
1) Einstellung auf Verbindungen vom Server:
Der Server besitzt eine bekannte Socket-Adresse (Portnummer), z.B. 4711, auf einem bekannten Rechner.
2) Verbindung anlegen:
Server | Client |
sk2 = set.accept(); a)Auf Anfragen warten |
|
b)Socket erstellen |
sk1=new Socket(…, 4711); a)Anfrage an Server senden b)Socket erstellen |
Die Anfrage vom unbekannten Rechner wird vom Server akzeptiert, wenn die die richtige Server-Adresse und Portnummer hat.
4)Socket schließen: sk2.close(); und sk1.close();
⇒ Demo 3
CategoryBSys