Meziprocesová komunikace, roury, sdílená paměť, semafory, zasílaní zpráv - implementace. 

Řada aplikací se skládá z mnoha spolupracujících procesů. Ty mezi sebou komunikuje a sdílejí informace.

Jádro OS musí poskytovat mechanismy, které to umožní – nazýváme je prostředky meziprocesové komunikace. Jejich účelem je:

Přenos údajů

Sdílení prostředků

Sledování a sdílení běhu procesu, např. při ladění programu

Umožňují oznámení procesům o asynchronní události

Viz otázka „Signály“

Zápis dat na konec roury, čtení dat od začátku

Vytvoření systémovým voláním pipe() – vrací dva deskriptory, jeden pro čtení, druhý pro zápis

Při vytváření procesů jsou deskriptory roury děděné

do roury může zapisovat i číst z ní více procesů, data jsou čtena v pořadí, v jakém byla zapsána

Procesy mohou komunikovat prostřednictvím roury, pokud byla vytvořena společným předchůdcem

Po skončení všech předchůdců přestává roura existovat

Perzistentní, existují jako soubory, i když je nepoužívají žádné procesy

FIFO musí být explicitně zrušen, jako obyč soubory – unlink

Oproti obyč souborům jsou přečtená data odstraněna a z pohledu komunikace mají stejnou sémantiku jako nepojmenované roury

Vytvoření FIFO souboru: mknode(cesta, mód, zařízení), mkfifo(cesta, mód)

Mód = obvyklá oprávnění

Zařízení = pro vytváření speciálních souborů pro zařízení

FIFO jsou pak otevřena sys voláním open() – vrací deskriptor souboru

do FIFO jde zapisovat sys voláním write() nebo z něj číst sys voláním read()

Následující způsoby mají podobnou implementaci – jsou identifikovány IPC (inter-process comunication) klíčem (obdoba cesty k souboru) a zpřístupňovány identifikátory IPC (obdoba deskriptoru souboru) – ty nejsou vázány na proces a nemění se v průběhu života objektu; získání identifikátoru IPC voláním shmget(), semget(), msgget()

Sdílená paměť

Oblast paměti, která je sdílená více procesy

Sdílená data jsou v paměti fyzicky uložena jen jednou, procesy je mají namapované do vlastního virtuálního paměťového prostoru (např. Používají DLL)

Proces ji vytvoří/získá voláním shmid = shmget(klíč, velikost, příznak);

Proces připojí oblast na virtuální adresu voláním:
adr = shmat(shmid, shmadr, shmpříznak);

„shared memory at“ 

shmadr je návrh adresy pro připojení oblasti; pokud je shmadr nula, jádro adresu vybere

skutečná adresa je návratová hodnota

Semafory  - synchronizační primitivum s celočíselným čítačem a metodami P() a V()

semid = semget(klíč, počet, příznak)

vrátí identifikátor pole semaforů o velikost počet

atomicky vykoná operace nad polem semaforů

Procesy komunikují prostřednictvím zpráv

Zpráva vytvořená procesem je zaslána do fronty zpráv, je tam, dokud ji jiný proces nepřečte

Typ zprávy umožňuje selektivní výběr zpráv z fronty

Proces získá/vytvoří zprávu voláním:

msgqid = msgget(klíč, příznak);

„message queue id“

Zpráva se uloží do fronty voláním:

msgsnd(msgqid, msgp, počet, příznak)

počet = velikost zprávy včetně typu v bytech

zprávy jsou ve frontě v pořadí jejich příchodu

výběr zpráv z fronty voláním:

počet = msgrcv(msgqid, msgp, maxpct, msgtyp, příznak)

je-li čtená zpráva delší než maxpct, je oseknutá

msgtyp záporný à vrátí se první zpráva nejnižšího typu než je abs hodnota msgtyp

SendMessage(HWND okna, int message, WPARAM. LPARAM) - blokující, čeká na vyzvednutí zprávy

Každé okno má svou smyčku zpráv while(GetMessage(..)) - blokující
