Upload
rosalyn-conley
View
20
Download
5
Embed Size (px)
DESCRIPTION
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 ,. - PowerPoint PPT Presentation
Citation preview
bs-7.4 1
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 !
bs-7.4 2
7.4.1 Pipes
Zur Erinnerung (2.4): Pipe = Byte-Puffer fester Größe,
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.4 3
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-7.4 4
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
bs-7.4 5
Benutzung z.B. so:
>: mkfifo buffer
>: ls -lprw------- 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
bs-7.4 6
Beachte: mit benannten Pipes lassen sich nicht nur Pipelines,
sondern beliebige Datenflußgraphen aufsetzen !
1
3
2
6
5
4
>: 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
eg
bs-7.4 7
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 8
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 9
7.4.3 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 P Prozess Q
bs-7.4 10
7.4.3.1 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-7.4 11
Familie
Dienst PF_UNIX PF_INET PF_NS .......
SOCK_STREAM TCP SPP
SOCK_DGRAM UDP IDP
SOCK_RAW IP .......
Erzeugung eines – ungebundenen – Socket:
int socket(int family, int type, int protocol)
prozeßlokale Protokoll- Dienst ProtokollSocket-Nummer Familie (i.d.R. 0 [Null])(file descriptor!)
bs-7.4 12
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-7.4 13
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-7.4 14
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-7.4 15
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-7.4 16
Java
unterstützt das Arbeiten mit Sockets durch Bibliotheksklassen
Socket,
ServerSocket,
DatagramSocket, MulticastSocket,
.....
siehe java.net.*
bs-7.4 17
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 18
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)
1 Bitübertragung (physical !)
ISO OSI
Anwendungsprotokolle: TELNET, FTP, HTTP, . . .
TCP, UDP
IP
(Netztreiber)
Internet
Transportsystem
Anwendungssystem (Systemschnittstelle - Sockets)
bs-7.4 19
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 20
Beachte: Streams sind auch bei Pipes einsetzbar,
erlauben dynamisches Einfügenvon 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 ...
...