Proces môže byť dvoch typov:
- Nezávislý proces.
- Proces spolupráce.
Nezávislý proces nie je ovplyvnený vykonávaním iných procesov, zatiaľ čo spolupracujúci proces môže byť ovplyvnený inými vykonávajúcimi procesmi. Aj keď si možno myslieť, že tieto procesy, ktoré bežia nezávisle, sa budú vykonávať veľmi efektívne, v skutočnosti existuje veľa situácií, keď možno kooperatívnu povahu využiť na zvýšenie výpočtovej rýchlosti, pohodlia a modularity. Medziprocesová komunikácia (IPC) je mechanizmus, ktorý umožňuje procesom navzájom komunikovať a synchronizovať svoje činnosti. Komunikáciu medzi týmito procesmi možno považovať za spôsob spolupráce medzi nimi. Procesy môžu medzi sebou komunikovať prostredníctvom oboch:
- Zdieľaná pamäť
- Odovzdávanie správ
Obrázok 1 nižšie zobrazuje základnú štruktúru komunikácie medzi procesmi prostredníctvom metódy zdieľanej pamäte a prostredníctvom metódy odovzdávania správ.
Operačný systém môže implementovať oba spôsoby komunikácie. Najprv si rozoberieme spôsoby komunikácie so zdieľanou pamäťou a potom odovzdávanie správ. Komunikácia medzi procesmi pomocou zdieľanej pamäte vyžaduje, aby procesy zdieľali nejakú premennú a úplne závisí od toho, ako to programátor implementuje. Jeden spôsob komunikácie využívajúci zdieľanú pamäť si možno predstaviť takto: Predpokladajme, že proces1 a proces2 sa vykonávajú súčasne a zdieľajú niektoré zdroje alebo používajú niektoré informácie z iného procesu. Process1 generuje informácie o určitých výpočtoch alebo používaných zdrojoch a uchováva ich ako záznam v zdieľanej pamäti. Keď proces2 potrebuje použiť zdieľané informácie, skontroluje záznam uložený v zdieľanej pamäti a zaznamená informácie generované procesom1 a podľa toho bude konať. Procesy môžu využívať zdieľanú pamäť na extrakciu informácií ako záznam z iného procesu, ako aj na doručenie akýchkoľvek špecifických informácií iným procesom.
Poďme diskutovať o príklade komunikácie medzi procesmi pomocou metódy zdieľanej pamäte.

i) Metóda zdieľanej pamäte
Príklad: Problém medzi výrobcom a spotrebiteľom
Existujú dva procesy: výrobca a spotrebiteľ. Výrobca vyrába nejaké položky a spotrebiteľ túto položku spotrebuje. Tieto dva procesy zdieľajú spoločný priestor alebo pamäťové miesto známe ako vyrovnávacia pamäť, kde je uložená položka vyrobená výrobcom a z ktorej spotrebiteľ v prípade potreby položku spotrebuje. Existujú dve verzie tohto problému: prvá je známa ako problém s neobmedzenou vyrovnávacou pamäťou, v ktorom môže výrobca pokračovať vo výrobe položiek a neexistuje žiadne obmedzenie veľkosti vyrovnávacej pamäte, druhá je známa ako problém s ohraničenou vyrovnávacou pamäťou v ktoré môže výrobca vyrobiť až do určitého počtu položiek predtým, než začne čakať, kým ich spotrebiteľ spotrebuje. Budeme diskutovať o probléme ohraničenej vyrovnávacej pamäte. Najprv sa výrobca a spotrebiteľ podelia o spoločnú pamäť, potom výrobca začne vyrábať položky. Ak sa celková vyrobená položka rovná veľkosti zásobníka, výrobca počká, kým ju spotrebiteľ spotrebuje. Podobne si spotrebiteľ najskôr overí dostupnosť položky. Ak nie je k dispozícii žiadna položka, spotrebiteľ počká, kým ju výrobca vyrobí. Ak sú k dispozícii položky, spotrebiteľ ich spotrebuje. Pseudokód na demonštráciu je uvedený nižšie:
Zdieľané údaje medzi týmito dvoma procesmi
C
#define buff_max 25> #define mod %> >struct> item{> >// different member of the produced data> >// or consumed data> >---------> >}> > >// An array is needed for holding the items.> >// This is the shared place which will be> >// access by both process> >// item shared_buff [ buff_max ];> > >// Two variables which will keep track of> >// the indexes of the items produced by producer> >// and consumer The free index points to> >// the next free index. The full index points to> >// the first full index.> >int> free_index = 0;> >int> full_index = 0;> > |
>
>
Kód procesu výrobcu
C
item nextProduced;> > >while>(1){> > >// check if there is no space> >// for production.> >// if so keep waiting.> >while>((free_index+1) mod buff_max == full_index);> > >shared_buff[free_index] = nextProduced;> >free_index = (free_index + 1) mod buff_max;> >}> |
>
>
Kódex spotrebiteľského procesu
C
item nextConsumed;> > >while>(1){> > >// check if there is an available> >// item for consumption.> >// if not keep on waiting for> >// get them produced.> >while>((free_index == full_index);> > >nextConsumed = shared_buff[full_index];> >full_index = (full_index + 1) mod buff_max;> >}> |
>
>
Vo vyššie uvedenom kóde výrobca začne znova vyrábať, keď bude (free_index+1) mod buff max zadarmo, pretože ak nie je zadarmo, znamená to, že stále existujú položky, ktoré môže spotrebiteľ spotrebovať, takže nie je potrebné. vyrábať viac. Podobne, ak voľný index a úplný index poukazujú na rovnaký index, znamená to, že neexistujú žiadne položky na konzumáciu.
Celková implementácia C++:
C++
#include> #include> #include> #include> #define buff_max 25> #define mod %> struct> item {> >// different member of the produced data> >// or consumed data> >// ---------> };> // An array is needed for holding the items.> // This is the shared place which will be> // access by both process> // item shared_buff[buff_max];> // Two variables which will keep track of> // the indexes of the items produced by producer> // and consumer The free index points to> // the next free index. The full index points to> // the first full index.> std::atomic<>int>>free_index(0);> std::atomic<>int>>úplný_index(0);> std::mutex mtx;> void> producer() {> >item new_item;> >while> (>true>) {> >// Produce the item> >// ...> >std::this_thread::sleep_for(std::chrono::milliseconds(100));> >// Add the item to the buffer> >while> (((free_index + 1) mod buff_max) == full_index) {> >// Buffer is full, wait for consumer> >std::this_thread::sleep_for(std::chrono::milliseconds(100));> >}> >mtx.lock();> >// Add the item to the buffer> >// shared_buff[free_index] = new_item;> >free_index = (free_index + 1) mod buff_max;> >mtx.unlock();> >}> }> void> consumer() {> >item consumed_item;> >while> (>true>) {> >while> (free_index == full_index) {> >// Buffer is empty, wait for producer> >std::this_thread::sleep_for(std::chrono::milliseconds(100));> >}> >mtx.lock();> >// Consume the item from the buffer> >// consumed_item = shared_buff[full_index];> >full_index = (full_index + 1) mod buff_max;> >mtx.unlock();> >// Consume the item> >// ...> >std::this_thread::sleep_for(std::chrono::milliseconds(100));> >}> }> int> main() {> >// Create producer and consumer threads> >std::vectorthread>nite; threads.emplace_back(producer); threads.emplace_back(consumer); // Počkajte, kým sa vlákna dokončia pre (auto& vlákno : vlákna) { thread.join(); } návrat 0; }> |
>
>
rozbaľovacia ponuka javascript
Všimnite si, že atómová trieda sa používa na zabezpečenie toho, aby sa zdieľané premenné free_index a full_index aktualizovali atomicky. Mutex sa používa na ochranu kritickej sekcie, kde sa pristupuje k zdieľanej vyrovnávacej pamäti. Funkcia sleep_for sa používa na simuláciu výroby a spotreby položiek.
ii) Metóda odovzdávania správ
Teraz začneme diskusiu o komunikácii medzi procesmi prostredníctvom odovzdávania správ. Pri tejto metóde procesy medzi sebou komunikujú bez použitia akéhokoľvek druhu zdieľanej pamäte. Ak chcú spolu komunikovať dva procesy p1 a p2, postupujú takto:
- Vytvorte komunikačné spojenie (ak prepojenie už existuje, nie je potrebné ho vytvárať znova.)
- Začnite si vymieňať správy pomocou základných primitív.
Potrebujeme aspoň dve primitívy:
– poslať (správa, cieľ) príp poslať (správa)
– prijímať (správa, hostiteľ) príp prijímať (správa)

Veľkosť správy môže mať pevnú veľkosť alebo variabilnú veľkosť. Ak má pevnú veľkosť, je to jednoduché pre dizajnéra OS, ale komplikované pre programátora a ak má variabilnú veľkosť, potom je to jednoduché pre programátora, ale komplikované pre dizajnéra OS. Štandardná správa môže mať dve časti: hlavička a telo.
The hlavičkový diel sa používa na ukladanie typu správy, id cieľa, id zdroja, dĺžky správy a riadiacich informácií. Riadiace informácie obsahujú informácie, ako napríklad čo robiť, ak sa minie vyrovnávacia pamäť, poradové číslo, priorita. Vo všeobecnosti sa správa odosiela pomocou štýlu FIFO.
Správa prechádzajúca cez komunikačné prepojenie.
Priama a nepriama komunikácia
Teraz začneme našu diskusiu o metódach implementácie komunikačných spojení. Pri implementácii odkazu je potrebné mať na pamäti niekoľko otázok, ako napríklad:
- Ako sa vytvárajú prepojenia?
- Môže byť prepojenie spojené s viac ako dvoma procesmi?
- Koľko väzieb môže byť medzi každým párom komunikačných procesov?
- Aká je kapacita odkazu? Je veľkosť správy, ktorú môže odkaz obsahovať, pevná alebo premenlivá?
- Je odkaz jednosmerný alebo obojsmerný?
Spojenie má určitú kapacitu, ktorá určuje počet správ, ktoré sa v ňom môžu dočasne nachádzať, pričom ku každému odkazu je priradený rad, ktorý môže mať nulovú kapacitu, obmedzenú kapacitu alebo neobmedzenú kapacitu. Pri nulovej kapacite odosielateľ čaká, kým príjemca neoznámi odosielateľovi, že prijal správu. V prípadoch s nenulovou kapacitou proces po operácii odoslania nevie, či bola správa prijatá alebo nie. Na tento účel musí odosielateľ explicitne komunikovať s príjemcom. Implementácia spojenia závisí od situácie, môže to byť buď priame komunikačné spojenie alebo nepriame komunikačné spojenie.
Priame komunikačné prepojenia sa implementujú, keď procesy používajú na komunikáciu špecifický identifikátor procesu, ale je ťažké vopred identifikovať odosielateľa.
Napríklad tlačový server.
Nepriama komunikácia prebieha cez zdieľanú poštovú schránku (port), ktorá pozostáva z frontu správ. Odosielateľ si ponechá správu v poštovej schránke a príjemca si ju vyzdvihne.
Prechádzanie správ Výmena správ.
Synchrónne a asynchrónne odovzdávanie správ:
Proces, ktorý je zablokovaný, je proces, ktorý čaká na nejakú udalosť, ako je sprístupnenie zdroja alebo dokončenie I/O operácie. IPC je možné medzi procesmi na rovnakom počítači, ako aj na procesoch bežiacich na inom počítači, t. j. v sieťovom/distribuovanom systéme. V oboch prípadoch môže alebo nemusí byť proces zablokovaný pri odosielaní správy alebo pri pokuse o prijatie správy, takže odovzdávanie správ môže byť blokujúce alebo neblokujúce. Zvažuje sa blokovanie synchrónne a blokovanie odoslania znamená, že odosielateľ bude zablokovaný, kým správu neprijme príjemca. podobne, blokovanie príjmu má prijímač blokovať, kým nebude k dispozícii správa. Zvažuje sa neblokovanie asynchrónne a Neblokujúce odoslanie znamená, že odosielateľ odošle správu a bude pokračovať. Podobne neblokovaný príjem spôsobí, že príjemca dostane platnú správu alebo nulu. Po dôkladnej analýze môžeme dospieť k záveru, že pre odosielateľa je prirodzenejšie neblokovať po odoslaní správy, pretože môže vzniknúť potreba poslať správu rôznym procesom. Odosielateľ však očakáva od príjemcu potvrdenie v prípade, že odoslanie zlyhá. Podobne je prirodzenejšie, že prijímač je blokovaný po vydaní prijatia, pretože informácie z prijatej správy sa môžu použiť na ďalšie vykonávanie. Zároveň, ak odosielanie správy naďalej zlyháva, príjemca bude musieť čakať donekonečna. Preto zvažujeme aj inú možnosť odovzdávania správ. V zásade existujú tri preferované kombinácie:
- Blokovanie odosielania a blokovanie príjmu
- Neblokované odosielanie a neblokované prijímanie
- Neblokované odosielanie a blokovanie prijímania (väčšinou používané)
Pri odosielaní priamych správ , Proces, ktorý chce komunikovať, musí explicitne pomenovať príjemcu alebo odosielateľa komunikácie.
napr. odoslať (p1, správa) znamená poslať správu na p1.
podobne, prijať (p2, správa) znamená prijať správu od p2.
Pri tomto spôsobe komunikácie sa komunikačné spojenie nadväzuje automaticky, ktoré môže byť buď jednosmerné alebo obojsmerné, ale jeden spoj môže byť použitý medzi jedným párom odosielateľa a prijímača a jeden pár odosielateľa a prijímača by nemal mať viac ako jeden pár. odkazy. Môže byť tiež implementovaná symetria a asymetria medzi odosielaním a prijímaním, t. j. buď sa oba procesy budú navzájom pomenovať na odosielanie a prijímanie správ, alebo iba odosielateľ pomenuje príjemcu na odoslanie správy a nie je potrebné, aby príjemca menoval odosielateľa pre prijatie správy. Problémom tohto spôsobu komunikácie je, že ak sa zmení názov jedného procesu, tento spôsob nebude fungovať.
V nepriamom odovzdávaní správ , procesy využívajú poštové schránky (označované aj ako porty) na odosielanie a prijímanie správ. Každá poštová schránka má jedinečné ID a procesy môžu komunikovať iba vtedy, ak zdieľajú poštovú schránku. Prepojenie sa vytvorí iba vtedy, ak procesy zdieľajú spoločnú poštovú schránku a jeden odkaz môže byť spojený s mnohými procesmi. Každá dvojica procesov môže zdieľať niekoľko komunikačných liniek a tieto linky môžu byť jednosmerné alebo obojsmerné. Predpokladajme, že dva procesy chcú komunikovať prostredníctvom nepriameho odovzdávania správ, požadované operácie sú: vytvoriť poštovú schránku, použiť túto schránku na odosielanie a prijímanie správ, potom schránku zničiť. Štandardné použité primitíva sú: poslať správu) čo znamená poslať správu do schránky A. Rovnako funguje aj primitívum pre príjem správy napr. prijaté (A, správa) . Vyskytol sa problém s implementáciou tejto poštovej schránky. Predpokladajme, že existujú viac ako dva procesy zdieľajúce rovnakú poštovú schránku a predpokladajme, že proces p1 posiela správu do poštovej schránky, ktorý proces bude príjemcom? Dá sa to vyriešiť buď vynútením toho, že iba dva procesy môžu zdieľať jednu poštovú schránku, alebo vynútením toho, že iba jeden proces môže vykonávať príjem v danom čase, alebo náhodným výberom ľubovoľného procesu a informovaním odosielateľa o príjemcovi. Poštovú schránku možno nastaviť ako súkromnú pre jeden pár odosielateľa/príjemcu a možno ju tiež zdieľať medzi viacerými pármi odosielateľa/príjemcu. Port je implementáciou takejto schránky, ktorá môže mať viacero odosielateľov a jedného príjemcu. Používa sa v aplikáciách klient/server (v tomto prípade server je prijímač). Port je vo vlastníctve prijímacieho procesu a vytvorený OS na žiadosť procesu prijímača a môže byť zničený buď na žiadosť toho istého procesora prijímača, keď sa prijímač sám ukončí. Vynútenie toho, že iba jeden proces môže vykonať príjem, sa môže uskutočniť pomocou konceptu vzájomného vylúčenia. Poštová schránka Mutex je vytvorený, ktorý je zdieľaný n procesom. Odosielateľ je neblokujúci a správu odošle. Prvý proces, ktorý vykoná príjem, vstúpi do kritickej sekcie a všetky ostatné procesy budú blokované a budú čakať.
Teraz poďme diskutovať o probléme producent-spotrebiteľ pomocou konceptu odovzdávania správ. Výrobca vkladá položky (vo vnútri správ) do poštovej schránky a spotrebiteľ môže spotrebovať položku, ak je v poštovej schránke aspoň jedna správa. Kód je uvedený nižšie:
Kód výrobcu
C
void> Producer(>void>){> > >int> item;> >Message m;> > >while>(1){> > >receive(Consumer, &m);> >item = produce();> >build_message(&m , item ) ;> >send(Consumer, &m);> >}> >}> |
>
>
Spotrebiteľský zákonník
C
void> Consumer(>void>){> > >int> item;> >Message m;> > >while>(1){> > >receive(Producer, &m);> >item = extracted_item();> >send(Producer, &m);> >consume_item(item);> >}> >}> |
>
>
Príklady IPC systémov
- Posix: používa metódu zdieľanej pamäte.
- Mach : používa odovzdávanie správ
- Windows XP: používa odovzdávanie správ pomocou miestnych procedurálnych volaní
Komunikácia v architektúre klient/server:
Existujú rôzne mechanizmy:
- Rúra
- Zásuvka
- Vzdialené procedurálne volania (RPC)
Vyššie uvedené tri metódy budú diskutované v neskorších článkoch, pretože všetky sú dosť koncepčné a zaslúžia si vlastné samostatné články.
Referencie:
- Koncepcie operačného systému od Galvina a kol.
- Poznámky k prednáške/ppt Ariela J. Franka, Bar-Ilan University
Medziprocesová komunikácia (IPC) je mechanizmus, prostredníctvom ktorého môžu procesy alebo vlákna navzájom komunikovať a vymieňať si údaje na počítači alebo cez sieť. IPC je dôležitým aspektom moderných operačných systémov, pretože umožňuje rôznym procesom spolupracovať a zdieľať zdroje, čo vedie k zvýšeniu efektivity a flexibility.
Výhody IPC:
- Umožňuje procesom vzájomnú komunikáciu a zdieľanie zdrojov, čo vedie k zvýšeniu efektivity a flexibility.
- Uľahčuje koordináciu medzi viacerými procesmi, čo vedie k lepšiemu celkovému výkonu systému.
- Umožňuje vytváranie distribuovaných systémov, ktoré môžu pokrývať viacero počítačov alebo sietí.
- Môže byť použitý na implementáciu rôznych synchronizačných a komunikačných protokolov, ako sú semafory, potrubia a zásuvky.
Nevýhody IPC:
- Zvyšuje zložitosť systému, čo sťažuje návrh, implementáciu a ladenie.
- Môže predstavovať slabé miesta v zabezpečení, pretože procesy môžu mať prístup k údajom patriacim iným procesom alebo ich upravovať.
- Vyžaduje starostlivé riadenie systémových prostriedkov, ako je pamäť a čas CPU, aby sa zabezpečilo, že operácie IPC neznížia celkový výkon systému.
Môže viesť k nekonzistentnosti údajov, ak sa viaceré procesy pokúšajú o prístup alebo úpravu rovnakých údajov súčasne. - Celkovo možno povedať, že výhody IPC prevažujú nad nevýhodami, keďže ide o nevyhnutný mechanizmus pre moderné operačné systémy a umožňuje procesom spolupracovať a zdieľať zdroje flexibilným a efektívnym spôsobom. Je však potrebné dbať na to, aby ste navrhli a implementovali IPC systémy opatrne, aby ste sa vyhli potenciálnym bezpečnostným zraniteľnostiam a problémom s výkonom.
Viac referencií:
http://nptel.ac.in/courses/106108101/pdf/Lecture_Notes/Mod%207_LN.pdf
https://www.youtube.com/watch?v=lcRqHwIn5Dk