7 4 Kommunikation zwischen Benutzerprozessen IPK stellt andere
7. 4 Kommunikation zwischen Benutzerprozessen (IPK) stellt andere Anforderungen als auftragsorientierte Kommunikation in mikrokernbasierten Betriebssystemen, vor allem großzügige Pufferung, sowohl Auftragsbeziehungen als auch Nachrichten- oder Byte-Ströme, sowohl lokal als auch übers Netz bs-7. 4 Ein/Ausgabe ! 1
7. 4. 1 Pipes Zur Erinnerung (2. 4 ): Pipe = Byte-Puffer fester Größe, bs-7. 4 erzeugt mit pipe(channel), benutzt mit read(channel[0]) für das Empfangen von Bytes (kann blockieren), benutzt mit read(channel[1]) für das Senden von Bytes (kann blockieren!), eingesetzt für Byteströme zwischen „verwandten“ Prozessen. 2
read write Gepufferte Repräsentation: - typischerweise 0 – 4 KB, - entweder in anonymer Datei fester Größe, die durch pipe eingerichtet wird, - oder desgl. auf „RAM disk“ (da nicht notwendig persistent) - oder in speziellem Arbeitsspeicherbereich; - channel[0] und channel[1] verweisen auf zwei Iteratoren mir unabhängigen Lese- bzw. Schreibzeigern, die zyklisch durch den Puffer wandern. bs-7. 4 3
7. 4. 2 Benannte Pipes (named pipes, fifo special files, fifos) sind Zwitter zwischen Dateien und Pipes, erlauben IPK zwischen beliebigen Prozessen, typischerweise mit Pufferkapazität 0. Erzeugung: oder Befehl bs-7. 4 mknod(path, (mode&0777)|S_IFIFO, 0)* mkfifo(path, mode) mkfifo [–m mode] path 4
Benutzung z. B. so: >: mkfifo buffer >: ls -l prw------- 1 lohr institut 0 Jul 10 11: 08 buffer >: process input 1 >buffer & >: process input 2 >buffer & >: more buffer zeigt gemischte Ausgabe Kapazität 0: Sender wartet, bis Empfänger übernimmt Empfänger erhält EOF, wenn jeder Sender seinen Kanal geschlossen hat bs-7. 4 5
Beachte: mit benannten Pipes lassen sich nicht nur Pipelines, sondern beliebige Datenflußgraphen aufsetzen ! a c 2 4 f d 1 b 3 6 e 5 g >: mkfifo a b c d e f g >: 1 a b & 2 a c & 3 b d e & 4 c d f & 5 e g & 6 f g bs-7. 4 6
7. 4. 3 Message Queues (Unix) werden im Arbeitsspeicher gehalten, sind unabhängig von den Lebensdauern ihrer Benutzer, übertragen Einzelnachrichten, werden durch einen Schlüssel (Typ key_t) identifiziert. msqid = msgget(key, msgflag) erzeugt und/oder öffnet die M. Q. key mit Zugriffsrechten gemäß msgflag bs-7. 4 7
Senden und Empfangen: fd = msgsnd(msqid, &buffer, length, flag) buffer ist vom Typ struct msgbuf {long mtype; char mtext[1]; } msgrcv(msqid, &buffer, length, type, flag) bs-7. 4 8
7. 4. 3 Sockets („socket“ = Steckdose) dienen vorwiegend der Kommunikation im Netz (aber auch lokal einsetzbar, dann ähnlich wie Pipes) Socket = Duplex-Kanalanschluss (Senden und Empfangen) mit unterschiedlich wählbaren Semantiken Prozess P Socket 1 bs-7. 4 Prozess Q Socket 2 9
7. 4. 3. 1 Benutzung von Sockets 1. Erzeugung 2. Namensgebung 3. Binden an anderen Socket 4. Duplex-Kommunikation über den so entstandenen Kanal Alternative Semantiken: bs-7. 4 zuverlässiger Byte-Strom oder Einzelnachrichten ohne Reihenfolgegarantie, ohne Schutz gegen Verlust 10
Erzeugung eines – ungebundenen – Socket: int socket(int family, int type, int protocol) prozeßlokale Socket-Nummer (file descriptor!) Familie Dienst SOCK_STREAM SOCK_DGRAM SOCK_RAW Protokoll. Familie PF_UNIX Dienst PF_INET PF_NS TCP SPP UDP IP Protokoll (i. d. R. 0 [Null]) . . . bs-7. 4 11
Benennung eines Socket mit netzweit eindeutigem Namen, bestehend aus Internet-Adresse des Rechners (IP address) Port-Nummer (lokal) int bind(int socket, struct sockaddr *address, int addrlen) (Protokollfamilie, Port-Nummer , Internet-Adresse) bs-7. 4 12
SOCK_DGRAM für Internet: unzuverlässige Nachrichtenübertragung mit UDP int sendto(int socket, char *buffer, int length, int flags, struct sockaddr *to, int addrlen) Absender socket sendet an Adressat to int recvfrom(int socket, char *buffer, int length, int flags, struct sockaddr *from, int *addrlen) socket empfängt an ihn gesendete Nachricht sowie deren Absender Pufferung bs-7. 4 der Nachrichten teils beim Sender, hauptsächlich aber beim Empfänger 13
SOCK_STREAM für Internet: zuverlässiger Byte-Strom mit TCP Orientierung an Szenario Auftraggeber/Auftragnehmer : 1. Klient stellt Verbindung mit Server her; 2. sodann Nachrichtenaustausch mittels (Klient) (Server) write(s 1, request, length); read(s 3, request, length); . . . write(s 3, reply, length); read(s 1, reply, length); bs-7. 4 14
Herstellung der Verbindung: (Klient) s 1 = socket(. . . ); [ bind(s 1, . . ); ] (Server) s 2 = socket(. . . ); bind(s 2, &local, l); listen(s 2, qlength); connect(s 1, &dst, l); s 3 = accept(s 2, &src, &l); write(s 1, . . ); . . . close(s 1); read(s 3, . . ); . . . close(s 3); ( Statt write/read auch send/recv(. , . , flags) ! ) bs-7. 4 15
Java unterstützt das Arbeiten mit Sockets durch Bibliotheksklassen Socket, Server. Socket, Datagram. Socket, Multicast. Socket, . . . siehe java. net. * bs-7. 4 16
7. 4. 3. 2 Implementierung von Sockets Protokollfamilie PF_UNIX: wie Pipes Protokollfamilie PF_INET: Transportsystem des Internet, bestehend aus Treiber des Netzanschlusses (network interface) + Internet-Kommunikationsprotokolle: bs-7. 4 17
Protokollhierarchie: Software ist in Schichten strukturiert 7 Anwendung (application) 6 Darstellung (presentation) 5 Sitzung (session) 4 Transport (transport) 3 Vermittlung (network) 2 Sicherung (data link) Anwendungsprotokolle: TELNET, FTP, HTTP, . . . (Systemschnittstelle - Sockets) Anwendungssystem Transportsystem TCP, UDP IP (Netztreiber) 1 Bitübertragung (physical !) ISO OSI bs-7. 4 Internet 18
Protokollstapel (protocol stack) ist entweder fest eingebaut oder dynamisch modifizierbar durch Einziehen/Löschen von Schichten: Streams, bestehend aus einer Folge von Modulen, existieren zwischen Benutzerprozess und Netzanschluss stream head nimmt socket-bezogene Systemaufrufe entgegen bs-7. 4 19
Beachte: Streams sind auch bei Pipes einsetzbar, erlauben dynamisches Einfügen von Treibern ! Systemaufruf in Unix: wiederum ioctl(channel, command, arg) mit typischen command-Werten I_PUSH I_POP bs-7. 4 . . . Einfügen eines Moduls hinter dem stream head Entfernen. . . 20
- Slides: 20