# A. Úvodné informácie Dívate sa na poznámky k prednáškam pre PB152. Všetko, čo potrebujete vedieť na úspešné absolvovanie predmetu (mimo seminára, ktorý tvorí samostatný predmet - PB152cv) je obsiahnuté v tomto dokumente. Prednášky pokrývajú rovnaké materiály v inom formáte (slidy, ktoré vidíte v tomto dokumente sú rovnaké slidy, ktoré sú použité v prednáškach). │ Testy a skúška │ │ • 3 krátke priebežné testy (každý na 4 prednášky) │ ◦ 2 opakovacie otázky na prednášku (8 dokopy) │ ◦ musíte úspešne urobiť 2 z 3 testov (inak X) │ • skúška na záver semestra │ ◦ časť 1: opakovacie otázky │ ◦ časť 2: hĺbkové porozumenie │ • všetky testy sú jedno-priechodové (k odpovediam sa nedá vracať) Na úspešné absolvovanie predmetu potrebujete zložiť aspoň 2 z 3 priebežných testov, ktoré budú prístupné v IS. Každý z týchto testov bude pokrývať 4 prednášky - na každej prednáške dostanete 2 opakovacie otázky (ktoré budú uvedené na konci každej prednášky). Môžete urobiť jednu chybu (tzn. musíte odpovedať na aspoň 7 z 8 otázok správne, aby sa vám test počítal ako úspešný). Ak neuspejete v 2 testoch z 3, dostanete známku X. Ak úspešne zložíte 2 (alebo všetky 3) testy, môžete pristúpiť ku skúške, ktorá bude mať dve časti - prvá bude rovnaká ako priebežné testy, akurát bude obsahovať 12 otázok, jednu z každej prednášky. Takisto môžete urobiť 1 chybu. Ak budete úspešní, pokračujete k druhej časti, ktorá je zameraná na hĺbkové pochopenie látky, a ktorá rozhodne o vašej výslednej známke. Musíte úspešne zložiť obe časti skúšky naraz - ak neuspejete v jednej, musíte znova skladať obe. Všetky testy (tzn. priebežné testy a obe časti skúšky) budú prebiehať v IS-e a budú sa vám zobrazovať po jednej otázke, na ktorú musíte odpovedať, než sa môžete pozrieť na ďalšiu otázku. K odovzdaným otázkam sa nebudete môcť vrátiť. Cvičné testy budú tiež nastavené týmto spôsobom, aby ste si mohli vyskúšať, ako si najlepšie zorganizovať čas. │ Priebežné testy │ │ • 8 otázok, 15 minút, najviac 1 chyba │ • cvičný test 1 týždeň pred tým, neobmedzený počet pokusov │ • kedy – medzi 16:00 a 16:30 v nasledujúce dni: │ ◦ 9. apríl │ ◦ 7. máj │ ◦ 4. jún Priebežné testy budú prebiehať v piatky poobede. Budete mať 4 týždne na naštudovanie si príslušných 4 prednášok, potom 1 týždeň na opakovanie (s pomocou cvičného testu, ak chcete). Cvičný test bude prístupný počnúc predchádzajúcim piatkom, až do momentu kedy začína priebežný test. Cvičný test si môžete skúšať koľkokrát chcete. Dostanete pripomienku emailom o každom priebežnom teste jeden týždeň pred tým, než sa bude konať (v rovnakom čase, kedy sa zverejní cvičný test) a ráno v deň konania testu. │ Skúška │ │ • časť 1: 12 opakovacích otázok, 20 minút │ ◦ 10 alebo menej = F, 11+ = pokračujete na časť 2 │ • časť 2: 12 otázok, 90 minút │ ◦ určte pravdivosť zložitejších tvrdení │ ◦ +1 / -0.5 bodov za otázku │ ◦ 6+ = E, 7+ = D, 8+ = C, 9+ = B, 10+ = A │ • cvičné testy v máji, neobmedzené množstvo pokusov V máji bude sprístupnená cvičná verzia oboch častí. Obe si budete môcť vyskúšať ľubovoľne krát, avšak výber otázok (a odpovedí) bude obmedzený, v porovnaní so skutočnou skúškou. V druhej časti bude každá otázka zložená zo 4 tvrdení (krátky odstavec) o nejakom aspekte operačných systémov. Existujú dva možné scenáre: buď • 3 tvrdenia sú nepravdivé a 1 je pravdivé (v tomto prípade vyberte pravdivé tvrdenie), alebo • 3 tvrdenia sú pravdivé a 1 je nepravdivé (v tomto prípade vyberte nepravdivé tvrdenie). Všetky testy a skúšky budú v češtine, pričom technické výrazy budú tiež zmienené v angličtine (v zátvorke). Ak chcete skladať skúšku v angličtine, kontaktujte ma najneskôr do 19. marca. │ Semináre │ │ • samostatný, voliteľný kurz (kód «PB152cv») │ • venuje sa operačným systémom z praktického hľadiska │ • vyskúšate si veci, o ktorých tu budeme rozprávať │ • ponúka dodatočnú prax s programovaním v C Seminár poskytuje dobrý spôsob získania nejakých praktických skúseností s operačnými systémami. Zameriava sa hlavne na interakciu programov so službami OS, ale tiež pokryje problémy na užívateľskej úrovni, ako virtualizácia, inštalácia OS a písanie shell-ových skriptov. │ Študijné materiály │ │ • «poznámky k prednáškam» sú hlavným učebným textom │ ◦ obsahujú slidy použité v prednáške │ ◦ zväčša samostatné s minimom závislostí │ ◦ anglická verzia je už prístupná v IS-e │ ◦ preložené kapitoly budú zverejnené týždenne │ • «nahrávky prednášok» │ ◦ z behu 2019, ako podporný materiál Čítate poznámky k prednáškam ku kurzu PB152 Operačné Systémy. Toto je váš hlavný učebný zdroj; je založený na prednáškových slidoch, ale s dodatočnými detailmi, ktoré sa do formátu slidov nevošli. Tieto poznámky by mali byť samostatné, v zmysle že sa spoliehajú iba na znalosti, ktoré máte z iných kurzov, ako PB150 Architektury výpočetních systémů (alebo PB151) alebo PB071 Principy nízkoúrovňového programování. Podobne, ovládať témy obsiahnuté v týchto poznámkach je dostatočné na úspešné absolvovanie skúšky. │ Knihy │ │ • existuje niekoľko dobrých kníh o OS │ • je dobrý nápad si ich prečítať │ │ • A. Tanenbaum: Modern Operating Systems │ • A. Silberschatz et al.: Operating System Concepts │ • L. Skočovský: Principy a problémy OS UNIX │ • W. Stallings: Operating Systems, Internals and Design │ • mnoho ďalších, kľudne sa poobzerajte po iných Vyššie zmienené knihy zvyčajne pokrývajú výrazne viac materiálu, než je možné obsiahnuť v jednosemestrálnom kurze. Štúdium operačných systémov je však veľmi dôležité pre mnoho pod-odvetví informatiky, a tiež pre mnoho programovacích disciplín. Akýkoľvek čas naviac, ktorý na tejto téme strávite pravdepodobne nebude na škodu. │ Témy │ │ 1. Anatómia OS │ 2. Systémové knižnice a API │ 3. Jadro (Kernel) │ 4. Súborové systémy │ 5. Základné zdroje a multiplexing │ 6. Súbežnosť a zamykanie V prvej polovici semestra sa budeme zaoberať základnými komponentami a abstrakciami, ktoré sú prítomné v univerzálnych (general-purpose) operačných systémoch. Prvá prednáška poskytne iba základný prehľad celého operačného systému a pokúsi sa načrtnúť, ako do seba jednotlivé časti zapadajú. Druhou prednáškou pokryjeme základné programovacie rozhrania, ktoré OS poskytuje, sprostredkovávané prevažne systémovými knižnicami. │ Témy (pokračovanie) │ │ 7. Ovládače zariadení │ 8. Sieťové vrstvy (Network Stack) │ 9. Interprety príkazov & užívateľské rozhrania │ 10. Užívatelia a práva │ 11. Virtualizácia & kontajnery │ 12. Operačné systémy na zvláštne účely V druhej polovici semestra začneme ovládačmi zariadení, ktoré všeobecne tvoria dôležitú časť operačných systémov, keďže sprostredkovávajú komunikáciu medzi aplikačným softvérom a hardvérovými perifériami pripojenými k počítaču. Podobne, vrstvy sieťového rozhrania umožňujú programom komunikovať s ďalšími počítačmi (a so softvérom, ktorý beží na týchto ďalších počítačoch), ktoré sú pripojené k počítačovej sieti. │ Súvisiace kurzy │ │ • PB150/PB151 Architektury výpočetních systémů │ • PB153 Operační systémy a jejich rozhraní │ • PA150 Principy operačních systémů │ • PV062 Organizace souborů │ • PB071 Principy nízkoúrovňového programování │ • PB173 Tematicky zaměřený vývoj aplikací v jazyce C/C++ Existuje niekoľko kurzov, ktoré sa buď prelínajú s týmto, tvoria prerekvizity, ktoré vyučujú znalosti potrebné pre tento kurz, či kurzy, ktoré rozširujú, čo sa tu naučíte. Zoznam vyššie je neúplný. Kurz PB153 je alternatívou k tomuto kurzu. Predpokladá sa, že väčšina študentov bude mať PB071 paralelne s týmto kurzom, napriek tomu, že znalosti C nebudú potrebné pre teóriu, ktorú preberieme. Základy jazyka C však budú nevyhnutné pre voliteľný seminár (PB152cv). │ Organizácia semestra │ │ • všeobecne, «jedna prednáška = jedna téma» │ • s najväčšou pravdepodobnosťou bude 13 prednášok │ • 13. prednáška bude opakovacia │ • «3 priebežné testy»: 2.4., 30.4., 28.5. # B. Prehľad semestra Táto sekcia poskytuje vysokoúrovňový prehľad tém, ktoré budú pokryté v jednotlivých prednáškach. Berte to ako rozšírený obsah alebo zbierku abstraktov, jeden pre každú z nadchádzajúcich prednášok. │ 2 Systémové knižnice a API │ │ • «POSIX»: Portable Operating System Interface │ • UNIX: (takmer) všetko je «súbor» │ • najmenší spoločný základ programov: C │ • z pohľadu užívateľa: objekty, archívy, zdieľané knižnice │ • «prekladač», linker Systémové knižnice a ich rozhrania (API) poskytujú najpriamejší prístup k službám operačného systému. V druhej prednáške si rozoberieme ako programy pristupujú k týmto službám a ako systémové knižnice vstupujú do programovacieho jazyka C. Tiež si rozoberieme základné artefakty, ktoré tvoria programy: objektové súbory, archívy, zdieľané knižnice a ako tieto vznikajú: ako sa zo súboru obsahujúceho zdrojový kód jazyka C stane nakoniec spustiteľný súbor skrze preklad (kompiláciu) a linkovanie. V priebehu tejto prednášky budeme používať ako náš preferovaný zdroj pre čerpanie príkladov štandard POSIX, keďže ide o najpoužívanejšie systémové rozhranie. Navyše preň existuje dostatok dokumentácie a iných zdrojov, ako online tak offline. │ 3 Jadro (Kernel) │ │ • «privilegovaný» režim CPU │ • proces bootovania │ • vynútenie hraníc │ • typy jadra: mikro, «mono», exo, ... │ • «systémové volania» V tretej prednáške sa sústredíme na jadro (kernel), pravdepodobne najdôležitejšiu (a často najkomplikovanejšiu) časť operačného systému. Začneme pekne na začiatku, procesom bootovania: ako sa jadro načíta do pamäte, inicializuje hardvér a spustí súčasti užívateľského priestoru (teda všetko, čo nie je jadro) operačného systému. Potom si povieme o vynútení hraníc: ako jadro kontroluje užívateľské procesy, aby nezasahovali do seba navzájom a do hardvérových zariadení. Naznačíme, ako toto vynútenie umožňuje zdieľanie počítača niekoľkými užívateľmi, bez toho aby sa navzájom narušovali (alebo aspoň aby narušenie bolo minimálne). Ďalšou zaujímavou témou bude ako je také jadro navrhnuté a čo je a nie je súčasťou jadra. Rozoberieme niektoré kompromisy jednotlivých typov jadra, hlavne čo sa týka bezpečnosti a korektnosti vo vzťahu k výkonnosti. Nakoniec sa pozrieme na mechanizmus «systémových volaní», čo je spôsob, akým komunikuje užívateľský priestor s jadrom (kernelom), a ktorým posiela požiadavky na rôzne nízkoúrovňové systémové služby. │ 4 Súborové systémy │ │ • prečo a ako │ • abstrakcia nad zdieľaným «blokovým úložiskom» │ • «hierarchia» adresárov │ • všetko je súbor │ • i-uzly, adresáre, pevné (hard) & symbolické/mäkké (soft) odkazy Nasledujú súborové systémy, ako rozšírená abstrakcia nad stálym blokovým úložiskom, ktoré nám poskytujú hardvérové úložné zariadenia. V prvom rade sa zamyslíme, prečo sú súborové systémy potrebné a prečo sú tak všadeprítomné v operačných systémoch, a pozrieme sa ako fungujú vnútri. Konkrétne sa zameriame na tradičný UNIX-ový súborový systém, ktorý nám poskytne dôležitý vhľad do architektúry operačného systému ako celku, a do dôležitých aspektov sémantiky POSIX-ových súborov. │ 5 Základné zdroje a multiplexing │ │ • «virtuálna pamäť», procesy │ • zdieľanie procesorov & «plánovanie» │ • procesy vs vlákna │ • «prerušenia», hodiny Jednou zo základných úloh operačného systému je správa rôznych zdrojov, počnúc najzákladnejšími: jadrami procesora a pamäťou RAM. Keďže tieto prostriedky sú veľmi dôležité pre všetky procesy, budeme im venovať celú prednášku. Pozrieme sa na základné jednotky pridelenia zdrojov: vlákna pre procesor a procesy pre pamäť. Tiež sa budeme venovať mechanizmom, ktoré kernel používa na pridelenie a ochranu daných zdrojov, konkrétne virtuálnu pamäť a plánovač úloh (scheduler). │ 6 Súbežnosť a zamykanie │ │ • «komunikácia» medzi procesmi │ • prístup k «zdieľaným zdrojom» │ • vzájomné vylúčenie │ • «uviaznutie» (deadlock) a prevencia uviaznutia Plánovanie a rozdeľovanie času procesora úzko súvisí s ďalšou dôležitou témou, ktorá je ústredná pri návrhu operačných systémov: súbežnosť. Túto tému prejdeme na pomerne vysokej, všeobecnej úrovni, keďže detaily sú často komplikované a hlavne späté s danou architektúrou a vyžadujú dôkladné pochopenie hardvéru (SMP, hierarchia cache pamätí), aj jadra. │ 7 Ovládače zariadení │ │ • ovládače na úrovni užívateľa vs jadra │ • prerušenia ap. │ • GPU │ • PCI ap. │ • blokové úložisko │ • sieťové zariadenia, wifi │ • USB │ • bluetooth Ďalšou z centrálnych úloh operačného systému je sprostredkovať prístup k hardvérovým zariadeniam. Časť kódu, ktorá umožňuje tento prístup k hardvéru sa zaoberá najmä softvérovými rozhraniami a API – tomuto sa tiež hovorí 'abstrakcia hardvéru'. Aby však táto abstrakcia mohla fungovať, často je potrebné množstvo ‘lepidla’, ktoré je špecifické pre konkrétne zariadenie (alebo aspoň triedu daného zariadenia) – lepidla tiež známeho ako ovládače zariadení. Jednou z dôležitých otázok bude súhra medzi ochranou na úrovni procesora a priamym prístupom k hardvéru a jej význam pre ovládače. Uvidíme, že pri niektorých (ale nie všetkých) typoch hardvéru môžu komunikáciu medzi hardvérom a vyššími úrovňami systému (vrstva abstrakcie hardvéru, aplikačný softvér, atď.) rozumne sprostredkovávať iba privilegované programy (v jadre alebo jeho blízkosti). │ 8 Sieťové vrstvy (Network Stack) │ │ • TCP/IP │ • preklad mena na IP adresu (name resolution) │ • API soketov │ • firewall a filtrovanie paketov │ • sieťové súborové systémy Napriek tomu, že budete mať samostatný kurz zameraný na siete, strávime jednu z prednášok štúdiom sietí: sieťová komunikácia je neoddeliteľnou súčasťou moderných operačných systémov a rozhodnutia týkajúce sa sietí často ovplyvňujú ďalšie časti systému. Pozrieme sa na všadeprítomné vrstvy TCP/IP, ako táto architektúra zapadá do operačného systému, a ktoré rozhrania (API) môžu aplikácie používať, aby dokázali využiť sieťové služby. Tiež si ukážeme ďalšiu funkcionalitu úzko spätú so sieťami, ktorá je často hlboko integrovaná v operačných systémoch: filtrovanie paketov a sieťové súborové systémy. │ 9 Interprety príkazov & užívateľské rozhrania │ │ • «interaktívne» systémy │ • v minulosti: konzoly a terminály │ • «textové» terminály, RS-232 │ • bash a iné Bourne shell-y, POSIX │ • «grafické»: X11, Wayland, OS X, Windows, Android, iOS Ďalšia prednáška je zameraná na interakciu človeka s počítačom, čo je nepochybne podstatnou súčasťou dojmu z používania počítača a tým aj podstatnou časťou väčšiny univerzálnych (general-purpose) operačných systémov. Aj počítače, ktoré nekomunikujú s človekom priamo (fyzicky), obvykle poskytujú nejakú formu rozhrania, väčšinou sprostredkovanú sieťovo. Najprv sa pozrieme na ‘tradičné’ textové rozhrania, ktoré sú stále hojne využívané medzi systémovými a sieťovými inžiniermi a programátormi, ale tiež sa do určitej miery budeme venovať grafickej podpore v moderných zariadeniach (nevynímajúc smartfóny). │ 10 Užívatelia a práva │ │ • «viac-užívateľské» (multi-user) systémy │ • «izolovanie», vlastníctvo │ • «práva» v súborových systémoch │ • čo sme schopní dosiahnuť Existujú dva podstatné prípady použitia počítačov (a tým operačných systémov), kde je dôležitá vysokoúrovňová kontrola prístupu a správa práv: prvý, keď je jeden počítač zdieľaný viacerými užívateľmi (čo je ten typickejší prípad), ale v modernom svete tiež prípad, keď na svojich zariadeniach spúšťame nedôveryhodné alebo čiastočne dôveryhodné programy (práva pre aplikácie na smartfónoch, webové stránky, ktoré spúšťajú javascript na vašom laptope atď.). │ 11 Virtualizácia & kontajnery │ │ • multiplexovanie zdrojov │ • «izolovanie» │ • viacero jadier (kernelov) na jednom systéme │ • «hypervízory» typu 1 a typu 2 │ • ‹virtio› Počítač, spolu so svojím operačným systémom, je prirodzenou štandardnou ‘jednotkou’ (unit) výpočtových zdrojov – vhodne zapuzdruje zdroje samotné, ako aj softvérové vrstvy a konfiguráciu systému. Bohužiaľ, počítače – ako fyzické zariadenia -- sú nepraktické a neskladné: treba ich zaobstarať, uložiť na police v klimatizovaných miestnostiach, pripojiť k zdroju napájania, k sebe navzájom a do väčšej siete. Ich fyzické komponenty sú náchylné na opotrebovanie a poruchy a musia byť pravidelne vymieňané a opravované. Virtualizácia nám umožňuje oddeliť logické aspekty počítača – nainštalovaný softvér, dátové úložisko a konfiguráciu – od fyzickej krabice. Tým môžeme zlepšiť využitie hardvéru, oddeliť údržbu hardvéru od softvérových prvkov a všeobecne si zjednodušiť život (väčšinou). V tejto prednáške sa bližšie pozrieme na moderné virtuálne stroje založené na báze hypervízorov a na to, ako sú implementované v súčasnej generácii operačných systémov. │ 12 Operačné systémy na zvláštne účely │ │ • univerzálne (general-purpose) vs špecializované │ (special-purpose) │ • «embedded» systémy │ • «real-time» systémy │ • high-assurance systémy - zamerané na vysokú bezpečnosť │ a spoľahlivosť (seL4) V priebehu kurzu sa väčšinou budeme baviť o univerzálnych (tzv. general-purpose) operačných systémoch: používaných v osobných počítačoch a serveroch. Posledná prednáška bude venovaná špecializovaným systémom, ktoré sa používajú na zvláštne účely: systémy vyvinuté pre práčky, satelity, či pre vozidlá vysielané na Mars. Zbežne sa tiež pozrieme na systémy zamerané na vysokú spoľahlivosť (high-assurance systems), ktorých cieľom je extrémne vysoká spoľahlivosť a/alebo bezpečnosť.