Table of Contents

HW 9 - Vícevláknová aplikace s meziprocesovou komunikací

Termín odevzdání 21.05.2024@23:59 PDT
Povinné zadání 6b
Volitelné zadání Není
Bonusové zadání HW 9B
Počet uploadů 20
Výchozí soubory bab36prga-hw9.zip

Cílem úlohy je získat zkušenost s využitím pojmenované roury pro komunikaci aplikace v počítači s poskytnutým Modulem a práci s více vlákny pro zpracování více zdrojů událostí.

Program vychází ze cvičení 10 pojmenovanou rourou a více-vláknové aplikace.
Specifikum práce s pojmenovanou rourou je, že při otevření souboru (roury) pro zápis musí být roura otevřena pro čtení, aby bylo kam případně ukládat data. Proto je volání io_open_write() blokované. Řešením je tak spustit program výpočetního modulu ./binaries/bab36prga-hw9-module nebo vyčítání roury programem tail -f /tmp/prga-hw9.in.

Povinné zadání

Realizujte program, kterým bude řízeno blikání LED v Modulu.
Program musí obsahovat následující funcionality:

Pro výpis využijte přepisování řádku znakem '\r'. Po odeslaní znaku 's' a 'e' je stav LED (on nebo off) nastaven až po přijeti potvrzovacího znaku 'a'.

Důležitou částí je organizace kódu a dedikování jednotlivých vláken pro 1) čtení z klávesnice; 2) překreslování řádku, 3) čtení z roury; 4) měření periody blikání LED jednou za 5 sekund; případně další hlavní vlákno v boss/worker modelu.
Implementačně (na počet řádků) náročnější variantou je realizovat v program frontu zpráv a řešit logiku programu v rámci hlavního vlákna, které přijímá zprávy od ostatních vláken a realizuje příslušné výstupy (tj. pojmenovaná roura a textový výstup na stdout. Benefitem takto organizovaného programu je snadné rozšíření.
Jednodušší variantou je dedikovat zápis do roury vláknu pro čtení vstupu z klávesnice a notifikace překreslování z jednolivých vláken na základě přijaté události (tak jako v programu na přednášce 11 - bab36prga-lec11-codes.zip.
Komunikace mezi aplikací a Modulem

Dále Modul v případě, že periodicky bliká LED, vysílá znak 'x' při rozsvícení LED a znak 'o' při zhasnutí LED.

Doporučený postup (bez hlavní fronty zpráv)

Program obsluhuje dva zdroje asynchronních událostí - z klavesnice a z modulu. Pro každý takový zdroj je výhodné realizovat samostatné vlákno, které řeší konkrétní vstup. Kromě toho můžeme identifikovat proces počítání periody na základě přijatých zpráv z Modulu, ze kterých počítáme průměrnou periodu za 5 sekund, což můžeme realizovat samostatným vláknem, které periodicky po 5 sekundách spočítá průměr. V neposlední řadě máme společný sdílený prostředek, kterým je výstup na terminál v podobě stavového řádku, to můžeme realizovat jako sdílený přístup ke zdroji prostřednictvím zámku (mutexu), nicméně pak by každé vlákno musele vypisovat celý řádek. Proto může být výhodnější realizovat samostnatné vlákno, které bude vypisovat stav aplikace pokud dojde k nějaké změně (realizujeme jako čekání na podmíněnou proměnnou conditional variable. Dalším sdíleným prostředkem je zasílání zpráv modulu, nicméně z principu funkce programu se to děje pouze po uživatelské interakce, tj. stisku klávesy. Program tak realizujeme Boss/worker architekturou, kde hlavní vláknou vytvoří jednotlivá vlákna a následně bude čekat na jejich ukončení, podobně jako v příkladu z přednášky 11.

Sdílená datová struktura

Mezi vlákny můžeme sdílet společnou strukturu, ve které budeme mít informace potřebné k výpisu na stdout, tj. stav LED, poslední odeslaný znak, poslední přijatý znak, odhadnutá perioda blikání. Dále pak informaci o požadavkuna ukončení programu, tak abychom korektně ukončili všechna vlákna, informaci o počtu přijatých bliknutích LED, případně odkazy na soubory pro čtení a zápis (file descriptor) pojmenované roury pro čtení a zápis realizující komunikaci s Modulem, to pokud otevření souborů realizujeme v hlavním vlákně, což může být výhodné, pokud se otevření nezdaří, nebudeme ani ostatní vlákna pouštět. Dále též proměnnou typu mutex a podmíněnnou proměnnou pro synchronizaci vláken.

Hlavní vlákno

Vlákno obsluhy klávesnice

Vlákno obsluhy zpráv z Modulu

Pokud v našem programu čekáme na stisk klávesy v blokovaném režimu prostřednictvím getchar(), byť bez nutnosti potvrzovat přes enter. Proto pokud dojde k chybě čtení, nemáme možnost jak vklákno obsluhy klávesnice odblokovat. V našem případě je to akceptovatelný design choice. Případně můžeme řešit např. načítáním s timeoutem.

Vlákno periodického výpočtu

V případě požadavku ukončení programu, vlákno reaguje až po probuzení. Proto se ukončení programu může zpozdit až o 5 sekund. Opět je to v našem případě akceptovatelné - Design choice.

Vlákno výstupu

Doporučený postup (s hlavní frontou zpráv)

Celkově vede řešení s frontou zpráv typicky na delší kód, ve které bude pravděpodobně jedna velká dlouhá funkce obsluhy událostí z fronty zpráv. Nicméně výhodou je relativní přehlednost a minimální potřeba použití synchronizačních primit pro komunikaci mezi vlákny, což může být výhodné z hlediska rozšiřování programu a případně jeho pozdější údržbě.

Odevzdání a hodnocení

Program pokud možno realizujte na cvičení, nahrajte do odevzdávacího systému. Funkčnost programu ověří učitel na cvičení nebo na dalším cvičení.

Povinné zadání
Název v BRUTE HW9
Odevzdávané soubory prga-hw9-main.c
Argumenty při spuštění žádné
Procvičované oblasti vlákna, pojmenovaná roura