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.