bs 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 !
bs Pipes Zur Erinnerung (2.4 ): Pipe = Byte-Puffer fester Größe,2.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.
bs-7.43 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. read write
bs 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
bs-7.45 Benutzung z.B. so: >: mkfifo buffer >: ls -l prw 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
bs-7.46 Beachte: mit benannten Pipes lassen sich nicht nur Pipelines, sondern beliebige Datenflußgraphen aufsetzen ! >: 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 a d c b f e g
bs 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.48 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 Sockets 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 (socket = Steckdose) Socket 1 Socket 2 Prozess PProzess Q
bs Benutzung von Sockets Alternative Semantiken: zuverlässiger Byte-Strom oder Einzelnachrichten ohne Reihenfolgegarantie, ohne Schutz gegen Verlust 1. Erzeugung 2. Namensgebung 3. Binden an anderen Socket 4. Duplex-Kommunikation über den so entstandenen Kanal
bs Familie Dienst PF_UNIX PF_INET PF_NS SOCK_STREAM TCPSPP SOCK_DGRAM UDP IDP SOCK_RAW IP Erzeugung eines – ungebundenen – Socket: int socket(int family, int type, int protocol) prozeßlokaleProtokoll- Dienst Protokoll Socket-NummerFamilie (i.d.R. 0 [Null]) (file descriptor!)
bs int bind(int socket, struct sockaddr *address, int addrlen) (Protokollfamilie, Port-Nummer, Internet-Adresse) Benennung eines Socket mit netzweit eindeutigem Namen, bestehend aus Internet-Adresse des Rechners (IP address) Port-Nummer (lokal)
bs 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 der Nachrichten teils beim Sender, hauptsächlich aber beim Empfänger
bs 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(s1,request,length); read(s3,request,length);... write(s3,reply,length); read(s1,reply,length);
bs 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); ( Statt write/read auch send/recv(.,.,.,flags) ! )
bs Java unterstützt das Arbeiten mit Sockets durch Bibliotheksklassen Socket, ServerSocket, DatagramSocket, MulticastSocket,..... siehe java.net.*
bs Implementierung von Sockets Protokollfamilie PF_UNIX :wie Pipes Protokollfamilie PF_INET : Transportsystem des Internet, bestehend aus Treiber des Netzanschlusses (network interface) + Internet-Kommunikationsprotokolle:
bs Protokollhierarchie: Software ist in Schichten strukturiert 7Anwendung (application) 6Darstellung (presentation) 5Sitzung (session) 4Transport (transport) 3Vermittlung (network) 2Sicherung (data link) 1Bitübertragung (physical !) ISO OSI Anwendungsprotokolle: TELNET, FTP, HTTP,... TCP, UDP IP (Netztreiber) Internet Transportsystem Anwendungssystem (Systemschnittstelle - Sockets)
bs 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 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 Einfügen eines Moduls hinter dem stream head I_POP Entfernen......