Operační systémy 2 - Další úlohy (úkoly)

Linux


Úkol č. 1: Procesy a roury
Napište program, který bude implementovat metaznak shellu |. Program bude akceptovat neomezený počet argumentů (minimálně 2, zapsány v uvozovkách) - programy včetně jejich argumentů. Vstup prvního programu bude brán ze standardního vstupu, výstup prvního programu pošle na vstup druhého, výstup druhého na vstup třetího, atd., výstup posledního bude zaslán na standardní výstup. Tj. výstup např. vas_program "echo -e '3\n1\n2'" "grep -v 1" bude stejný, jako výstup echo -e '3\n1\n2' | grep -v 1. Pro spuštění programů (argumentů) použijte funkci fork v kombinaci s některou z funkcí exec.

Úkol č. 2: Procesy a jejich synchronizace, sdílená paměť
Napište malý komunikační program. Program vytvoří potomka a jeden proces bude zapisovat do sdílené paměti a druhý z ní bude číst. Paměť bude mít dva řádky. Zapisovací proces bude v nekonečné smyčce číst řádky od uživatele a pro každý řádek zapíše na první řadek paměti vstup od uživatele a na druhý číslo řádku. Čtecí proces bude v nekonečné smyčce vypisovat první řádek paměti, ale jenom pokud bude číslo na druhém řádku jiné než z předchozího čtení. Všechny instance tohoto programu (program může být spuštěn vícekrát) budou používat tutéž sdílenou paměť. Řešení musí být neomezené na počet instancí programu, tj. počet čtenářů i písařů. Všechny procesy synchronizujte semafory (pro procesy) tak, aby když libovolný z paměti čte, žádný jiný nemohl zapisovat, ale číst ano, a když libovolný zapisuje, žádný jiný nemohl ani číst ani zapisovat, tzn. ošetřete přístup ke sdílené paměti. Program se ukončí ukončením vstupu (tzn. např. funkce feof vrátí nenulové číslo).

Úkol č. 3: Vlákna a jejich synchronizace
Napište program na vyhledávání vzorku v souboru. Soubor bude zadán jako parametr programu. Vytvoříte nové vlákno, které bude v nekonečné smyčce vyhledávat vzorek uložený v gobální proměnné a vypisovat čísla řádků (každé číslo na samostatný řádek), na kterých se vzorek vyskytuje. Vlákno bude blokováno (pomocí condition variable), pokud bude vzorek prázdný nebo prohledávání vzorku dospěje na konec souboru. Změna vzorku musí být možná kdykoliv během vyhledávání vzorku v souboru a způsobí okamžité vyhledávání nového vzorku znovu od začátku souboru. Proměnná indikující změnu vzorku bude také globální. Původní vlákno programu bude v nekonečné smyčce číst řádky od uživatele (budou obsahovat jen několik málo písmen) a obsah každého řádku (písmena) přidá na konec vzorku. Prázdný vstupní řádek způsobí vymazání vzorku. Uvědomte si, že obě vlákna přistupují k týmž globálním proměnným, proto musí být přístup k těmto proměnným v obou vláknech ošetřen pomocí semaforu (pro vlákna) nebo mutexu. Program se ukončí ukončením vstupu.

Úkol č. 4: Vlákna a jejich synchronizace
Napište program demonstrující klasický synchronizační problém spícího holiče. Program bude mít 3 číselné parametry, maximální počet zákazníků v holičství, počet židliček pro čekající a počet holičů (stejný jako počet křesel). Kromě původního vlákna budou v programu spouštěny další dva typy vláken, holič a zákazník. Holič bude v nekonečném cyklu stříhat zákazníka (vypíše řádek ve tvaru číslo holiče, dvojtečka, mezera a slovo strihani), přijímat od něj platbu (výpis se slovem platba) s vydáním potvrzení (slovo paragon) a spát, tedy čekat na zákazníka (slovo spani). Zákazník vejde do holičství (vypíše řádek ve tvaru číslo zákazníka, dvojtečka, mezera a slovo prichod), pokud tam není již maximální počet zákazníků, jinak čeká. Pokud je volná židlička, usedne na ni (výpis se slovem zidle), jinak čeká. Až je volný holič, usedne do křesla (slovo strihani) a čeká na ostříhání. Po ostříhání holiči zaplatí (slovo platba), přijme potvrzenío platbě (slovo paragon) a opustí holičství (slovo odchod). Vlákna holiče a zákazníka synchronizujte semafory a/nebo mutexy. Původní vlákno programu vytvoří zadaný počet vláken holičů a pak bude v nekonečném cyklu číst řádky od uživatele. Každý řádek bude obsahovat jedno číslo, udávající počet zákazníků. Tyto zákazníky vytvoří jako nová vlákna. Program se ukončí ukončením vstupu.

Úkol č. 1': Procesy
(jen pro kombinovanou formu studia)
Napište program, který vytvoří potomka (pomocí funkce fork v kombinaci s některou z funkcí exec) a udělá z něj zombie. Vypište pid rodiče i potomka. Změňte prioritu zombie. V rodiči si pak pomocí programu ps (spuštého jako další potomek) ověřte, že potomek je skutečně zombie a že má nenulovou hodnotu nice (zadejte patřičné parametry programu ps). Nakonec si potomka "vyzvedněte" a vypište jeho návratový kód. Nezapomeňte všechny procesy korektně ukončit!

Úkol č. 2': Vlákna
(jen pro kombinovanou formu studia)
Napište program, ve kterém vytvoříte dvě nová vlákna, jedno joinable a jedno detached. Hlavní funkce joinable vlákna bude mít tři parametry, první dva budou řetězce, do třetího se uloží řetězec, který vznikne spojením těchto dvou řetězců. Po ukončení joinable vlákna vypište jeho návratovou hodnotu. V detached vlákně vytvořte kritickou sekci.

Windows


Úkol č. 1: Procesy a nepojmenované roury
Stejné zadání jako úkol č. 1 pro Linux. Samozřejmě zde neplatí použití funkcí fork a exec. Testovat správnou funkčnost svého programu můžete pomocí windows portů základních programů v linuxu jako jsou např. echo, grep, sed, awk, wc.

Úkol č. 2: Procesy, vlákna a jejich synchronizace, mapování souboru
Stejné zadání jako úkol č. 2 pro Linux. Místo čtecího a zapisovacího procesu zde budou vlákna a místo sdílené paměti mapovaný soubor.

Úkol č. 3: Vlákna a jejich synchronizace
Stejné zadání jako úkol č. 3 pro Linux. Vlákno nebude blokováno, ale pozastaveno (pomocí funkce SuspendThread). Přístup ke globálním proměnným může být ošetřen i pomocí kritické sekce.

Úkol č. 4: Vlákna a jejich synchronizace
Stejné zadání jako úkol č. 4 pro Linux. Vlákna mohou být synchronizována i pomocí kritické sekce.

Úkol č. 1': Procesy
(jen pro kombinovanou formu studia)
Napište program, který vytvoří potomka s prioritou jinou než defaultní a s novou konzolou, které nastavíte nějaký titulek. Vypište pid rodiče i potomka. Potomka ukončete pomocí funkce TerminateProcess a po jeho ukončení vypište jeho návratový kód.

Úkol č. 2': Vlákna
(jen pro kombinovanou formu studia)
Napište program, ve kterém vytvoříte nové vlákno. Vlákno vytvořte jako pozastavené. Změňte prioritu vytvořeného vlákna (pomocí SetThreadPriority) a pak jej spusťte. Hlavní funkce vlákna bude mít tři parametry, první dva budou řetězce, do třetího se uloží řetězec, který vznikne spojením těchto dvou řetězců. Po ukončení vlákna vypište jeho návratovou hodnotu.


http://phoenix.inf.upol.cz/~outrata/, outrata@phoenix.inf.upol.cz
Jan Outrata, generováno: 7.1.2013