Do not adjust to the system. Adjust the system!
OSY - požadavky pro absolvování předmětu
Prezenční forma studia - zimní semestr 2023/24
Za zkoušku a zápočet může každý student obdržet maximálně 100 bodů.
Ty budou rozděleny na 45 bodů za zápočet a 55 bodů za zkoušku.
Zkouška
Zkouška bude složena ze dvou částí: programování a teorie.
Za programování bude možno získat 25 bodů (min. 13)
a za teoretické znalosti 30 bodů (min. 15.).
Programování bude na učebně, na školním počítači a bude k dispozici jen OS Linux,
stejný jako bude během semestru na učebnách.
Nebude k dispozici internet a ani domovský uživatelský adresář.
Dostupný bude jen archiv ukázkových programů, manuálové stránky a
dokumentace C++ Reference.
Na programování bude čas 100 minut.
Programy budou zaměřeny na využití procesů, vláken, souborů, rour, soketů, semaforů a sdílené paměti.
Hodnoceno bude nejen správné fungování programu, ale i způsob řešení.
Teoretická část zkoušky bude ústní formou u tabule, kdy bude potřeba zodpovědět cca 3 otázky
a délka této zkoušky bude cca 20 minut. Pořadí zkoušení bude podle pořadí úspěšného odevzdání programů.
Pro zkušku budou vypány 3 termíny.
Obsah teoretické části viz níže.
Zápočet
Pro zápočet je nutno získat z 45 bodů (min. 23).
Cvičení budou rozdělena do třech bloků:
- Soubory a procesy - 5 cvičení hodnoceno 15 body (min. 8).
- IPC: meziprocesní komunikace - 5 cvičení hodnoceno 20 body (min. 10).
- Free RTOS - 3 cvičení hodnoceny 10 body (min. 5).
Náhradní cvičení budou řešena individuálně a to jen v opodstatněných případech, např. nemoc, vyšší moc a pod.
Opravy cvičení nebudou. Během semestru bude celkové bodové hodnocení cvičení rozšířeno cca o 15% a je tak možno získat dostatek bodů.
Obsah teoretické části zkoušky
- Kapitola
- 1.1 Co je operační systém.
- Z kapitoly 1.2 pojmy: dávka, dávkový systém, multiprogramování, spooling, sdílení času.
- 1.3 Koncepce OS, procesy a soubory.
- 1.4 Systémová volání. Rozšíření o skupiny funkcí ze cvičení.
- Kapitola
- 2.1, 2.1.1 Úvod do procesů, model procesu, stavy procesu.
- 2.1.2 Implementace procesů, vlákna (pouze implementovaná systémem).
- 2.2, 2.2.1, 2.2.2, IPC, souběh (race condition), kritická sekce, podmínky dobrého řešení.
- 2.2.3, Vzájemné vyloučení: zákaz přerušení, zamykací proměnná, TLS.
- 2.2.4, 2.2.5, Uspání a probuzení, semafor, monitor, fronta zpráv.
- 2.3 Klasické IPC problémy: výroba a spotřeba, spící holič, večeřící filozofové, čtenáři a spisovatelé.
- 2.4 Plánování procesů.
- Kapitola
- 3.1, 3.1.1 Principy V/V
- 3.2 Principy V/V, rozdělení do vrstev, úkoly jednotlivých vrstev.
- 3.3 Deadlock, co to je, jak může vzniknout, podmínky zablokování, dá se řešit?
- Kapitola
- 4.2.1, 4.2.2, Implementace správy paměti.
- 4.3 Virtuální paměť, stránkování, jedno a víceúrovňové tabulky stránek.
- 4.4.x Výměna stránek.
- 4.6 Segmentace, účel, návaznost na virtuální paměť.
Projděte si následujáci desatero a pokud více bodům nerozumíte,
nemá smysl se hlásit k praktické části zkoušky.
Přitom v mnoha případech nejde o neznalost témat předmětu OSY.
- Pole znaků char znaky[ N ]; lze indexovat: znaky[ i ].
Pointer char *odkaz; není inicializovaný.
- Rozdělit proud dat na jednotlivé řádky patří mezi základní programátorské dovednosti.
Stejně tak i rozdělit řetězec/řádek na slova.
- Funkce *printf a *scanf představují v programu užitečný nástroj.
Funkce str*, např. strcpy, strcat, strstr, strtok patří mezi základní
funkce pro práci s řetězci a je vhodné si je vyzkoušet už před zkouškou.
Pokud ovšem nepreferujete použití třídy string.
- Jak předat data do vlákna není tajemství, které se dědí z generace na generaci jen
mezi členy zednářské lóže.
Po funkci fork() je nutno vědět, který proces je rodič a který potomek.
A oba tyto procesy mají povinnost zavřít ty souborové deskriptory, které nebudou dále používat.
- Pro správné používání semaforu je nutné ho i správně inicializovat.
Jen použití funkce sem_open na to často nestačí.
- Po volání funkce ret = read( fd, buf, sizeof( buf ) ); je počet načtených bajtů
návratová hodnota, pokud je to číslo větší než 0.
Pokud jsou načtená data znaky, není buf korektní řetězec, který lze použít ve funkcích
str*, *printf a pod., dokud nejsou načtené znaky ukončeny ukončovacím znakem řetězce '\0'.
- Použít write( fd, buf, sizeof( buf ) ) není ve většině případů dobrý nápad.
- Zkouška není vhodný čas pro seznamování se s příklady na githubu, ale čas použít je.
- Objevit příkaz man až u zkoušky, je pozdě.
- Program strace a gdb jsou užitečné nástroje, které často a rychle
pomohou najít chybu.
Ukázka zadání z předchozích let.
Soketový server vždy využívá procesy nebo vlákna.
-
Síťový semafor. Server si vytvoří semafor a od klienta přijímá příkazy "UP" a "DOWN" a
odpovídá na ně "UP-OK" nebo "DOWN-OK".
-
Server hraje simultánku se třemi klienty. Klienti se připojí a posílají na server např. jednoduché matematické
příklady: "1+3", "38*22", ... a sever vždy odpoví jednomu klientu na 10 dotazů a pak se věnuje dalšímu.
Přepínání pomocí 3 semaforů.
-
Internetový prohlížeč zašle na sever příkaz: "ls -la /etc" ve tvaru "http://localhost:port/ls*-la*/etc", kde "*" je oddělovač.
Server přijme request: "GET /ls*-la*/etc HTTP/1.1" a je potřeba text mezi GET a HTTP interpretovat jako příkaz
s parametry, provést v potomkovi pomocí exec a výstup přesměrovat do soketu.
Semafor hlídá, aby se prováděl v jeden okamžik jen jediný příkaz.
Příklad HTTP Respose hlavičky bude v zadání. Příklad najdete ve svém prohlížeči v "develop tools".
- Remote shell. Podobně jako předchozí příklad, jen příkaz bude zadán z textového klienta,
na serveru interpretován a výstup přesměrován do soketu.
Přijatá data klient zobrazí i uloží do souboru.
- Klient otevře soubor, zašle na sever jeho délku, server příjem potvrdí a klient odešle celý soubor.
Server data přijme do bufferu známé délky a pak odešle zpět s očíslovanými řádky.
Klient data přijme a uloží. Posílaný soubor musí být minimálně zdrojový kód serveru.
Pomocí semaforu se hlídá, aby server v jednom okamžiku přijímal a zpracovával pouze jeden soubor.
-
Piškvorky. Server přijme spojení se dvě klienty, ostatní odmítá.
Vytvoří ve sdílené paměti hrací pole a klienti zasílají své tahy ve tvaru "Z-C\n", jako Znak a Číslo.
Server posílá klientům zpět stav hracího pole. Střídání klientů řeší dvojice semaforů.
- Chat. Soketový server s vlákny bude pracovat jako chat pro více klientů.
Seznam připojených klientů bude v poli, nepřipojení klienti jsou -1 a práce s polem bude hlídaná semaforem.
-
Soketový server slouží jako zdroj obrázku pro HTTP klienta. Na serveru je připraven obrázek ve velikosti 100/80/60/40/20%
jako soubory "obrazek-40.png" a pod.
Prohlížeč zašle na sever požadavek "http://localhost:port/pic-obrazek-PP" a server obdrží request "GET /pic-obrazek-PP HTTP/1.0",
kde PP je číslo od 0 do 100%.
Server vybere obrázek v nejbližší velikosti a pošle zpět pomocí přesměrování příkazu "cat obrazek-pp.png".
Příklad HTTP Respose hlavičky bude v zadání. Příklad najdete ve svém prohlížeči v "develop tools".