Hodnocení: 15/15 bodů
Zadání je inspirováno knihou Allen B. Downey: The Little Book of Semaphores
Santa Claus spí ve své dílně na severním pólu a může být vzbuzen pouze
- ve chvíli, kdy jsou všichni jeho sobi zpět z letní dovolené
- někteří z jeho skřítků mají problém s výrobou hraček a potřebují pomoci
Aby se Santa Claus prospal, skřítci čekají potichu před dílnou. Ve chvíli, kdy čekají alespoň 3, tak první 3 z fronty najednou vstoupí do dílny. Ostatní skřítci, co potřebují pomoci musí čekat před dílnou až bude volno. Ve chvíli, kdy přijde poslední sob z dovolené je pomoc čekajícím skřítkům možné odložit. Santa dává na dveře dílny nápis „Vánoce – zavřeno“ a jde zapřahat soby do saní. Všichni skřítci, co čekají před dílnou ihned odcházejí na dovolenou. Ostatní skřítci odchází na dovolenou ve chvíli, kdy potřebují pomoc od Santy a zjistí, že je dílna zavřená.
$ ./proj2 NE NR TE TR
- NE: počet skřítků. 0<NE<1000
- NR: počet sobů. 0<NR<20
- TE: Maximální doba v milisekundách, po kterou skřítek pracuje samostatně. 0<=TE<=1000
- TR: Maximální doba v milisekundách, po které se sob vrací z dovolené domů. 0<=RE<=1000
- Všechny parametry jsou nezáporná celá čísla
- Pokud některý ze vstupů nebude odpovídat očekávanému formátu nebo bude mimo povolený rozsah, program vytiskne chybové hlášení na standardní chybový výstup, uvolní všechny dosud alokované zdroje a ukončí se s kódem (exit code) 1
- Pokud selže některá z operací se semafory, nebo sdílenou pamětí, postupujte stejně-- program vytiskne chybové hlášení na standardní chybový výstup, uvolní všechny dosud alokované zdroje a ukončí se s kódem (exit code) 1
- Každý proces vykonává své akce a současně zapisuje informace o akcích do souboru s názvem proj2.out. Součástí výstupních informací o akci je pořadové číslo A prováděné akce (viz popis výstupů). Akce se číslují od jedničky
- Použijte sdílenou paměť pro implementaci čítače akcí a sdílených proměnných nutných pro synchronizaci
- Použijte semafory pro synchronizaci procesů
- Nepoužívejte aktivní čekání (včetně cyklického časového uspání procesu) pro účely synchronizace
- Pracujte s procesy, ne s vlákny
- Hlavní proces vytváří ihned po spuštění jeden proces Santa, NE procesů skřítků a NR procesů sobů
- Poté čeká na ukončení všech procesů, které aplikace vytváří. Jakmile jsou tyto procesy ukončeny, ukončí se i hlavní proces s kódem (exit code) 0
- Po spuštění vypíše:
A: Santa: going to sleep
- Po probuzení skřítky jde pomáhat elfům--vypíše:
A: Santa: helping elves
- Poté, co pomůže skřítkům jde spát (bez ohledu na to, jestli před dílnou čekají další skřítci) a vypíše:
A: Santa: going to sleep
- Po probuzení posledním sobem uzavře dílnu a vypíše:
A: Santa: closing workshop
a pak jde ihned zapřahat soby do saní - Ve chvíli, kdy jsou zapřažení všichni soby vypíše:
A: Santa: Christmas started
a ihned proces končí
- Každý skřítek je unikátně identifikován číslem elfID. 0<elfID<=NE
- Po spuštění vypíše:
A: Elf elfID: started
- Samostatnou práci modelujte voláním funkce usleep na náhodný čas v intervalu <0,TE>
- Když skončí samostatnou práci, potřebuje pomoc od Santy. Vypíše:
A: Elf elfID: need help
a zařadí se do fronty před Santovou dílnou - Pokud je třetí ve frontě před dílnou, dílna je prázdná a na dílně není cedule „Vánoce – zavřeno“, tak společně s prvním a druhým z fronty vstoupí do dílny a vzbudí Santu.
- Skřítek v dílně dostane pomoc a vypíše:
A: Elf elfID: get help
(na pořadí pomoci skřítkům v dílně nezáleží) - Po obdržení pomoci ihned odchází z dílny a pokud je dílna již volná, tak při odchodu z dílny může upozornit čekající skřítky, že už je volno (volitelné)
- Pokud je na dveřích dílny nápis „Vánoce – zavřeno“ vypíše:
A: Elf elfID: taking holidays
a proces ihned skončí
- Každý sob je identifikován číslem rdID, 0<rdID<=NR
- Po spuštění vypíše:
A: RD rdID: rstarted
- Čas na dovolené modelujte voláním usleep na náhodný interval <TR/2,TR>
- Po návratu z letní dovolené vypíše:
A: RD rdID: return home
a následně čeká, než ho Santa zapřáhne k saním. Pokud je posledním sobem, který se vrátil z dovolené, tak vzbudí Santu - . Po zapřažení do saní vypíše:
A: RD rdID: get hitched
a následně proces končí
- Projekt implementujte v jazyce C. Komentujte zdrojové kódy, programujte přehledně. Součástí hodnocení bude i kvalita zdrojového kódu
- Kontrolujte, zda se všechny procesy ukončují korektně a zda při ukončování správně uvolňujete všechny alokované zdroje
- Dodržujte syntax zadaných jmen, formát souborů a formát výstupních dat. Použijte základní skript pro ověření korektnosti výstupního formátu (dostupný z webu se zadáním)
- Dotazy k zadání: Veškeré nejasnosti a dotazy řešte pouze prostřednictvím diskuzního fóra k projektu 2
- Poznámka k testování: Můžete si nasimulovat častější přepínání procesů například vložením krátkého uspání po uvolnění semaforů apod. Pouze pro testovací účely, do finálního řešení nevkládejte!
- Pro překlad používejte nástroj make. Součástí odevzdání bude soubor Makefile
- Překlad se provede příkazem make v adresáři, kde je umístěn soubor Makefile
- Po překladu vznikne spustitelný soubor se jménem
proj2
, který bude umístěn ve stejném adresáři jako soubor Makefile - Zdrojové kódy překládejte s přepínači
-std=gnu99 -Wall -Wextra -Werror -pedantic
- Pokud to vaše řešení vyžaduje, lze přidat další přepínače pro linker (např. kvůli semaforům či sdílené paměti, -pthread, -lrt , . . . )
- Vaše řešení musí být možné přeložit a spustit na serveru merlin