2 Prozesse und ihre Interaktion. 2.1 Prozesse. Die Abarbeitung von Programmen ist in Prozessen organisiert

© H.-U. Hei§, Uni Paderborn 2 Prozesse und ihre Interaktion 2.1 Prozesse Die Abarbeitung von Programmen ist in Prozessen organisiert. Ein Prozess bes...
2 downloads 1 Views 117KB Size
© H.-U. Hei§, Uni Paderborn

2 Prozesse und ihre Interaktion 2.1 Prozesse Die Abarbeitung von Programmen ist in Prozessen organisiert. Ein Prozess besteht im wesentlichen aus ¥ einem StŸck Programmcode ¥ einem oder mehrerer Datenbereichen, auf die er zugreift ¥ dem aktuellen Zustand der Bearbeitung Ein Prozess ist reprŠsentiert durch einen Prozesskontrollblock (PCB), der alle relevante Information enthŠlt, z.B.: ¥

Prozesscharakteristika: - Prozesskennung, Name des Programms

¥

Zustandsinformation - BefehlszŠhler, Stapelzeiger, Registerinhalte

¥

Verwaltungsdaten: - PrioritŠt, Rechte, Statistikdaten 2-1

© H.-U. Hei§, Uni Paderborn

Prozessumschalten Zu einem Zeitpunkt existieren in einem Betriebssystem in der Regel viele Prozesse. Ein Prozess, der gerade durch den Prozessor bearbeitet wird, hei§t rechnend (running). Es kann in einem Rechner hšchstens soviele rechnende Prozesse geben wie Prozessoren vorhanden sind. Um einen anderen Prozess zu bearbeiten, muss umgeschaltet werden: ¥

die Zustandsinformation (BefehlszŠhler, Stapelzeiger, Rechenregister) des rechnenden Prozesses wird in seinen Prozesskontrollblock (PCB) gerettet.

¥

danach wird die Zustandsinformation des neuen Prozesses in den Prozessor geladen.

Das Umschalten kann ¥

freiwillig erfolgen (rechnender Prozess gibt den Prozessor auf)

¥

erzwungen werden (ausgelšst durch eine HW-Unterbrechung wird der rechnende Prozess verdrŠngt (preemption)) 2-2

© H.-U. Hei§, Uni Paderborn

Umschalten Prozeß P1

Betriebssystem-Kern

Zustand von P1 aus Prozessor in PCB retten Zustand von P2 aus PCB in Prozessor laden

Zustand von P2 aus Prozessor in PCB retten Zustand von P1 aus PCB in Prozessor laden

2-3

Prozeß P2

© H.-U. Hei§, Uni Paderborn

Blockieren ¥

Ein Prozess, der durch Aufgabe oder VerdrŠngung den Prozessor verlŠsst, kann jederzeit wieder zugeordnet werden.

¥

Prozesse, die auf eine erneute Zuordnung zum Prozessor warten, hei§en bereit (ready)

¥

Aus dieser Menge wird beim Umschalten ein neuer Prozess ausgewŠhlt (Scheduling-Strategie)

¥

In vielen FŠllen kann ein Prozess jedoch erst fortgesetzt werden, wenn ein bestimmtes Ereignis eingetreten ist (z.B. Ende eine E/A-Vorgangs). Er wird solange blockiert. Erst nach Eintritt des Ereignisses, auf das er wartet, wird er wieder in Menge der bereiten Prozesse Ÿbernommen. Der BS-Kern stellt dazu die Operationen Blockieren und Deblockieren zur VerfŸgung.

2-4

© H.-U. Hei§, Uni Paderborn

ProzesszustŠnde Dadurch ergeben sich die folgenden ProzesszustŠnde. FŸr die ZustandsŸbergŠnge gibt es entsprechende Operationen des BS-Kerns.

Wartend (waiting, blocked) BLOCKIEREN

DEBLOCKIEREN AUFGEBEN

Bereit (ready)

Aktiv

Rechnend (running)

ZUORDNEN

2-5

© H.-U. Hei§, Uni Paderborn

Erweiterung des Zustandsdiagramms Diese drei ZustŠnde kšnnen zu einem Zustand aktiv zusammengefasst werden. Aktive Prozesse besitzen (au§er dem Prozessor) die zum Ablauf erforderlichen Betriebsmittel (z.B. Programm ist in den Hauptspeicher geladen, Datenbereiche sind zugeordnet) Es ist jedoch mšglich, dass Prozesse zwar existieren (es gibt einen Prozesskontrollblock), jedoch z.B. kein Hauptspeicher zur VerfŸgung steht (noch nicht zugeordnet oder wieder entzogen). Solche Prozesse sind existent, aber nicht aktiv. Schlie§lich ist noch die Erzeugung bzw. Lšschung eines Prozesses (d.h. seines Prozesskontrollblocks) vorzusehen . Dadurch ergibt sich die folgende ErgŠnzung der ProzesszustŠnde und ZustandsŸbergŠnge:

2-6

© H.-U. Hei§, Uni Paderborn

VollstŠndiges Prozesszustandsdiagramm

Wartend (waiting, blocked) BLOCKIEREN

DEBLOCKIEREN LÖSCHEN

DEAKTIVIEREN

AUFGEBEN

Nichtaktiv

Nichtexistient

Bereit (ready)

AKTIVIEREN

ERZEUGEN Existent

Rechnend (running)

ZUORDNEN Aktiv

2-7

© H.-U. Hei§, Uni Paderborn

Implementierung Die existenten Prozesse (d.h. ihre Kontrollblšcke, PCBs) werden vom BS-Kern in speziellen Datenstrukturen verwaltet (z.B. verkettete Listen). Ihr Zustand wird entweder im jeweiligen Kontrollblock vermerkt, oder es werden fŸr die einzelnen ZustŠnde spezielle Datenstrukturen unterhalten. †blich ist beispielsweise eine Liste (Warteschlange) der bereiten Prozesse (Bereitliste, ready queue). Operationen zum Zustandswechsel von Prozessen bestehen dann hŠufig darin, dass ein PCB aus einer verketteten Liste entfernt und in eine anderere eingefŸgt wird. Bei den wartenden Prozessen kann fŸr jedes Ereignis, auf das gewartet wird, ein entsprechender Warteraum (Liste von PCBs) eingerichtet werden.

2-8

© H.-U. Hei§, Uni Paderborn

Beispiel: Umschalten zwischen Prozessen mit PrioritŠtsstrategie

Neuankömmling bzw. verdrängter Prozeß

Nächster Einordnen gemäß Priorität

Bereitliste (Prozeßkontrollblöcke)

Prozessoren

2-9

© H.-U. Hei§, Uni Paderborn

Prozesse und AdressrŠume Moderne Prozessoren ermšglichen nicht nur relative Adressierung (Basisregister), sondern stellen eine Speicherabbildungsfunktion (memory management unit, MMU) zur VerfŸgung. Damit kšnnen (beliebig) viele logische AdressrŠume gebildet werden, die automatisch auf den physikalischen Speicher abgebildet werden. Dadurch sind die AdressrŠume gegenseitig geschŸtzt. GrundsŠtzlich sind AdressrŠume unabhŠngig von Prozessen zu sehen. Zwar benštigt jeder Prozess zu jedem Zeitpunkt einen Adressraum, ansonsten sind aber verschiedene Beziehungen mšglich: ¥ ¥ ¥

Ein Prozess wechselt zwischen mehreren AdressrŠumen Ein Prozess besitzt genau einen Adressraum Mehrere Prozesse teilen sich einen Adressraum

2-10

© H.-U. Hei§, Uni Paderborn

Beispiele fŸr die Zuordnung von AdressrŠumen zu Prozessen

Adreßraum

Prozeß, bestehend aus Programmcode Daten

Mehrere Prozesse im selben AR

Jeder Prozess im eigenen AR 2-11

© H.-U. Hei§, Uni Paderborn

Hinweis BezŸglich der Terminologie in der einschlŠgigen Literatur ist Vorsicht geboten: Ein Prozess (process, task) wird hŠufig im Sinne eines Unix-Prozesses verstanden als ein Prozess mit einem eigenen Adressraum. Da ein Umschalten eines solchen Prozesses mit einem (relativ aufwendigen) Adressraumwechsel verbunden ist, nennt man einen Unix-artigen Prozess auch Schwergewichtsprozess (heavyweight process) Die meisten neueren Betriebssysteme ( auch neuere UNIX-Varianten) bieten dagegen die Mšglichkeit an, mehrere Prozesse in einem gemeinsamen Adressraum ablaufen zu lassen. Man nennt sie Leichtgewichtsprozesse (lightweight process) oder Threads. In modernen Unix-Varianten (z.B. Solaris) gibt es daher einerseits die ursprŸnglichen UnixProzesse (tasks), die aber aus vielen Threads bestehen kšnnen. Der Unix-Prozess degeneriert dadurch zu einer Art Ablaufumgebung der Threads. FŸr eine Gruppe von Threads im selben Adressraum finden sich auch die Begriffe Team (System V) oder Actor (Chorus) Der hier in der Vorlesung verwendete Prozessbegriff deckt sich mit dem des Thread. 2-12

© H.-U. Hei§, Uni Paderborn

2.2 Interaktion zwischen Prozessen 2.2.1 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. 2-13

© H.-U. Hei§, Uni 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 ( = expliziter Datenstransport) P1

Kooperation ( = Zugriff auf gemeinsame Daten) P1

P2

P2 gemeinsamer Teil

D1

Kopieren

D2

D1

D2

(symmetrische Beziehung)

(gerichtete Beziehung) 2-14

© H.-U. Hei§, Uni Paderborn

Konzeptueller Charakter der beiden Formen 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. Prozeß 1

Prozeß 2

Prozeß 2

Prozeß 1

Kooperation

Kommunikation

Modellebene

Kommunikation

Modellebene Kooperation

Realisierungsebene

Kooperation realisiert durch Kommunikation

Realisierungsebene

Kommunikation realisiert durch Kooperation

2-15

© H.-U. Hei§, Uni Paderborn

Koordination (zeitliche Abstimmung) Prozeß P1

A

Prozeß P2 Warten (wait) 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 (wait) wird P2 ggf. solange aufgehalten, bis P1 die Operationen Signalisieren (signal) aufgerufen hat. Nach Ablauf beider Operationen wird das Signal zurŸckgesetzt (d.h. das Signal wird ãverbrauchtÒ) 2-16

© H.-U. Hei§, Uni Paderborn

Kooperation Kooperation tritt auf, wenn mehrere Prozesse auf dieselben Daten zugreifen. Um Fehler und Inkonsistenzen zu vermeiden, mŸssen die Zugriffe koordiniert sein. Beispiel: Zwei Prozesse P1 und P2 inkrementieren eine gemeinsame Variable s. Der Ablauf beider Prozesse wŸrde demnach den Wert der Variablen um 2 erhšhen. Aufgelšst in Maschinenbefehle kšnnte sich in einem Einprozessorsystem mit VerdrŠngung (oder auch in einem Mehrprozessorsystem) eine Befehlsfolge ergeben, bei der eine Erhšhung verlorengeht: P1

P2

Speicherzelle s s=4

load s P1

P2

s := s+1

s := s+1

Die beiden Prozesse

load s add 1 store s add 1 store s

s=5 s=5

Eine AusfŸhrung der beiden Prozesse 2-17

© H.-U. Hei§, Uni Paderborn

Noch ein 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. 2-18

© H.-U. Hei§, Uni Paderborn

Kritische Abschnitte Es gibt offensichtlich Operationsfolgen, bei denen ein nebenlŠufiger Zugriff oder eine verzahnte AusfŸhrung zu Fehlern fŸhrt. Man nennt eine solche Folge einen kritischen Abschnitt (critical section). Kritische Abschnitte sind unter gegenseitigem Ausschluss (mutual exclusion) auszufŸhren. Dazu gibt es das Operationspaar Sperren (lock) und Entsperren (unlock) als spezielle Form der Koordination Lock(L)

PrŸft, ob die binŠre Sperrvariable L gesetzt ist (L= 1) Falls ja, wird der aufrufende Prozess in der Operationen solange aufgehalten (z.B. blockiert), bis L zurŸckgesetzt ist (L = 0). Dann wird L gesetzt und der Prozess fortgesetzt.

Unlock(L)

Setzt die Sperrvariable L zurŸck (L = 0) und deblockiert ggf. einen blockierten Prozess

2-19

© H.-U. Hei§, Uni Paderborn

Kritische Abschnitte Ein kritischer Abschnitt gesichert durch Sperroperationen P1

P2

LOCK(L)

LOCK(L)

Krit. Abschnitt UNLOCK(L)

UNLOCK(L)

Anmerkung: Um die Datenstrukturen des BS-Kerns zu sichern, wird hŠufig der gesamte BS-Kern als kritischer Abschnitt realisiert. Bei Aufruf einer Kernoperation erwirbt der Prozess die sogenannte Kernsperre, so dass kein weiterer Prozess den Kern betreten kann. 2-20

© H.-U. Hei§, Uni 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 2-21

© H.-U. Hei§, Uni Paderborn

2.2.2 Das Kanalkonzept (Kommunikation) 2.2.2.1 Grundlagen Ein Kanal ist ein Datenobjekt, das die Operationen Senden (send) und Empfangen (receive) zur VerfŸgung stellt. Parameter: ¥

Name des Kanal(objekt)s (CO)

¥

Adresse eines BehŠlters Sender: Adresse der zu verschickenden Nachricht (QuellbehŠlter BS) (Statt der Adresse kann hier auch die Nachricht selbst stehen) EmpfŠnger: Adresse, wohin die empfangene Nachricht geschrieben werden soll (ZielbehŠlter BR) P1

P2

SEND(CO,BS)

RECEIVE(CO,BR)

CO

Operationen Daten 2-22

© H.-U. Hei§, Uni Paderborn

ZeitverhŠltnisse Da Sender und EmpfŠnger ihre Operationen zu beliebigen Zeitpunkten aufrufen kšnnen, sind zwei FŠlle zu berŸcksichtigen: 1. 2.

Erst Senden, dann Empfangen Erst Empfangen, dann Senden

Wenn die aufrufenden Prozesse in den Operationen nicht aufgehalten (blockiert) werden sollen, besteht die Notwendigkeit der Zwischenspeicherung im Kanal Sender zuerst:

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 Senden die Nachricht dorthin kopiert werden

kann

Der Kanal muss entsprechende Variable zur Aufnahme dieser Daten vorsehen

2-23

© H.-U. Hei§, Uni Paderborn

Wirkung der Reihenfolge der Operationen 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

2-24

Dr

Adresse Zielbehälter

Erster

© H.-U. Hei§, Uni Paderborn

Varianten der 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 Adressraum des EmpfŠngers eingeblendet (Kein Kopieren erford.) Sender

Empfänger Kanal

2-25

in den

© H.-U. Hei§, Uni Paderborn

Grundform der Kommunikation (Variante WertŸbergabe)

SEND(CO,MSG)

RECEIVE(CO,BR)

deposit message MSG at channel N

deposit address of target buffer BR at channel

address of target buffer BR available?

message MSG available ?

copy message to target buffer

copy message to target buffer

delete message and target buffer address

delete message and target buffer address

R

R

2-26

N

© H.-U. Hei§, Uni Paderborn

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;

2-27

© H.-U. Hei§, Uni Paderborn

2.2.2.2 Koordinierte Kommunikation Bisher hatten wir keinerlei zeitliche Abstimmung zwischen Sender und EmpfŠnger gefordert. ¥

Beide rufen ihre jeweilige Operation auf, legen ggf. Daten im Kanal ab, verlassen die Prozedur und arbeiten weiter, ohne auf den Kommunikationspartner zu warten.

¥ 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. ¥

Er wird also in der Empfangsoperation so lange aufgehalten (blockiert).

¥

Auf diese Weise synchronisiert er sich mit dem Sender (d.h. wartet auf ihn).

¥

Man spricht dann von einem synchronen Empfangen.

¥ 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 2-28

© H.-U. Hei§, Uni Paderborn

Koordinationsvarianten der Kommunikation Pq

Pz

Pq

SENDEN

EMPFANGEN

SENDEN

Pz EMPFANGEN

SIGNAL

A:A

WARTEN

A:S

asynchrones Senden

asynchrones Empfangen

asynchrones Senden

synchrones Empfangen

Pq

Pz

Pq

Pz

SENDEN

EMPFANGEN

WARTEN

SIGNAL

SENDEN SIGNAL WARTEN

EMPFANGEN SIGNAL WARTEN

synchrones Senden

S:A

S:S asynchrones Empfangen

synchrones Senden

synchrones Empfangen „Rendezvous“

2-29

© H.-U. Hei§, Uni Paderborn

Implementierungsbeispiel kernel module Communication; { A:S-Channel, by value} export SEND_A, RECEIVE_S; var channel_object = 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;

2-30

© H.-U. Hei§, Uni Paderborn

Variante: Versuchendes Senden bzw. Empfangen (polling, probing) Gelegentlich mšchte man nur prŸfen, ob eine Nachricht vorliegt. Wenn ja, wird sie entgegengenommen (kopiert), wenn nein, geschieht nichts. kernel module communication; export SEND_A, RECEIVE_T;

(A:T-channel, trying receive)

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; 2-31

© H.-U. Hei§, Uni Paderborn

Weitere Variante: Umlenkendes Senden bzw. Empfangen Idee: Nach erfolgreicher NachrichtenŸbermittlung wird der Kommunikationspartner unterbrochen und auf ein spezielles ProgrammstŸck umgelenkt.

DurchfŸhrung: ¥ Der zuerst kommende Prozess legt neben der BehŠlteradresse eine Umlenkadresse ab. ¥

Bei Eintreffen des Partners wird die Nachricht kopiert und der Prozess auf die angegebene Adresse umgelenkt

(€nlich den sogenannten ãactive messagesÒ)

2-32

© H.-U. Hei§, Uni Paderborn

kernel module Communication; 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 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) 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; if CO.DS empty then begin CO.DR^ := CO.DS;{message transport} CO.DS := empty; CO.DR := empty INTERRUPT(my_PID, LI) end end; end Communication.

2-33

© H.-U. Hei§, Uni Paderborn

2.2.2.3 KapazitŠt Bisher kann ein Kanal genau eine Nachricht bzw. einen ãEmpfangswunschÒ speichern. WŸnschenswert: FŠhigkeit, mehrere Nachrichten zu ãpuffernÒ Beispiel:

Mehrere Prozesse senden an einen zentralen ãServer-ProzessÒ P P

S

n:1-Kanal

P

E

S S

z.B. zentraler Server

2-34

© H.-U. Hei§, Uni 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

Datenstrukturen und ihre KapazitŠt 2-35

© H.-U. Hei§, Uni Paderborn

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 ¥ ¥ ¥ ¥

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: ¥

unbegrenzt KapazitŠt: erfordert dynamische Speicherverwaltung innerhalb der Kommunikationsoperationen: Speicherplatz muss angefordert und freigegeben werden

¥

begrenzte KapazitŠt: erfordert Mechanismen bei ã†berlaufÒ Mšglichkeiten: ¥ †berschreiben ¥ Abweisung der Operation ¥ Blockierung des Aufrufers, bis KapazitŠt frei wird

2-36

© H.-U. Hei§, Uni Paderborn

Beispiel kernel module n:n/A:S-Channel; export SEND_A, RECEIVE_S; import ALLOCATE, RELEASE, INSERT, REMOVE, BLOCK, DEBLOCK; var channelobjekt = 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: channelobjekt; 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: channel_objekt; 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. 2-37

© H.-U. Hei§, Uni Paderborn

2.2.2.4 Physische Zuordnung Ein Kanal ist zunŠchst ein eigenstŠndiges Kommunikationsobjekt, das unabhŠngig von irgendwelchen Sendern und EmpfŠngern existieren kann. Es ist jedoch gelegentlich sinnvoll, ein Kommunikationsobjekt fest einem Prozess zuzuordnen. Dies kann sendeseitig oder empfangsseitig erfolgen: ¥

Besitzt ein Prozess einen Kanal, in dem er alle seine ausgehenden Nachrichten ablegt, so spricht man von einem Ausgangstor.

¥ Besitzt ein Prozess einen Kanal, in dem alle seine eingehenden Nachrichten abgelegt werden, so spricht man von einem Eingangstor (port). Ports sind die in modernen Betriebssystemen am meisten verbreiteten Kommunikationsobjekte. Eingangstore sind n:1-KanŠle, Ausgangstore 1:n-KanŠle. 2-38

© H.-U. Hei§, Uni Paderborn

Bindung von Kommunikationsobjekten an Prozessen keine Bindung „Kanal“ Prozeß

n:n

Prozeß

Bindung an Sender „Ausgangstor“ Prozeß

Prozeß 1:n

Bindung an EmpfŠnger „Eingangstor“, port Prozeß

n:1 Prozeß 2-39

© H.-U. Hei§, Uni Paderborn

2.2.2.5 Gruppenkommunikation 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 ¥ ¥ ¥ ¥

Einzel-Einzel-Kanal Einzel-Gruppen-Kanal Gruppen-Einzel-Kanal Gruppen-Gruppen-Kanal

(wie bisher, ãone-to-one-communicationÒ) (broadcast, multicast, ãone-to-many-communicationÒ) (combine, ãmany-to-one-communicationÒ) (all-to-all-broadcast, ãmany-to-many-communicationÒ

2-40

© H.-U. Hei§, Uni Paderborn

Gruppenkommunikation (schematisch) Empfangsseitige Gruppe: Nachricht geht an mehrere E Vervielfältigung

S

E : E Sendeseitige Gruppe: Mehrere Nachrichten werden kombiniert S Zusammenfassung S

E :

S 2-41

© H.-U. Hei§, Uni Paderborn

Art der Zusammenfassung 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): ¥

Konkatenation: „a“ „5“

concat

„a5k“

„k“ ¥

Logische VerknŸpfung:

„true

“ „true“ e“ „fals ¥

&

„false“

Σ

„12“

Arithmetische VerknŸpfung: „5“ „3“ „4“ 2-42

© H.-U. Hei§, Uni Paderborn

Beispiel fŸr Implementierung (mit EmpfŠnger-Rendezvous) kernel module 1:1/G:G/A:S-channel; export G_SEND_A, G_RECEIVE_S; import BLOCK, DEBLOCK; var channel_object = record QDS: array[1..kq] of message = all empty; QDR: array[1..kz] of address = all empty; QPR: array[1..kz] 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 ∨ ∃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 2-43