Komunikácia medzi procesmi

V distribuovaných systémoch nie je spoločná pamäť, takže všetky formy medziprocesovej komunikácie a synchronizácie musia byť založené na princípe zasielania správ. Ak chce proces A komunikovať s procesom B, skorej vytvorí správu vo svojom adresnom priestore. Potom zavolá systémovú službu, ktorá prevezme správu a pošle ju po sieti počítaču, na ktorom beží proces B.

Klient/server model

Klient/server model, je väčšinou založený na jednoduchom request/reply protokole, ktorý funguje nasledovne:
  • Klient pošle serveru správu so žiadosťou o nejakú službu.
  • Server urobí požadovanú činnosť a pošle späť správu, ktorá obsahuje požadované dáta a návratový kód, ktorý špecifikuje, či požadovaná operácia bola uskutočnená a v prípade že nie, i dôvod neuskutočnenia.
V tomto protokole môžu byť komunikačné služby redukované na dve systémové volania, jedno pre posielanie správ a druhé pre príjem. Tieto systémové služby môžu byť vyvolané pomocou procedúr:
  • send - vezme pripravenú správu a pošle ju určenému procesu,
  • receive – táto procedúra spôsobí zablokovanie procesu do tej doby, kým nedorazí správa.

Synchrónna a asynchrónna komunikácia

Klient/server model je synchrónnou komunikáciou ,pretože keď proces zavolá procedúru send, po dobu, čo sa prenáša správa, je proces blokovaný. Inštrukcie, ktoré nasledujú po volaní procedúry send nie sú vykonávané až do tej doby, kým správa nedorazí príjemcovi. Podobne receive zablokuje proces do tej doby, než dorazí očakávaná správa.

Pri asynchrónnej komunikácii send vráti kontrolu procesu ihneď bez čakania na odoslanie správy. Výhodou je, že proces môže pokračovať vo svojich výpočtoch po dobu prenosu správy. Nevýhodou je, že proces nemôže zmeniť zásobník so správou, kým nie je správa odoslaná. Proces nevie o tom, kedy bol prenos správy dokončený, takže nevie, kedy môže bezpečne použiť zásobník pre iné účely. Existujú dva spôsoby riešenia:

  • Jadro skopíruje správu do svojich vnútorných zásobníkov, čím umožní procesu ďalší bezpečný beh. Nevýhodou tohto riešenia je kopírovanie každej správy do vnútorných zásobníkov jadra, čo pri veľkom počte správ môže spôsobiť výrazné zníženie výkonu celého systému.
  • Proces sa preruší potom, ako bola správa úspešne odoslaná. Toto riešenie síce nevyžaduje žiadne kopírovanie, ale programy založené na užívateľských prerušeniach sú neprehľadné, plné kritických sekcií, čím sa stávajú veľmi ťažko udržiavateľné a rozšíriteľné.

Zasielanie správ cez schránku

Synchrónna a asynchrónna komunikácia sú príkladom priameho zasielania správ. Pri tomto spôsobe komunikácie prijímajúci proces povie systému, kam do adresného priestoru príjemcu má prijatú správu umiestniť. Týmto spôsobom funguje komunikácia spoľahlivo, kým proces stíha zavolať receive pred tým, než ľubovoľný proces zavolá send. Problém nastane, keď nejaký proces posiela správu, ale príjemca ešte nezavolal receive. Jadro v tomto prípade nevie, kam má prijatú správu uložiť. Toto sa dá vyriešiť vytvorením schránky, kam budú umiestňované neočakávané správy. V prípade, že príjemca v dostatočne krátkom intervale zavolá receive, dostane správu zo schránky.

Vzdialené volanie procedúr

Vzdialené volanie procedúr (angl. Remote procedure call, RPC), je inicializované klientom, ktorý pošle správu s požiadavkou na server, kvôli vykonaniu procedúry. Vzdialený server pošle odpoveď klientovi, a proces potom beží ďalej. Zatiaľ čo server spracováva volanie, klient je blokovaný, čaká pokiaľ server dokončí spracovanie. Postup udalostí počas RPC (Animácia: animácia sa nachádza v priečinku: prilohy\animacie\4.gif.):
  • Klient zavolá procedúru spojka, ktorá sa používa na vykonanie konverzie parametrov, takže pre vzdialený počítač vyzerá RPC ako miestne volanie.
  • Spojka vloží parametre do správy a zavolá systémové volanie na odoslanie správy.
  • Jadro pošle správu jadru, kde beží server.
  • Jadro servera odovzdá správu serverovej spojke.
  • Serverová spojka rozbalí parametre zo správy a zavolá server.
  • Server spracuje požiadavky a zavolá spojku.
  • Serverová spojka zabalí výstupné parametre do správy a zavolá jadro.
  • Jadro pošle správu klientovmu jadru.
  • Klientovo jadro odovzdá správu spojke.
  • Spojka rozbalí výstupné parametre a vráti hodnoty.

Skupinová komunikácia

Doteraz sme predpokladali, že jeden proces posiela správu inému procesu – tzv. unicast (obr. 1a). V distribuovaných systémoch často nastanú situácie, keď táto schéma komunikácie nepostačuje a je potrebné zaslať správu skupine procesov. Skupinová komunikácia sa delí na:
  • Broadcast (obr. 1c) – správa sa zašle všetkým prepojením počítačom. V tomto prípade vysielajúci proces nemusí uvádzať adresu príjemcu, pretože správa je odoslaná všetkým uzlom zapojeným do systému.
  • Multicast (obr. 1b) - umožňuje príjem len vybranej podmnožine pripojených uzlov. Na rozdiel od broadcastu je vysielací proces schopný identifikovať množinu príjemcov.

Obrázok 1: (a) Unicast (b) Multicast (c) Broadcast


Atomicita

Charakteristikou skupinovej komunikácia je vlastnosť „všetko alebo nič“. Väčšina systémov, ktoré podporujú skupinovú komunikáciu je navrhnutých tak, že keď je skupine zaslaná správa, tak správu korektne dostanú všetci členovia skupiny, alebo žiadny z nich. Táto vlastnosť sa nazýva atomicita, alebo atomický broadcast.

Usporiadanie správ

Pre správne fungovanie skupinovej komunikácie musí byť zaistené aby správy prichádzali všetkým členom skupiny v rovnakom poradí. Na obrázku 2 je znázornená situácia, ku ktorej by nemalo dôjsť. Procesy A a D sa približne v rovnaký okamih rozhodli poslať správu procesom B a C. Čísla udávajú poradie, v ktorom sú jednotlivé správy doručované. Procesu B prišla ako prvá správa od procesu A a ako druhá správa od procesu D. Naopak procesu D prišla ako prvá správa od procesu D a ako druhá správa od procesu A. Ak sa procesy A a D snažia zmeniť rovnaký záznam v databáze, B a C budú mať rozdielne hodnoty.

Obrázok 2: Konkurenčné zasielanie správ s rozdielnym usporiadaním príjmu.


Najlepšie možnosťou je zabezpečiť, aby všetky správy boli doručené v tom poradí, v akom boli odoslané. Keď proces A odošle správu a o niečo neskôr proces D odošle ďalšiu správu, systém by mal skorej doručiť správu od procesu A všetkým členom skupiny, a potom doručiť správu od procesu D. V tomto prípade by všetci prijímatelia dostali správu v rovnakom poradí.

1Pomocou akých metód prebieha komunikácia?






2Ako prebieha komunikácia v DS?




3Čo patrí do skupinovej komunikácie?