200 likes | 360 Views
7.4 Kommunikation. 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 ,.
E N D
7.4 Kommunikation • 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 • Ein/Ausgabe !
7.4.1 Pipes Zur Erinnerung (2.4): Pipe = Byte-Puffer fester Größe, erzeugt mitpipe(channel), benutzt mitread(channel[0]) für das Empfangen von Bytes (kann blockieren), benutzt mitread(channel[1]) für das Senden von Bytes (kann blockieren!), eingesetzt für Byteströme zwischen „verwandten“ Prozessen.
read write • Gepufferte Repräsentation: • - typischerweise 0 – 4 KB, • - entweder in anonymer Datei fester Größe, die durchpipe • eingerichtet wird, • - oder desgl. auf „RAM disk“ (da nicht notwendig persistent) • - oder in speziellem Arbeitsspeicherbereich; • - channel[0] undchannel[1] verweisen auf zwei • Iteratoren mir unabhängigen Lese- bzw. Schreibzeigern, • die zyklisch durch den Puffer wandern.
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: mknod(path,(mode&0777)|S_IFIFO,0)* oder mkfifo(path,mode) oder Befehl mkfifo [–m mode] path
Benutzung z.B. so: >: mkfifo buffer >: ls -l prw------- 1 lohr institut 0 Jul 10 11:08 buffer >: process input1 >buffer & >: process input2 >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
Beachte: mit benannten Pipes lassen sich nicht nur Pipelines, sondern beliebige Datenflußgraphen aufsetzen ! c 2 4 f a 1 d 6 b g 3 5 e >: 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
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
Senden und Empfangen: • fd = msgsnd(msqid,&buffer,length,flag) • bufferist vom Typ • struct msgbuf {long mtype; • char mtext[1]; • } • msgrcv(msqid,&buffer,length,type,flag)
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 Prozess Q Socket 1 Socket 2
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: zuverlässiger Byte-Strom oder Einzelnachrichten ohne Reihenfolgegarantie, ohne Schutz gegen Verlust
Erzeugung eines – ungebundenen – Socket: int socket(int family, int type, int protocol) prozeßlokale Protokoll- Dienst Protokoll Socket-Nummer Familie (i.d.R. 0 [Null]) (file descriptor!)
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)
SOCK_DGRAMfü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 der Nachrichten teils beim Sender, hauptsächlich aber beim Empfänger
SOCK_STREAMfü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(s1,request,length); • read(s3,request,length); • ... • write(s3,reply,length); • read(s1,reply,length);
Herstellung der Verbindung: (Klient) (Server) s1 = socket(...); s2 = socket(...); [bind(s1,..); ]bind(s2,&local,l); listen(s2, qlength); connect(s1,&dst,l); s3 = accept(s2,&src,&l); write(s1,..); read(s3,..); ... ... close(s1); close(s3); ( Stattwrite/readauchsend/recv(.,.,.,flags) ! )
Java unterstützt das Arbeiten mit Sockets durch Bibliotheksklassen Socket, ServerSocket, DatagramSocket, MulticastSocket, ..... siehejava.net.*
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:
Protokollhierarchie: Software ist in Schichten strukturiert • Anwendung (application) • Darstellung (presentation) • Sitzung (session) • Transport (transport) • Vermittlung (network) • Sicherung (data link) • Bitübertragung (physical !) • ISO OSI Anwendungsprotokolle: TELNET, FTP, HTTP, . . . TCP, UDP IP (Netztreiber) Internet (Systemschnittstelle - Sockets) Anwendungssystem Transportsystem
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
Beachte: Streams sind auch bei Pipes einsetzbar, erlauben dynamisches Einfügen von Treibern ! • Systemaufruf in Unix: wiederum • ioctl(channel,command,arg) • mit typischencommand-Werten • I_PUSH Einfügen eines Moduls • hinter dem stream head • I_POP Entfernen ... • ...