Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Kapitel 4 Prozessinteraktion 4-1 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.1 Einleitung Arten der Interaktion Prozesse als Teile komplexer Programmsysteme mŸssen Daten austauschen sich aufrufen (bzw. beauftragen) aufeinander warten sich auslšsen sich abstimmen .... sie mŸssen interagieren. Prozesse Kernschnittstelle Proze§verwaltung Interaktion BS-Kern Operationen zur Prozessinteraktion bilden (neben der Prozessverwaltung) den zweiten wesentlichen Aufgabenbereich eines Betriebssystemkerns. 4-2 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Begriffsabgrenzung Prozessinteraktion besitzt einen funktionalen und einen zeitlichen Aspekt: Wir unterscheiden: Zeitlicher Aspekt: Ablaufabstimmung (Koordination, Synchronisation) Funktionaler Aspekt: Informationsaustausch Zwei Formen des Informationsaustauschs: Kommunikation Kooperation (expliziter Datentransport) (Zugriff auf gem. Daten) P1 P1 P2 P2 gemeinsamer Teil D1 Kopieren D2 D1 (gerichtete Beziehung) D2 (symmetrische Beziehung) 4-3 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Abbildbarkeit Die beiden Formen des Informationsaustauschs sind als Konzepte zu verstehen und sagen noch nichts Ÿber die Implementierung aus. Insbesondere kann Kommunikation auf Kooperation abgebildet werden und umgekehrt. Prozess 2 Prozess 1 Prozess 2 Prozess 1 Kooperation Kommunikation Modellebene Kommunikation Modellebene Realisierungsebene Kooperation realisiert durch Kommunikation Kooperation Realisierungsebene Kommunikation realisiert durch Kooperation 4-4 Koordination (zeitliche Abstimmung) Prozeß P1 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Prozeß P2 Warten (wait) A P2 wartet auf Signal von P1 Signalisieren (signal) B Programmabschnitt A in Prozess P1 soll vor Programmabschnitt B in Prozess P2 ausgefŸhrt werden. In der Operationen Warten wird P2 ggf. solange aufgehalten, bis P1 die Operationen Signalisieren aufgerufen hat. 4-5 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Interaktionsobjekte Interaktionen (Koordination, Kooperation, Kommunikation) manifestieren sich in eigenstŠndigen Objekten Prozeß Prozeß Interaktionsobjekt Diese Interaktionsobjekte tragen einen Namen bestehen aus - Interaktionsoperationen - Interaktionsdaten Operationen Daten 4-6 Interaktion im tŠglichen Leben - Brief Telegramm Fax Paket Container Telefon E-mail Radio Schwarzes Brett Rauchzeichen Flaggenzeichen Morsezeichen Ampelsignale Kurier Gestik Mimik .... und vieles mehr 4-7 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Beziehungen An einer Interaktion kšnnen mehr als zwei Prozesse beteiligt sein 1:1- Interaktion m:n - Interaktion Ein Prozess kann an mehreren Interaktionen beteiligt sein 1 Interaktionsobjekt mehrere Interaktionsobjekte 4-8 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Zuordnung Das Interaktionsobjekt kann z beim Quellprozess (Sender) z beim Zielprozess (EmpfŠnger) z zwischen den Prozessen realisiert sein 4-9 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Zusammenhang Von den drei Grundformen der Interaktion ist die Koordination die elementarste, denn sowohl Kommunikation als auch Kooperation benštigen eine zeitliche Abstimmung zwischen den Interaktionspartnern Kommunikation Kommunikation Kooperation Kooperation Koordination Koordination Wir werden daher zunŠchst die Koordination behandeln 4-10 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.2 Koordination Vorbemerkung: z KoordinationsvorgŠnge kennen wir bereits aus der Diskussion des Kernausschlusses. z Wir mŸssen uns also nicht mehr darum kŸmmern, wie Interaktionsoperationen auf gemeinsame Daten zugreifen, da sie als Kernoperationen unter gegenseitigem Ausschluss stehen. z Im folgenden geht es um KoordinationsvorgŠnge au§erhalb des Kerns, fŸr die wir auf unteilbare Kernoperationen zurŸckgreifen kšnnen. 4-11 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.2.1 Signalisierung Bei der Signalisierung soll eine Reihenfolgebeziehung hergestellt werden. Ein Abschnitt A in einem Prozess P1 soll vor einem Abschnitt B einem Prozess P2 ausgefŸhrt werden. Dazu bietet der Kern die Operationen signal und wait an, die eine gemeinsame binŠre Variable s benutzen P1 P2 A signal(s) wait(s) B 4-12 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Signalisierung: Beispiel Aktivität 1 Aktivität 2 Voraussetzung erfüllt? A Evtl. verzögern Erfüllt ! B Beispiel: Steuerung eines technischen Prozesses: A: EinfŸllen von FlŸssigkeit in einen BehŠlter (Ventil offen) B: Heizen (Spannung an Heizspirale) 4-13 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Grundform der Signalisierung In ihrer einfachsten Form kšnnen die Operationen folgenderma§en realisiert werden signal(s) wait(s) set s no s set ? reset s Dies bedeutet ein aktives Warten an der Signalisierungsvariablen s. Ist die Wartezeit zu lange, so sollte der Prozessor freigegeben werden: (Signalisieren mit Wartezustand) signal(s) wait(s) s set ? yes set s process waiting ? no block deblock process reset(s) 4-14 Beipiel fŸr Signalisierungsobjekt kernel module signalization; export SIGNAL, WAIT; import DEBLOCK, BLOCK; var signal_object = record S: signal = reset; // WP: process = empty end; procedure SIGNAL(SO: signal_object); begin SO.S := set; if SO.WP /= empty then // DEBLOCK(SO.WP) // end; procedure WAIT(SO: signal_object); begin if SO.S = reset then BLOCK(SO.WP); // SO.S := reset end; end signalization. 4-15 initialization a process is waiting deblock it wait for signal Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Beipielimplementierung Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module synchronization; export SYNC; import DEBLOCK, BLOCK; var signal_object = record S: signal = reset; // initialization WP: process = empty end; procedure SYNC(SO: signal_object); begin if SO.S = reset // I am first and then begin SO.S := set; // indicate my arrival and BLOCK(SO.WP); // wait for my partner end; else begin // I am second and DEBLOCK(SO.WP);// deblock my waiting partner SO.S:= reset // and reset the signal for reuse end end; end synchronization. 4-16 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Wechselseitige Synchronisierung Ein symmetrischer Einsatz der Operationen bewirkt, dass sowohl A1 als auch A2 ausgefŸhrt sind, bevor B1 oder B2 ausgefŸhrt werden. P1 P2 A1 signal(s1) wait(s2) A2 signal(s2) wait(s1) B1 B2 Die Prozesse P1 und P2 synchronisieren sich an dieser Stelle. Wir kšnnen das Operationspaar als eine Operation sync zusammenfassen: P1 P2 A1 A2 sync(s) sync(s) B1 B2 Da P1 und P2 an dieser Stelle aufeinander warten, spricht man auch von einem Rendezvous 4-17 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Gruppensignalisierung An einer Signalisierung kšnnen mehr als zwei Prozesse beteiligt sein: UND-Signalisieren: Ein Prozess soll erst weiterlaufen, wenn mehrere Prozesse ein Signal gesetzt haben (UND-VerknŸpfung auf Signalisierungsseite) s w s s UND-Warten: Mehrere Prozesse warten auf ein Signal von einem Prozesse (UND-VerknŸpfung auf Warteseite) w w s w 4-18 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn UND-Signalisierung Die UND-VerknŸpfung kann auch auf beiden Seiten erfolgen: Alle Prozesse auf der rechten Seite kšnnen erst weiterlaufen, wenn alle Prozesse auf der linken Seite ihr Signal abgelegt haben s w w s s w Es gibt also insgesamt die folgenden vier Varianten ¥ Einzel-Einzel-Signalisierung ¥ UND-Einzel-Signalisierung ¥ Einzel-UND-Signalisierung ¥ UND-UND-Signalisierung 4-19 Beispielimplementierung Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module AND:AND-signalization; export SIGNAL, WAIT; import DEBLOCK, BLOCK; var signal_object = record S: array [1..ks] of signal = all reset; WP: array [1..kw] of process = all empty end; procedure AND_SIGNAL(SO: signal_object, q index); begin SO.S[q] := set; if ∀i: SO.S[i]=set & ∀j: SO.WP[j] /= empty then begin ∀i: SO.S[i]= reset; ∀j: DEBLOCK(SO.WP[j]) end end; procedure AND_WAIT(SO: signal_object; p index); begin if ∃i SO.S[i] = reset ∨ ∃j/=p: SO.WP[j] = empty then BLOCK(SO.WP[p]); else begin ∀i: SO.S[i]= reset; ∀j/=p: DEBLOCK(SO.WP[j]) end; end; end signalization. 4-20 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Signalisierung mit StaurŠumen Die Beziehungen zwischen den Prozessen kšnnen noch vielfŠltiger sein: n:1 Mehrere Prozesse kšnnen Signale an einem Signalobjekt ablegen. Ein wartender Prozess kann deblockiert werden,wenn wenigstens ein Signal vorliegt. s w s s 1:m von irgendeinem Mehrere Prozesse kšnnen an einem Signalobjekt warten. Wenn ein Signal eintrifft, wird einer (z.B. der erste) deblockiert. w s w an irgendeinen w Beide FŠlle kombiniert ergeben beliebige n:m-Beziehungen 4-21 Signalisierung mit StaurŠumen (2) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Da jetzt hintereinander z mehrere Signale bzw. z mehrere wartende Prozesse anstehen kšnnen, mŸssen wir dafŸr in der Datenstruktur fŸr das Signalobjekt entsprechende KapazitŠt vorsehen: KapazitŠt z genau 1 (wie bisher) z eine Konstante c (KapazitŠt kann bei Objekterzeugung fest vorgesehen werden) z unbegrenzt (KapazitŠt muss u.U. zur Laufzeit beschafft werden) 4-22 Beispielimplementierung Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module m:n-signalization; export SIGNAL, WAIT; import DEBLOCK, BLOCK; var signal_object = record S: integer = 0; // initialization WP: queue of process = empty end; procedure SIGNAL(SO: signal_object); begin SO.S := SO.S+1; if SO.WP /= empty then // a process is waiting DEBLOCK(SO.WP) // deblock first of queue end; procedure WAIT(SO: signal_object); begin if SO.S <= 0 then BLOCK(SO.WP); // enqueue process SO.S := SO.S-1; end; end m:n-signalization. 4-23 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Achtung: Auseinanderhalten: Nicht verwechseln ! 2:3-Einzel:Einzel-Signalisierung s w w s w 1:1-UND2:UND3-Signalisierung s w w s w 4-24 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Wechselseitige Synchronisierung fŸr Gruppen P1 P1 P4 P1 sync(s) sync(s) sync(s) sync(s) Alle Prozesse synchronisieren sich an einer Stelle Die Prozesse dŸrfen erst weiterlaufen, wenn alle anderen Prozesse die Synchronisationsstelle erreicht haben (Synchronisationsbarriere, Barrierensynchronisation, Gruppenrendezvous) 4-25 Beispielimplementierung Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module barrier-synchronization; export BARRIER_SYNC; import DEBLOCK, BLOCK; var signal_object = record NUMBER: integer = m; // number of processes COUNT: integer = 0; WP: queue of process = empty end; procedure BARRIER_SYNC(SO: signal_object); begin SO.COUNT = SO.COUNT + 1 if SO.COUNT < SO.NUMBER then BLOCK(SO.WP); // wait for partner processes else begin while SO.WP /= empty do DEBLOCK(SO.WP); SO.COUNT = 0 end; end; end barrier-synchronization. 4-26 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.2.2 Sperren Wir betrachten den folgenden Einsatz von Signalisierungsoperationen P1 P2 s = set wait(s) wait(s) A B signal(s) signal(s) A und B kšnnen nicht nebenlŠufig ausgefŸhrt werden: Entweder A vor B oder B vor A, d.h. es findet keine †berlappung in der AusfŸhrung von A und B statt. Die AusfŸhrungen von A und B schlie§en sich gegenseitig aus. Die Signalisierungsoperationen kšnnen also auch dazu verwendet werden, um kritische Abschnitte (critical section) zu sichern. 4-27 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Sperren z ZweckmŠ§igerweise geben wir ihnen dann auch die entsprechenden Namen: Sperren (lock) und Entsperren (unlock) Initialisierung: s = reset lock(s) unlock(s) s set ? no reset s block process waiting ? no set s deblock process z Von der Struktur entspricht das lock dem wait und das unlock dem signal. Anmerkung: z Im Unterschied zur Formulierung des signal weiter oben wird hier jedoch die Variable s in einer Schleife abgefragt, um den Fall zu berŸcksichtigen, dass zwischen dem Deblockieren des auf die Sperre wartenden Prozesses und dem Setzen der Sperre ein weiterer Prozess die Sperre setzen kšnnte. 4-28 Implementierungsbeispiel Sperre kernel module locking; export LOCK, UNLOCK; import DEBLOCK, BLOCK; var lock_object = record L: lock_variable = reset; // WP: queue of process = empty end; procedure LOCK(LO: lock_object); begin while LO.L = set do BLOCK(LO.WP); // LO.L := set; end; procedure UNLOCK(LO: lock_object); begin LO.L := reset; if LO.WP = non_empty then // DEBLOCK(LO.WP) // end; end locking. 4-29 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn initialization enqueue process a process is waiting deblock first of queue Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.3 Kanalkonzept 4.3.1 Grundlagen z Ein Kanal ist ein Datenobjekt, das die Operationen Senden (send) und Empfangen (receive) zur VerfŸgung stellt. Parameter: z Name des Kanal(objekt)s (CO) z Adresse eines BehŠlters Sender: EmpfŠnger: Adresse der zu verschickenden Nachricht (DatenbehŠlter sendeseitig, buffer send (Bs). Statt der Adresse kann hier auch die Nachricht selbst stehen) Adresse, wohin die empfangene Nachricht geschrieben werden soll (DatenbehŠlter empfŠngerseitig, buffer receive (Br)) P2 P1 RECEIVE(CO,Dr) SEND(CO,Ds) CO Operationen Daten 4-30 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn ZeitverhŠltnisse z Da Sender und EmpfŠnger ihre Operationen zu beliebigen Zeitpunkten aufrufen kšnnen, sind zwei FŠlle zu berŸcksichtigen: 1. Erst Senden, dann Empfangen 2. Erst Empfangen, dann Senden z Wenn die aufrufenden Prozesse in den Operationen nicht aufgehalten (blockiert) werden sollen, besteht die Notwendigkeit der Zwischenspeicherung im Kanal z Sender zuerst: z Die Nachricht bzw. ihre Adresse wird im Kanal abgelegt und kann bei einem nachfolgenden Empfangen abgeholt werden EmpfŠnger zuerst: Die Adresse des Zielpuffers wird abgelegt, so dass bei einem nachfolgenden Empfangen die Nachricht dorthin kopiert werden kann z Der Kanal muss entsprechende Variable zur Aufnahme dieser Daten vorsehen 4-31 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn ZeitverhŠltnisse (2) Sender zuerst: P1 Erster P2 RECEIVE(CO,Br) SEND(CO,Bs) CO Bs Nachricht oder Adresse Quellbehälter Ds Dr EmpfŠnger zuerst: P1 P2 SEND(CO,Bs) RECEIVE(CO,Br) CO Br Ds 4-32 Dr Adresse Zielbehälter Erster Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn NachrichtenŸbergabe WertŸbergabe: Die Nachricht selbst wird im Kanal abgelegt (Zwei KopiervorgŠnge) Sender Empfänger Kanal ReferenzŸbergabe: Die Adresse der Nachricht wird im Kanal abgelegt (Ein Kopiervorgang) Sender Empfänger Kanal BehŠlterŸbergabe: Die Teile des Sender-Adressraums, die die Nachricht enthalten, werden in den Adressraum des EmpfŠngers eingeblendet (Kein Kopieren erforderlich) Sender Empfänger Kanal 4-33 Grundform der Kanalkommunikation (ReferenzŸbergabe) SEND(CO,MSG) RECEIVE(CO,BR) deposit message MSG at channel N address of target buffer BR available? copy message to target buffer delete message and target buffer address deposit address of target buffer BR at channel N message MSG available ? copy message to target buffer delete message and target buffer address R R 4-34 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Beispielimplementierung Kanalgrundform kernel module Communication; { by reference } export SEND, RECEIVE; var channel_object = record DS: address = empty; DR: address = empty end; procedure SEND(CO: channel_object; BS: address); begin CO.DS := BS; if CO.DR = nonempty then begin CO.DR^ := CO.DS^; // message transport CO.DS := empty; CO.DR := empty end end; procedure RECEIVE(CO: channel_object; BR: address); begin CO.DR := BR; if CO.DS = nonempty then begin CO.DR^ := CO.DS^; // message transport } CO.DS := empty; CO.DR := empty end end; 4-35 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.3.2 Koordinierte Kommunikation z z z Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Bisher hatten wir keinerlei zeitliche Abstimmung zwischen Sender und EmpfŠnger gefordert. y Beide rufen ihre jeweilige Operation auf, legen ggf. Daten im Kanal ab, verlassen die Prozedur und arbeiten weiter, ohne auf den Kommunikationspartner zu warten. y Man nennt dieses Vorgehen asynchron (asynchrones Senden, asynchrones Empfangen) HŠufig ist jedoch z.B. der EmpfŠnger dringend auf den Empfang der Nachricht angewiesen, d.h. er kann erst weiterarbeiten, wenn die Nachricht eingetroffen ist. y Er wird also in der Empfangsoperation so lange aufgehalten (blockiert). y Auf diese Weise synchronisiert er sich mit dem Sender (d.h. wartet auf ihn). y Man spricht dann von einem synchronen Empfangen. y Analog dazu ist auch ein synchrones Senden mšglich, bei dem der Sender solange blockiert wird, bis die dazugehšrige Empfangsoperation aufgerufen wird. Durch Kombination ergeben sich vier Varianten 4-36 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Varianten der Koordination Ps Pr SEND RECEIVE Ps Pr SEND RECEIVE WAIT SIGNAL asynchrones Senden A:A asynchrones Empfangen asynchrones Senden A:S synchrones Empfangen Ps Pr Ps Pr SEND RECEIVE WAIT SIGNAL SEND SIGNAL WAIT RECEIVE SIGNAL WAIT synchrones Senden S:A S:S synchrones Senden ãRendezvousÒ asynchrones Empfangen 4-37 synchrones Empfangen Beispielimplementierung A:S-Kanal kernel module Communication; export SEND_A, RECEIVE_S; var channel_object = Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn // A:S-Channel, by value record DS: message = empty; DR: address = empty; WPR: process = empty end; procedure SEND_A(CO: channel_object; BS: message); begin CO.DS := BS; if CO.DR /= empty then begin CO.DR^ := CO.DS; // message transport CO.DS := empty; CO.DR := empty; DEBLOCK(CO.WPR); end end; procedure RECEIVE_S(CO: channel_object; BR: address); begin CO.DR := BR; if CO.DS = empty then BLOCK(CO.WPR) else begin CO.DR^ := CO.DS; // message transport CO.DS := empty; CO.DR := empty end end; 4-38 Versuchendes Empfangen (Polling, Probing) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Gelegentlich mšchte man nur prŸfen, ob eine Nachricht vorliegt. Wenn ja, wird sie entgegengenommen (kopiert), wenn nein, geschieht nichts. kernel module communication; // A:V-channel, trying receive export SEND_A, RECEIVE_T; var channel_object = record DS: message = empty; end; procedure SEND_A(CO: channel_object; BS: message); begin CO.DS := BS; end; procedure RECEIVE_T(CO: channel_object; BR: address); begin if CO.DS /= empty then begin BR^ := CO.DS; // message transport CO.DS := leer; end end; 4-39 Umlenkendes Empfangen Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Idee: z Nach erfolgreicher NachrichtenŸbermittlung wird der Kommunikationspartner unterbrochen und auf ein spezielles ProgrammstŸck umgelenkt. DurchfŸhrung: z Der zuerst kommende Prozess legt neben der BehŠlteradresse eine Umlenkadresse ab. z Bei Eintreffen des Partners wird die Nachricht kopiert und der Prozess auf die angegebene Adresse umgelenkt (€nlich den sogenannten Òactive messagesÓ) 4-40 Beispielimplementierung (Unterbr. Empf.) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module Communication; // A:I-channel, interrupting receive export SEND_A, RECEIVE_I; import INTERRUPT; var channelobject = record DS: message = empty; DR: address = empty; IPR: record P: process = empty; A: address = empty end // target instruction end; procedure SEND_A(CO: channel_object; BS: message); begin CO.DS := BS; if CO.DR /= empty then begin CO.DR^ := CO.DS; //message transport CO.DS := empty; CO.DR := empty; INTERRUPT(CO.IPR.P, CO.IPR.A) // SW-interrupt causes IPR.P to jump to IPR.A end end; procedure RECEIVE_I(CO:channel_object; BR:address; LI:address); begin CO.DR := BR; CO.IPR.P := my_PID; CO.IPR.A := LI; // deposit target address if CO.DS /= empty then begin CO.DR^ := CO.DS; //message transport CO.DS := empty; CO.DR := empty INTERRUPT(my_PID, LI) // SW-interrupt causes jump to address CO.IPR.A end end; end Communication. 4-41 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.3.3 KapazitŠt z Bisher kann ein Kanal genau eine Nachricht bzw. einen ÒEmpfangswunschÓ speichern. z WŸnschenswert: Beispiel: FŠhigkeit, mehrere Nachrichten zu ÒpuffernÓ Mehrere Prozesse senden an einen zentralen ÒServer-ProzessÓ P P S n:1-Kanal P E S S z.B. zentraler Server 4-42 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Empfangsseitige KapazitŠt WŸnschenswert: FŠhigkeit, mehrere EmpfangswŸnsche zu ÒpuffernÓ Beispiel: Server besteht aus mehreren replizierten Prozessen, die Ÿber einen gemeinsamen Kanal adressiert werden. P 1:n-Kanal E E E S z.B. replizierter Server 4-43 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Datenstrukturen z z Zu diesem Zweck mŸssen die Datenstrukturen entsprechend erweitert werden. Im Falle eines n:n/S:S-Kanals (beliebig viele Sender, beliebig viele EmpfŠnger, synchrones Senden und Empfangen) bedeutet dies beispielsweise y y y y z Warteschlange fŸr wartende Senderprozesse Warteschlange fŸr gespeicherte Nachrichten Warteschlange fŸr wartende EmpfŠngerprozesse Warteschlange fŸr gespeicherte BehŠlteradressen Die Frage nach der KanalkapazitŠt beeinflusst die Effizienz und Semantik der Operationen: y y y unbegrenzt KapazitŠt: erfordert dynamische Speicherverwaltung innerhalb der Kommunikationsop.: Speicherplatz muss angefordert und freigegeben werden y y begrenzte KapazitŠt: erfordert Mechanismen bei Ò†berlaufÓ y Mšglichkeiten: x †berschreiben x Abweisung der Operation x Blockierung des Aufrufers, bis KapazitŠt frei wird 4-44 Beispielimplementierung kernel module communication; // n:n/A:S-Channel export SEND_A, RECEIVE_S; import ALLOCATE, RELEASE, INSERT, REMOVE, BLOCK, DEBLOCK; var channelobject = record QDS: queue of message = empty; QPR: queue of process = empty; QDR: queue of address = empty end; var POOL: set of buffer; procedure SEND_A(CO: channelobject; BS: message); var N: message; begin ALLOCATE(POOL,N); N := BS; INSERT(CO.QDS,N); if CO.QPR /= empty then DEBLOCK(CO.QPR) end; procedure RECEIVE_S(CO: channelobject; BR: address); var N: message; A: address; begin INSERT(CO.QDR,BR); while CO.QDS = empty do BLOCK(CO.QPR); REMOVE(CO.QDS,N); REMOVE(CO.QDR,A); A^ := N; RELEASE(POOL,N) end; end n:n/A:S-Channel. 4-45 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.3.4 Physische Zuordnung Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn z Ein Kanal ist zunŠchst ein eigenstŠndiges Kommunikationsobjekt, das unabhŠngig von irgendwelchen Sendern und EmpfŠngern existieren kann. z Es ist jedoch gelegentlich sinnvoll, ein Kommunikationsobjekt fest einem Prozess zuzuordnen. z Dies kann sendeseitig oder empfangsseitig erfolgen: y Besitzt ein Prozess einen Kanal, in dem er alle seine ausgehenden Nachrichten ablegt, so spricht man von einem Ausgangstor. y Besitzt ein Prozess einen Kanal, in dem alle seine eingehenden Nachrichten ablegt werden, so spricht man von einem Eingangstor (port). z Ports sind die in modernen Betriebssystemen am meisten verbreiteten Kommunikationsobjekte. z Eingangstore sind n:1-KanŠle, Ausgangstore 1:n-KanŠle. 4-46 Bindung von Kommunikationsobjekten an Prozesse Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Keine Bindung „Kanal“ Prozeß Bindung an Sender n:n Prozeß „Ausgangstor“ Prozeß Prozeß 1:n Bindung an EmpfŠnger „Eingangstor“, port Prozeß n:1 Prozeß 4-47 4.3.5 Gruppenkommunikation z z z z z Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Obwohl sendeseitig und empfangsseitig mehrere Prozesse beteiligt sein konnten, handelte es sich um Einzelkommunikationen in dem Sinn, dass jeweils ein Sender eine Nachricht an einen EmpfŠnger schickte. Es gibt jedoch hŠufig Situationen, in denen ein Prozess identische Nachrichten an viele (multicast) oder alle Prozesse (broadcast) schicken mšchte. Symmetrisch dazu gibt es FŠlle, in denen viele Prozesse an einen EmpfŠnger (Teil)nachrichten senden, die als Zusammenfassung die eigentliche Nachricht bilden (combine). Man spricht dann von Gruppenkommunikation (im Gegensatz zur Einzelkommunikation) Dadaurch ergeben sich folgende Varianten y Einzel-Einzel-Kanal y Einzel-Gruppen-Kanal (broadcast, multicast, Òone-to-many-communicationÓ) y Gruppen-Einzel-Kanal (combine, Òmany-to-one-communicationÓ) y Gruppen-Gruppen-Kanal (all-to-all-broadcast, Òmany-to-many-communicationÓ (wie bisher, Òone-to-one-communicationÓ) 4-48 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Gruppenkommunikation (schematisch) z Empfangsseitige Gruppe: Nachricht geht an mehrere E S Vervielfältigung E : E z Sendeseitige Gruppe: Mehrere Nachrichten werden kombiniert S Zusammenfassung S E : S 4-49 Gruppenkommunikation (schematisch) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn WŠhrend die VervielfŠltigung semantisch eindeutig ist (es werden Kopien der Nachricht versendet), muss die Art der Kombination festgelegt werden (Operationsparameter). TatsŠchlich gibt es die verschiedensten Variationen (Beispiele): z Konkatenation: „a“ „a5k“ „5“ concat „k“ z z Logische VerknŸpfung: Arithmetische VerknŸpfung: „true “ „true“ e“ „fals & „false“ Σ „12“ „5“ „3“ „4“ 4-50 Beispielimplementierung (mit EmpfŠnger-Rendezvous) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module group_communication // 1:1/G:G/A:S-channel; export G_SEND_A, G_RECEIVE_S; import BLOCK, DEBLOCK; var channel_object = record QDS: array[1..ks] of message = all empty; QDR: array[1..kr] of address = all empty; QPR: array[1..kr] of process = all empty end; procedure G_SEND_A(CO: channel_object; ps: index; BS: message); begin CO.QDS[ps] := BS; if ∀i: CO.QDS[i] /= empty ∧ ∀j: CO.QPR[j] /= empty then begin ∀j: CO.QDR[j] := CO.QDS[]; ∀j: CO.QDR[j] := empty; ∀i: CO.QDS[i] := empty; ∀j: DEBLOCK(CO.QPR[j]) end end; procedure G_RECEIVE_S(CO: channel_object; pr: index; BR: address); begin CO.QDR[pr] := BR; if ∃i:CO.QDS[i]=empty v ∃j/=pr:CO.QPR[j]=empty then BLOCK(CO.QPR[pr]) else begin ∀j: CO.QDR[j] := CO.QDS[]; ∀j: CO.QDR[j] := empty; ∀i: CO.QDS[i] := empty; ∀j/=pr: DEBLOCK(CO.QPR[j]) end end; end 1:1/G:G/A:S-channel 4-51 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.4 Kooperation Kooperation tritt auf, wenn mehrere Prozesse auf dieselben Daten zugreifen. Um Fehler und Inkonsistenzen zu vermeiden, mŸssen die Zugriffe koordiniert sein. Beispiel: Listenoperation ÒEinfŸgenÓ, aufgelšst in Einzelschritte (a) (b) (c) (d) (e) In den Situationen c) und d) ist die Listenstruktur inkonsistent. Ein parallel zugreifender Prozess sŠhe eine fehlerhafte Datenstruktur. 4-52 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Sperren z z z Kooperation von Prozessen auf gemeinsamen Daten fŠllt offensichtlich mit dem Problem des kritischen Abschnitts bzw. des gegenseitigen Ausschlusses zusammen, das uns ja schon bei der Kernsperre begegnet ist. Dabei ist ein kritischer Abschnitt eine Operationsfolge, bei der ein nebenlŠufiger Zugriff oder eine verzahnte AusfŸhrung zu Fehlern fŸhren kann. Zur Sicherung kritischer Abschnitte kšnnen wir die weiter oben eingefŸhrten Sperroperationen einsetzen: P2 P1 LOCK(S) LOCK(S) Krit. Abschnitt UNLOCK(S) UNLOCK(S) 4-53 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Beispiel z z z Man stelle sich zwei Prozesse vor, die eine ZŠhlervariable inkrementieren bzw. dekrementieren. Man kšnnte daraus ein Kooperationsobjekt machen. Ist das Objekt im Kern realisiert, so wird die Sicherung des kritischen Abschnitts durch die Kernsperre implizit vorgenommen: kernel module shared_counter; export increment, decrement; var counter_object = record C: integer = 0 end; procedure increment(CO: counter_object); CO.C := CO.C +1; procedure decrement(CO: counter_object); CO.C := CO.C -1; end shared_counter; 4-54 Implementierung au§erhalb des Kerns module shared_counter; // outside kernel export increment, decrement; var counter_object = record C: integer = 0 end; var LO: lock_object; procedure increment(CO: counter_object); begin LOCK(LO); CO.C := CO.C +1; UNLOCK(LO); end; procedure decrement(CO: counter_object); begin LOCK(LO); CO.C := CO.C -1; UNLOCK(LO); end; end shared_counter; 4-55 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Monitor z Ein solches Objekt, das den gegenseitigen Ausschluss sicherstellt, ohne dass der Programmierer explizit Sperroperationen einfŸgt, hei§t Monitor. z Ein Monitor ist ein Objekt, bestehend aus Prozeduren und Datenstrukturen, das zu jedem Zeitpunkt nur von einem Prozess benutzt werden darf. LOCK(S) LOCK(S) LOCK(S) Prozeduren UNLOCK(S) UNLOCK(S) UNLOCK(S) Sperrvariable Kooperationsdaten 4-56 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Beispiel Monitor z z Das obige Beispiel einer Kooperation auf einer ZŠhlervariable wŸrde als Monitor folgenderma§en zu formulieren sein. Das Monitorkonzept wŸrde vom Kern bereitgestellt und wŸrde automatisch das Setzen von Sperren durchfŸhren monitor module shared_counter; // outside kernel export increment, decrement; var counter_object = record C: integer = 0 end; procedure increment(CO: counter_object); begin CO.C := CO.C +1; end; procedure decrement(CO: counter_object); begin CO.C := CO.C -1; end; end shared_counter; 4-57 Anzahlbegrenzte Kooperation z z z z Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Ein Kooperationsabschnitt ist also dadurch gekennzeichnet, dass sich zu einem Zeitpunkt genau ein Prozess Òdarin aufhŠltÓ. Dieses Prinzip kann man erweitern, indem man andere KapazitŠten als Ò1Ó festsetzt. Man kann sowohl fŸr die Zahl der ÒdurchgelassenenÓ als auch fŸr die Zahl der wartenden Prozesse Obergrenzen vorsehen: y 1 y c>1 konstant y n beliebig GrŸnde, die Anzahl der Prozesse in einem bestimmten Bereich zu begrenzen: y Platzmangel y Leistungsabfall 4-58 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Anzahlbegrenzte Kooperation (2) FŸr diesen Zweck mŸssen die Sperroperationen etwas modifiziert werden: capacity_lock count < upper_bound ? capacity_unlock yes count = count - 1 process waiting ? no block deblock count = count + 1 4-59 Beispiel Anzahlbegrenzte Kooperation Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module capacity_locking; export C_LOCK, C_UNLOCK; import DEBLOCK, BLOCK; var c_lock_object = record UB: integer = c; // upper bound COUNT: integer = 0; // process counter WP: queue of process = empty end; procedure C_LOCK(LO: lock_object); begin while LO.COUNT = UB do BLOCK(LO.WP); // enqueue process LO.COUNT := LO.COUNT+1; end; procedure C_UNLOCK(LO: lock_object); begin LO.COUNT := LO.COUNT-1; if LO.WP /= empty then // a process is waiting DEBLOCK(LO.WP) // deblock first of queue end; end capacity_locking. 4-60 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Mehrsortenkooperation Beispiel: Leser-Schreiber-Kooperation (Reader-Writer-Problem) z Nicht alle Prozesse greifen schreibend auf die gemeinsamen Daten zu. Einige lesen nur. z Lesezugriffe sind unkritisch z In dem Kooperationsabschnitt dŸrfen sich daher y entweder 1 Schreiber y oder beliebig viele Leser aufhalten Verallgemeinerung: z Es gebe k Sorten von Prozessen. Im Kooperationsabschnitt dŸrfen sich y c1 Prozesse der Sorte 1 und/oder y c2 Prozesse der Sorte 2 und/oder y y z É ck Prozesse der Sorte k aufhalten Das Leser-Schreiber-Problem ist dann ein Spezialfall mit k=2, c1=1 und c2 = ∞ 4-61 Leser-Schreiber-Kooperation (Schreibervorrang) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module reader/writer-cooperation exort LOCK, UNLOCK; import DEBLOCK, BLOCK; var lock_object record R_COUNT: integer = 0; // counts readers WRP: queue of process = empty; // waiting reader processes W_COUNT: integer = 0; // counts writers WWP: queue of process = empty; // waiting writer processes end; procedure LOCK(LO:lock_object; type:{R,W}) begin if type = R then begin while LO.W_COUNT>0 or LO.WWP /= empty do BLOCK(LO.WRP) LO.R_COUNT:=LO.R_COUNT+1; end; else begin while LO.W_COUNT>0 or LO.R_COUNT>0 do BLOCK(LO.WWP) LO.W_COUNT:=LO.W_COUNT+1; end; end; procedure UNLOCK(LO:lock_object; type:{R,W}) begin if type = R then begin LO.R_COUNT:=LO.R_COUNT-1; if LO.R_COUNT=0 and LO.WWP /= empty then DEBLOCK(LO.WWP) end; else begin LO.W_COUNT:=LO.W_COUNT-1; if LO.W_COUNT=0 and LO.WWP /= empty then DEBLOCK(LO.WWP) else while LO.WRP /= empty do DEBLOCK(LO.WRP) end; end; end reader/writer-cooperation. 4-62 Leser-Schreiber-Kooperation (Leservorrang) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn kernel module reader/writer-cooperation exort LOCK, UNLOCK; import DEBLOCK, BLOCK; var lock_object record R_COUNT: integer = 0; // counts readers WRP: queue of process = empty; // waiting reader processes W_COUNT: integer = 0; // counts writers WWP: queue of process = empty; // waiting writer processes end; procedure LOCK(LO:lock_object; type:{R,W}) begin if type = R then begin while LO.W_COUNT>0 do BLOCK(LO.WRP) LO.R_COUNT:=LO.R_COUNT+1; end; else begin while LO.W_COUNT>0 or LO.R_COUNT>0 do BLOCK(LO.WWP) LO.W_COUNT:=LO.W_COUNT+1; end; end; procedure UNLOCK(LO:lock_object; type:{R,W}) begin if type = R then begin LO.R_COUNT:=LO.R_COUNT-1; if LO.R_COUNT=0 and LO.WWP /= empty then DEBLOCK(LO.WWP) end; else begin LO.W_COUNT:=LO.W_COUNT-1; if LO.W_COUNT=0 and LO.WRP /= empty then while LO.WRP /= empty do DEBLOCK(LO.WRP) else if LO.WWP /= 0 then DEBLOCK(LO.WRP) end; end; end reader/writer-cooperation. 4-63 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Semaphore z z z z Sperrobjekte zur Sicherung kritischer Abschnitte sind in der Betriebssystemliteratur auch unter dem Begriff Semaphor bekannt. EingefŸhrt ca 1965 von E.W. Dijkstra ist ein Semaphor ursprŸnglich eine ZŠhlsperre S, deren Operationen P(S) und V(S) statt LOCK(S) und UNLOCK(S) genannt wurden. y P und V sind Operationen, deren Unteilbarkeit sichergestellt ist. y P (entspr. lock) dekrementiert einen ZŠhler, V (entspr. unlock) inkrementiert diesen ZŠhler. (Daher verwendet man manchmal auch die Bezeichner UP(S) und DOWN(S)) Semaphore gibt es in verschiedenen Varianten y aktives Warten / Blockieren y ZŠhler / binŠre Variable y Initialisierung mit 0 / mit einem Wert k > 0 Sie kšnnen auch fŸr einfache Varianten der Betriebsmittelverwaltung eingesetzt werden 4-64 Beispielimplementierung Semaphor kernel module semaphore_synchronization; export P, V; import DEBLOCK, BLOCK; var semaphore = record C: integer = 1; // process counter // C=1: ÔfreeÕ, C<=0: occupied // if C<0 : |C| is the number of // waiting processes WP: queue of process = empty end; procedure P(S: semaphore); begin S.C := S.C-1; if S.C < 0 then BLOCK(S.WP); end; procedure V(S: semaphore); begin S.C := S.C+1; if S.C 0 then DEBLOCK(S.WP) end; end semaphore. 4-65 // enqueue process // deblock first of queue Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Bemerkung z z z Die Sammlung von Interaktionsmechanismen ist als Vorrat zu verstehen, aus dem je nach Einsatzgebiet des Betriebssystems eine Teilmenge zur VerfŸgung gestellt werden kann. In einem Betriebssystem mŸssen nicht alle mšglichen Varianten angeboten werden. Aber man sollte den Programmierern schon eine ausreichende Wahlmšglichkeit lassen. Kernschnittstelle 1:n-UND-Signalisierung Monitore 1:1-Kanäle Leser-Schreiber-Kooperation Synchronisationsbarriere Sperren m:n-Kanäle Rendezvous-Synchronisat 4-66 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn 4.5 Beispiele Koordinations- und Kooperationsoperationen in Windows NT NT kennt vier verschiedene Synchronisationsobjekte: semaphore, event, mutex, critical section. z Semaphore: Wird mit einer positiven Zahl initialisiert und im Sinne einer anzahlbegrenzenden Kooperation (Capacity Lock) zur Betriebsmittelverwaltung verwendet. y Mit CreateSemaphore() wird das Objekt erzeugt und kann nach OpenSemaphore() benutzt werden y Mit einer Warteoperation wie WaitForSingleObject() (entspricht POperation) wird der ZŠhlerwert dekrementiert und mit ReleaseSemaphore() (entspricht V-Operation) inkrementiert. y Wenn der ZŠhler den Wert 0 erreicht hat, wirkt die Warteoperation blockierend. y Semaphore kšnnen adressraumŸbergreifend eingesetzt werden, (d.h. zwischen Threads unterschiedlicher Prozesse) 4-67 Koordinations- und Kooperationsoperationen in Windows NT z Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Event y Wird zur Signalisierung eingesetzt y Auch hier wird ein Synchronsiationsobjekt mit CreateEvent() erzeugt und kann nach OpenEvent benutzt werden. y SetEvent() entspricht dem signal, und fŸr wait kšnnen die allgemeinen Wartefunktionen in NT wie WaitForSingleObject() eingesetzt werden. y Ein ResetEvent() erlaubt das explizite RŸcksetzen des Signals. y Normalerweise arbeitet der Event als Gruppensignalisierung, d.h. durch ein Signal werden alle wartenden Threads deblockiert. y Wird bei der Event-Erzeugung jedoch die AutoReset-Option verwendet, so lšst ein Signal nur einen Thread aus der Warteschlange (wie bei der Einzelsignalisierung) 4-68 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Koordinations- und Kooperationsoperationen in Windows NT z Mutex y Ein Mutex dient dem gegenseitigen Ausschluss. y Nach CreateMutex() und OpenMutex() kann mit einer Warteoperation (z.B. WaitForSingleObject() ) der kritische Abschnitt betreten werden. y Bei Verlassen des kritischen Abschnitts wird die Sperre mit ReleaseMutex() wieder freigegeben. y Ein Mutex kann von beliebigen Threads im System benutzt werden z Critical Section y Ein Critical-Section-Objekt ist eine vereinfachte und effizientere Variante y des Mutex speziell fŸr den gegenseitigen Ausschluss zwischen Prozessen im selben Adressraum (d.h. Threads im selben Prozess) y Mit InitializeCriticalSection() angelegt, wird der kritische Bereich Ÿber EnterCriticalSection() betreten und mit LeaveCriticalSection() wieder verlassen 4-69 Koordination und Kooperation im POSIX-Standard Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn FŸr Pthreads stehen mehrere Synchronsiationsobjekte zur VerfŸgung z Mutex: Ein Mutex dient dem gegenseitigen Ausschluss. z y pthread_mutex_init() initialisiert ein Mutex-Objekt y pthread_mutex_lock() wird beim Betreten des krit. Abschnitts aufgerufen und blockiert den Aufrufer, falls belegt y pthread_mutex_trylock() ist die nichtblockierende Variante: Falls frei, wird belegt; Falls belegt, wird mit entsprechendem Hinweis zurŸckgekehrt y pthread_mutex_unlock() beim Verlassen es kritischen Abschnitts Cond : Eine Condition-Variable dient der Signalisierung y pthread_cond_wait() blockiert, falls Signal nicht gesetzt y pthread_cond_timedwait() zusŠtzlich mit Fristablauf (time-out) y pthread_cond_signal() setzt das Signal und deblockiert den ÒvorderstenÓ Thread (PrioritŠt bzw. FCFS) y pthread_cons_broadcast() setzt Signal und deblockiert alle wartenden Prozesse ZusŠtzlich gibt es noch Mehrsortenkooperation (Reader/Writer-Locks) 4-70 Kommunikation in Unix und Windows NT (Auswahl) Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Spezieller 1:1-Kanal fŸr kontinuierlichen, gerichteten Zeichenstrom “xyz..“ Pipe “xyz..“ Prozeß A z z z z Prozeß B Die Pipe hat eine begrenzte KapazitŠt Ist die Pipe voll, so wird ein sendender (schreibender) Prozess blockiert Ist die Pipe leer, so wird ein empfangender (lesender) Prozess blockiert Nur lokaler Mechanismus zwischen genau zwei Prozessen 4-71 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Sockets (Unix, Windows NT) Sockets sind Endpunkte einer Duplex-Verbindung send recv send recv Prozeß A Prozeß B Socket z z z z Socket Ein Socket kann von mehreren Prozessen benutzt werden Verschiedene Socket-Typen werden angeboten y stream socket verbindungsorientiert y datagram socket paketorientiert y raw socket Durchgriff auf zugrundeliegende Protokolle Einsatz vor allem zur nichtlokalen Kommunikation (verteilte Systeme) Blockierend (synchron) oder nichtblockierend (asynchron) 4-72 Betriebssysteme © H.-U. Hei§ UniversitŠt Paderborn Sockets (2) bind() / Portnummer / zuordnen listen() / Warten auf / Verbindungs / -wunsch socket() / Erzeugen accept() / Verbindung / aufbauen connect() / Verbindung / aufbauen read() recv() / Lesen / Empfangen write() send() / Schreiben / Senden write() send() / Schreiben / Senden read() recv() / Lesen / Empfangen close() / Schlie§en close() / Schlie§en 4-73 Client-Prozess Server-Prozess socket() / Erzeugen