2 RIEŠENIE PROBLÉMOV

Podobné dokumenty
Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

2

Resolution

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

Ponuka Štart

Architektúra OS

ŤAHÁK PRAKTICKÁ ČASŤ Prerekvizity: LINUX: WINDOWS: Inštalácia Oracle VirtualBoxu a vytvorenie virtuálneho stroja /návod nižšie/ Operačný system Window

STRUČNÝ NÁVOD KU IP-COACHU

Matej Kendera - PDF, word, lucene, java

Import absencí z ASC

Hardwarové prerušenie Nasledujúci kód ukazuje inštaláciu obsluhy časovača vrátane jeho inicializácie // inicializace časovače, přerušení každou milise

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

Microsoft Word - Priloha_1.docx

Slovenská technická univerzita v Bratislave Fakulta informatiky a informačných technológií Ilkovičova 2, , Bratislava 4 Internet vecí v našich ž

Pomôcka Setup Používateľská príručka

Prezentácia programu PowerPoint

STRUČNÝ NÁVOD KU IP-COACHU

Microsoft PowerPoint - OOP_prednaska_10.pptx

PAGER V3.0

Microsoft Word - 06b976f06a0Matice - Uzivatelska Dokumentacia

Matematický model činnosti sekvenčného obvodu 7 MATEMATICKÝ MODEL ČINNOSTI SEKVENČNÉHO OBVODU Konečný automat predstavuje matematický model sekvenčnéh

Ako si mám nainštalovať nový upgrade z Internetu?

CitiManager - Migration Quick Reference Guide for Cardholders_Slovak_fin

2

1 Portál pre odborné publikovanie ISSN Heuristický adaptívny PSD regulátor založený na miere kmitavosti Šlezárová Alexandra Elektrotechnika

Objektovo orientované programovanie

Privátna zóna pre prevádzku Obsah Privátna zóna pre prevádzku 1 Obsah 1 Webová stránka 2 Úvodná stránka 2 Registrácia prevádzka/penzión

Novinky programu MSklad

Užívateľský manuál FULL HD LED stropný monitor (AUX/HDMI/USB/FM-TX)

Obsah tejto príručky Microsoft Prechod na program Access 2010 z programu Access 2003 Vzhľad programu Microsoft Access 2010 sa výrazne odlišuje od prog

Manuál pre nastavenie tlače z VRP tlačiarní bluetooth Bluetooth Manuál pre nastavenie tlače z VRP tlačiarní -1-

Pracovný postup pre vypĺňanie údajov elektronického formulára IŠIS pre spravodajskú jednotku 1

Stravné - přecenění

Úvodná prednáška z RaL

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Operačné systémy Prednáška č. 2 Windows 95 Windows 95 má povesť ľahko ovládateľného systému pre užívateľov a ťažkého systému pre programátorov. Začiat

test z informatiky - hardvér Test vytvoril Stanislav Horváth Vstupno - výstupné zariadenia Otázka č.1: Aké zariadenie je na obrázku? (1 bod) a) vstupn

Elektronický ukazovateľ polohy s batériou Návod na použitie

OPIdS - finančné riadenie

Quick Guide for Installing Nokia Connectivity Cable Drivers

Microsoft PowerPoint - CONNECT_R&A_76_sk

Criss Cross je 3-valcový výherný prístroj, ktorý sa hrá až na 27 výherných líniách na všetkých pozíciách valcov. Hra je prístupná aj prostredníctvom m

Si Touch User Manual

aplikácia do mobilého telefónu na stiahnutie digitálneho tachografu

Snímka 1

Paralelné algoritmy, cast c. 2

Ako hrat Burlesque Queen V 1.4

Spustenie skonvertovanej C-Image zálohy v MS Virtual PC

Modem a lokálna sieť LAN Používateľská príručka

N desitka.indd

Inteligentné rozhodovacie systémy Heuristické prehľadávanie SP Október, 2018 Katedra kybernetiky

Obsah:

Prevádzka

VSDC Free Video Editor stručný návod na používanie Link na sťahovanie softvéru: K prog

Pravidlá bezpečnosti pre majiteľov certifikátov certifikačnej autority DÔVERA zdravotná poisťovňa, a. s. Verzia 1.1 Platí od

0022-vub-mobilne-tokeny-200x200-v03.indd

Microsoft Word - prirucka_katedry_nova

Návod na obsluhu FiskalPRO Mobile

Sprievodný list SofComs.r.o., Priemyselná 1, Liptovský Mikuláš Program basic.sk Verzia ( ) Dátum Autor Ing. J. Malíček

PowerPoint Presentation

Stravné - přecenění

Prezentace aplikace PowerPoint

enum

Pripojenie sa na počítač a ovládanie vzdialenej obrazovky cez CM Remote

sutaz - Hodina s Ekostopou

RAZER ABYSSUS ESSENTIAL Slovenská príručka Táto príručka slúži len ako návod základné vedomosti s hlavných funkcií a nastavení zariadenia. Podrobnejši

eKasa

Komplexný informa ný a monitorovací systém Monitorovanie biotopov a druhov európskeho významu Používate ská dokumentácia KIMS modul Mobilná aplikácia

PowerPoint-Präsentation

Manažment v Tvorbe Softvéru 2018/2019

Kartelove dohody

Agenda záverečnej práce pedagóg Celá agenda týkajúca sa záverečnej práce je dostupná v obrazovke Záverečná práca (menu Agenda pedagóga -> Záverečné pr

Microsoft Word - Zmeny v dlhodobom majetku.docx

fm 2012 a predajňa.doc

Informačný systém pre externú časť a písomnú formu internej časti maturitnej skúšky Informačný systém pre EČ a PFIČ maturitnej skúšky Užívateľská prír

7011

SAEAUT SNMP OPC Server

Microsoft Word Nextra_ADSLink.doc

Navigácia po úvodnej stránke elektronickej schránky Dátum zverejnenia: Verzia: 10 Dátum aktualizácie: Navigácia po úvodnej st

Slide 1

Prevodník USB/20mA

PoĊítaĊová sieť

NU_ _001_

Microsoft Word - pouzivatelska_prirucka.doc

Klasická metóda CPM

C-Monitor WIN klient pre verziu 2.8

SLOVENSKÁ TECHNICKÁ UNIVERZITA V BRATISLAVE Fakulta informatiky a informačných technológií STU Ústav počítačových systémov a sietí ZADANIE SEMESTRÁLNE

Katalóg služieb OTPdirekt-retail

Automatizovaná údržba PC cez C-Monitor

gameDescription_bigApple

Príklad 5 - Benzén 3. Bilančná schéma 1. Zadanie príkladu n 1 = kmol/h Definovaný základ výpočtu. Na základe informácií zo zadania si ho bude v

PowerPoint Presentation

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

NSK Karta PDF

Zasady ochrany osobnych udajov - HAGARA - JULINEK

DediĊnosť

Manuál pre nastavenie tlače z VRP Bluetooth, USB tlačiarne Bluetooth, USB tlačiarne Manuál pre nastavenie tlače -1-

Tomáš Jelínek - včely vyhľadávanie

Prepis:

1PARALELNÉ PROCESY PROCES, JEHO PRERUŠENIE A PLÁNOVANIE VZNIK A ZÁNIK PROCESOV SPRÁVA PARALELNÝCH PROCESOV VLÁKNA 1.1 PROCES, JEHO PRERUŠENIE A PLÁNOVANIE DEFINÍCIA POJMU PROCES Procesor v počítači vykonáva postupnosť inštrukcií, ktorá sa nazýva program. Programov je už toľko druhov, že slovo program sme prenechali práčke, alebo televízoru a hovoríme skôr o úlohách, aplikáciách, nástrojoch, prostredí, rozhraniach, procesoch, funkciách, objektoch, appletoch a podobne. Z toho je vidieť, v akom rozsahu prešli počítače do bežného života - náš jazyk začal jemnejšie rozlišovať pojmy v tejto oblasti. Na vyjadrenie množiny viacerých paralelne vykonávaných úloh na jednom počítači tu budeme používať pojem procesy. Ako proces označujeme postupnosť vykonávaných operácií (inštrukcií), ktoré tvoria jednu súvislú činnosť. Každý jednotlivý proces má tieto vlastnosti: vlastná postupnosť vykonávaných inštrukcií (operácií), vlastný vyhradený priestor adries v pamäti na uloženie údajov, pracuje sa len s vyhradenou podmnožinou registrov procesora, vlastný ukazovateľ adresy aktuálne vykonávanej inštrukcie, čo je tzv. riadiaci bod procesu (control point), množina paralelne bežiacich procesov má definovanú hierarchiu vzájomných vzťahov, kto s kým ako súvisí.

J.Štefanovič: Základy operačných systémov 1.2 OBR. 1.1. TRI SAMOSTATNÉ PROCESY BEŽIACE NA JEDNOM PROCESORE PREPÍNANIE PROCESOV: NEPRAVÝ PARALELIZMUS Na Obr. 1.1 je znázornená situácia troch paralelne bežiacich procesov v počítači. Pri použití jedného procesora musí byť tento pomocou prepínacieho zariadenia poskytovaný striedavo všetkým trom procesom. Je to síce tzv. nepravý paralelizmus, pri veľkej rýchlosti procesora však môžu byť všetky procesy obsluhované dostatočne rýchlo, takže používateľ počítača má dojem ich skutočného paralelného vykonávania. Prepínanie medzi procesmi je typickou funkciou jadra operačného systému, ktorý takto zabezpečuje distribúciu výpočtových prostriedkov počítača pre všetky bežiace procesy. Prepínanie medzi procesmi možno demonštrovať na počítači najlepšie tak, keď spustíme niekoľko výpočtovo náročnejších úloh súčasne (napríklad prehrávanie videa alebo zložitejšie simulácie). Potom možno pozorovať, ako sa aktivita počítača očividne cyklicky presúva medzi jednotlivými úlohami (čo presne bude vidieť, to záleží na type stroja a operačného systému). Pravý paralelizmus je taká situácia, keď procesy bežia na rôznych procesoroch. Bežné počítače majú spravidla len jeden hlavný procesor a nanajvýš niekoľko špecializovaných vedľajších (napríklad procesor na grafickej karte), takže operačné systémy na nich zabezpečujú chod typického nepravého paralelizmu cyklickým prepínaním mnohých procesov. Pri používaní operačného systému typu UNIX môže používateľ pomocou príkazu ps získať aktuálny zoznam všetkých jemu dostupných bežiacich procesov. Pri používaní operačného systému Windows možno pomocou stlačenia kombinácie kláves Ctrl-Alt-Del aktivovať správcu úloh (task manager), ktorý sprístupní aktuálny zoznam paralelne bežiacich procesov patriacich jadru operačného systému a procesov spustených používateľom. Správca úloh je program (časť jadra operačného systému), ktorý vykonáva prepínanie, manipuláciu s procesmi a všetky informácie potrebné pre svoju činnosť má uložené v tzv. tabuľke procesov (process table), čo je údajová štruktúra zvyčajne v podobe zreťazeného zoznamu.

1 Paralelné procesy 1.3 MULTITASKING, KOOPERATÍVNY A PREEMPTÍVNY V Situácia pri práci s bežným počítačom vyzerá napríklad takto: je otvorené okno v ktorom píšeme text pre e-mail, v ďalšom okne je zoznam prichádzajúcich e- mailov, ktorý sa príchodom ďalšej pošty stále aktualizuje, v rohu obrazovky idú hodiny, na obrazovke je kurzor myši, ktorý reaguje na jej pohyb, v dolnom rohu je okno ukazujúce, ktorá hudobná skladba sa práve prehráva z disku a v inom rohu je okno oznamujúce, koľko percent požadovaných údajov sa v danom okamihu stihlo preniesť z internetu do počítača a podobne. Optimálny spôsob realizácie všetkých týchto činností v jednom počítači je práve forma paralelne vykonávaných procesov, podľa potreby vzájomne komunikujúcich, kde každý obsluhuje samostatnú úlohu - myš, pošta, hodiny, písanie textu a prenášanie údajov. Situáciu vystihuje klasický vtip o tom, koľko programátorov je potrebných na výmenu žiarovky: asi dvadsať, pričom prvý naprogramuje proces postav_rebrík(), druhý pripraví proces vylez_na_rebrík(), tretí naprogramuje vyskrutkuj_žiarovku() a ostatní podobne ďalej. Keďže dnešné počítače sú rýchle a majú dostatok pamäte, je takýto modulárny systém veľkého množstva paralelných procesov efektívnym riešením. Snaha realizovať všetku funkcionalitu počítača pomocou jedného kompaktného programu (teda jedného procesu) by bola vzhľadom na vysokú zložitosť takejto implementačnej úlohy neobyčajne problematická. Je to možné pri veľmi jednoduchých systémoch, mobilné telefóny k nim však už prestávajú patriť. Ak je však množina paralelne bežiacich procesov rozsiahla, môžu sa v nej nechtiac vytvoriť problémové, ťažšie rozpoznateľné schémy vzťahov medzi procesmi, ktoré môžu za určitých podmienok viesť k spomaleniu, alebo až k zablokovaniu činnosti niektorých alebo všetkých procesov a systém zamrzne. tejto učebnici všade predpokladáme, že paralelné procesy sú vykonávané len na počítači s jedným procesorom, tzv. nepravý paralelizmus. Paralelné vykonávanie viacerých procesov na jednom procesore sa označuje ako paralelný multitasking, alebo multiprocessing. Základná technická otázka potom je, ako organizovať prepínanie procesov. Jeden spôsob je spolupráca procesov, keď bežiaci proces sám rozhoduje o prerušení svojej činnosti a požiada systém o spustenie iného procesu (prípadne aj sám určuje, ktorého). To je tzv. kooperatívny multitasking. Druhý spôsob je, že každý proces je spúšťaný na určený časový interval, potom je prerušený kýmsi kto to riadi a nechá spustiť ďalší proces. To je tzv. preemptívny multitasking, procesy sú prerušované v pravidelných časových intervaloch zvonku bez ohľadu na svoju vôľu dokončiť niektorú časť svojej činnosti ( preempcia pred vyčerpaním svojej činnosti ). Kooperácia procesov je výhodná tam, kde je možné vytvoriť globálnu organizáciu celej činnosti, rozdelenej na procesy. Preempcia procesov je nutná v demokratickom prostredí, keď nezávislí používatelia spúšťajú množstvo svojich procesov v jednom spoločnom systéme. V ďalšom texte sa budeme zaoberať len

J.Štefanovič: Základy operačných systémov 1.4 preemptívnym multitaskingom, keď je množina paralelne bežiacich nezávislých procesov riadená (prepínaná) správcom procesov. KONTEXT PROCESU A PREPNUTIE KONTEXTU Kompletný stav procesu je v každom okamihu jeho existencie jednoznačne určený týmito hlavnými parametrami: adresou inštrukcie, ktorá sa práve vykonáva, stavom tých registrov procesora, ktoré sú vyhradené pre činnosť procesu, stavom tej oblasti pamäti, ktorá je pre proces vyhradená a obsahuje inštrukcie procesu (takzvaný text procesu, process text - v podstate samotný program) a jeho dáta (premenné a zásobníky), údajovými štruktúrami, ktoré patria jadru operačného systému a obsahujú riadiace informácie procesu (napríklad zoznam otvorených súborov, aktuálny adresár a podobne). Túto informáciu o kompletnom stave procesu nazývame kontext procesu (process context). Kontext je úplná informácia o bežiacom procese v tom zmysle, že jej uschovanie do pamäte umožňuje proces prerušiť, odložiť a v budúcnosti znova spustiť v takom stave, v akom bol prerušený. Najdôležitejšie informácie o kontexte každého procesu sú v operačnom systéme uložené v takzvanej tabuľke procesov, prípadne sú z tejto tabuľky prístupné prostredníctvom smerníkov. Prepnutie činnosti procesora z jedného procesu na druhý si technicky vyžaduje zmeniť adresovanie do inej oblasti pamäte, vymeniť stav ukazovateľa adresy inštrukcie, vymeniť obsah pracovných registrov a podobne, čo inými slovami znamená vymeniť kontext procesu za iný a nazýva sa to prepnutie kontextu (context switch). Pri prepnutí sa musí celý kontext prerušeného predošlého procesu uložiť do pamäte v operačnom systéme tak, aby bolo možné v niektorom budúcom časovom okamihu tento proces znova rozbehnúť, teda vrátiť procesoru na vykonávanie obnovením jeho kontextu pri prepnutí. Procesor počítača možno prirovnať k remeselníkovi, ktorý ponechá jednu prácu nedokončenú, poznačí si jej stav, prejde k inej práci a potom sa znova vráti tam, kde predtým prerušil činnosť. Proces sám nevie, koľkokrát bol počas svojej existencie prerušený, pretože prerušenie nezasahuje do jeho vnútornej integrity. Môže sa to dozvedieť, len ak komunikuje s okolím. Na obr. 1.2 je znázornená situácia dvoch procesov, z ktorých v jednom okamihu beží vždy práve jeden.

1 Paralelné procesy 1.5 OBR. 1.2 DVA PROCESY SÚ STRIEDAVO SPÚŠŤANÉ ČASOVÉ KVANTUM PRERUŠENIE PROCESU, PRIORITA A ZÁKAZ PRERUŠENIA, OBSLUHA PRERUŠENIA Prepínanie kontextu medzi procesmi je realizované v počítači v princípe tak, že elektrické hodiny generujú v pravidelných intervaloch s veľkosťou časového kvanta signál, ktorý je pevne privedený na jeden zo vstupov procesora a pravidelne spôsobuje jeho prerušenie, po ktorom procesor začne vykonávať inštrukcie patriace operačnému systému, ktoré obsluhujú prepínanie kontextu medzi procesmi. Keď je kontext prepnutý, prerušenie sa ukončí strojovou inštrukciou návratu z prerušenia a procesor pokračuje vo vykonávaní prerušeného procesu medzitým sa však kontext procesu vymenil a teda beží iný proces. Prepínanie procesov je organizované do časových intervalov konštantnej dĺžky. Časový interval sa označuje ako kvantum (quantum, time slice) a jeho veľkosť je v počítači pevne nastavená na desiatky alebo stovky milisekúnd. Pri riadení procesov sa však osobitné situácie môžu riešiť predĺžením, alebo skrátením časového kvanta, keď si situácia vyžaduje urýchlenie, alebo synchronizáciu práve bežiaceho procesu. Aby bolo možné prepínať procesy, je procesor technicky vybavený schopnosťou vykonať prerušenie procesu (process interrupt). Prerušenie nastane buď elektrickým signálom privedeným zvonku na procesor (hardvérové prerušenie), alebo osobitnou strojovou inštrukciou (softvérové prerušenie), alebo signálom chyby vovnútri procesora (delenie nulou, pretečenie registrov a podobne). Osobitným hardvérovým prerušením je signál RESET, keď procesor zabudne všetko čo robil a začne vykonávať svoju činnosť od pevne definovaného počiatku. Pri prerušení procesor zapíše niektoré svoje dátové obsahy (hlavne aktuálny stav registra adresy poslednej vykonávanej inštrukcie) na dohodnuté miesto v pamäti a začne vykonávať ďalšiu inštrukciu na adrese, ktorá je pre dané prerušenie vopred stanovená je to tzv. adresa prerušenia (interrupt address), alebo vektor prerušenia. Procesor počítača spravidla umožňuje stanoviť celú množinu adries, kde každá adresa zodpovedá konkrétnemu typu prerušenia. Procesor rozlišuje celú množinu vonkajších prerušovacích elektrických signálov a viacero typov inštrukcií prerušenia, ktoré spoločne označujeme ako zdroje prerušenia. Zdroje prerušenia sú konštrukčne usporiadané (radičom prerušenia pre hardvérové signály) do hierarchie tak, že prerušenie s vyššie stanovenou prioritou prerušenia (interrupt priority) môže prerušiť priebeh prerušenia nižšej

J.Štefanovič: Základy operačných systémov 1.6 priority a nie opačne. Zvolený zdroj prerušenia môže byť dočasne ignorovaný, čo je tzv. maskovanie prerušenia, alebo zakazané prerušenie (disable interrupt) osobitnou strojovou inštrukciou. Procesor je teda automat konštrukčne uspôsobený viackrát vnorene prerušiť svoju činnosť skokom na inú adresu a potom sa z tohto vnorenia korektne vrátiť do predchádzajúcich prerušených činností. Na každú z adries prerušenia tvorca operačného systému umiestňuje do pamäte postupnosť inštrukcií, ktoré pri prerušení vykonajú tzv. obsluhu prerušenia (interrupt handling). Ako bežne viditeľné príklady prerušenia možno uviesť pohyb myšou (používateľ očakáva okamžitú reakciu na monitore), stlačenie kombinácie kláves Ctrl-Alt-Del, alebo stlačenie tlačidla reset, kedy však dochádza k úplnému reštartu činnosti počítača a žiadny z prerušených procesov sa už neobnoví. DVA REŽIMY ČINNOSTI PROCESORA Okrem podpory mechanizmu prerušenia patrí k základnému vybaveniu každého procesora rozlišovanie tzv. režimov činnosti. V princípe procesory rozlišujú dva režimy činnosti tzv. privilegovaný režim, teda režim správcu systému (privileged mode, supervisor mode) a neprivilegovaný režim. V neprivilegovanom režime nemožno na procesore vykonať niektoré druhy strojových inštrukcií, niektoré registre procesora sú inštrukciám neprístupné, alebo fyzicky interpretované ako iné registre, niektoré adresy v pamäti nemožno vygenerovať (vznikne signál chyby) a podobne. Toto umožňuje rozdeliť bežiace paralelné procesy na dve množiny. Jedna je privilegovaná, ktorá má možnosť ovplyvňovať celý systém a sú to procesy patriace operačnému systému. Druhá je neprivilegovaná, čo sú procesy spúšťané používateľom operačného systému, ktoré sú takto pod kontrolou a nemôžu zasahovať do činnosti privilegovaných procesov, kým naopak je to možné. Privilegovaný režim procesora sa teda označuje aj ako režim jadra operačného systému (kernel mode), neprivilegovaný sa označuje ako režim používateľa (user mode). Proces bežiaci v režime jadra môže pristupovať do registrov a do pamätí patriacich iným procesom a môže prepnúť režim procesora na neprivilegovaný. Proces bežiaci v režime používateľa nemá na procesore takéto právomoci, režim môže byť prepnutý len zvonku, prerušením alebo privilegovanými procesmi. Procesory bývajú konštruované na rozlišovanie viacerých hierarchicky usporiadaných režimov, bežné operačné systémy však spravidla využívajú (rozlišujú) len horeuvedené dva režimy. Prechod medzi režimom jadra a režimom používateľa sa uskutočňuje tak, že v režime jadra možno vykonať inštrukciu prepnutia módu do režimu používateľa, avšak potom to už v režime používateľa naspäť nie je možné. Prechod nazad z režimu používateľa do privilegovaného režimu je opäť možný jedine prostredníctvom vonkajšieho prerušenia, alebo určenej udalosti (delenie nulou, vypočítanie neplatnej adresy a podobne).

1 Paralelné procesy 1.7 Napríklad stlačením kláves Ctrl-Alt-Del vyvoláme prerušenie a spustí sa proces jadra operačného systému, ktorý má právomoc manipulovať s používateľskými procesmi a sám sa rozhoduje, kedy svoju činnosť ukončí a prepne procesor nazad do obmedzeného používateľského režimu. Ak napríklad nastane situácia pri vykonávaní používateľského procesu, ktorá je zdrojom prerušenia, procesor sa prepne do privilegovaného režimu, obslúži dané prerušenie a opäť sa znova môže prepnúť do používateľského režimu, v ktorom pokračuje vykonávanie prerušeného používateľského procesu. Príkladom je prepnutie kontextu: používateľské procesy nemajú právomoc svojvoľne prepnúť svoj kontext, pretože v používateľskom režime sa nedostanú k určitým registrom, nemôžu prekročiť stanovený rozsah adresy a nemôžu vykonať určité inštrukcie. Navyše, niektoré kritické operácie, pri ktorých sa používateľský proces o toto pokúsi, sú detekované ako zdroje osobitného prerušenia, pri ktorom jadro operačného systému môže daný používateľský proces rozpoznať ako nekorektný a zrušiť ho. Nasledujúci príklad z praxe: VOLANIE SLUŽBY JADRA OPERAČNÉHO SYSTÉMU Každý používateľský proces teda existuje v prostredí operačného systému v uzavretom priestore, ktorý je ohraničený povolenou množinou strojových inštrukcií, dostupnými registrami procesora a povolenými adresami v pamäti pre zápis a čítanie. Akýkoľvek iný prístup procesu do okolia sa môže uskutočniť len tak, že proces požiada jadro operačného systému o vykonanie určitej služby. Požiadanie o službu prebieha vykonaním jednej povolenej inštrukcie prerušenia, čo je tzv. volanie služby jadra systému (system call). Po takomto prerušení sa vykonáva taká činnosť jadra operačného systému, ktorá rozpozná druh požadovanej služby a (ak je to možné) vykoná pre ten proces požadovanú činnosť. Po jej skončení sa prepne kontext naspäť na vykonávanie toho procesu. Takéto vykonanávanie služby pre používateľský proces býva označované, že proces sa vykonáva v režime jadra. Jeden príklad volania služby: printf( helloworld ) táto procedúra v praxi znamená, že sa vykonajú inštrukcie, ktoré na dohodnuté miesto do pamäti uložia textový reťazec, ďalej na dohodnutom mieste uložia kód požadovanej služby operačného systému (výstup textu na určený terminál, do okna) a zavolajú službu jadra systému. Táto služba rozpozná požadovanú úlohu, vykoná ju, na dohodnutom mieste zanechá informáciu či sa úloha vykonala správne a vráti činnosť nazad z prerušenia do obsluhovaného procesu.

J.Štefanovič: Základy operačných systémov 1.8 Takéto volania služieb sa realizujú pri všetkých interakciách procesu s okolím vstup a výstup cez terminál, cez dátovú sieť, čítanie a zápis dát z/do súborov na disku a iných pamäťových zariadení, grafický výstup, zisťovanie času, komunikácia a synchronizácia medzi jednotlivými procesmi a podobne. Množina všetkých existujúcich volaní služieb tvorí tzv. používateľské rozhranie operačného systému pre procesy a je subjektom neustálej aktualizácie a zdokonaľovania. Zároveň však je aj subjektom snahy o normalizáciu (napríklad ANSI štandarty), pretože ak naprogramujeme aplikáciu využívajúcu služby určitého operačného systému, nemusí potom byť táto prenositeľná do prostredia iného systému (alebo inej verzie toho istého systému), ak niektorú službu druhý systém nepozná, alebo inak interpretuje. SPRÁVCA ÚLOH A PLÁNOVAČ PROCESOV Privilegovaný a neprivilegovaný režim procesora umožňujú programátorovi operačného systému zorganizovať a riadiť množinu paralelne bežiacich procesov tak, že v privilegovanom režime beží jeden riadiaci proces, ktorý má na starosti prepínanie kontextu všetkých ostatných procesov, ktoré bežia na neprivilegovanej úrovni. Tento riadiaci proces sa nazýva správca úloh (task manager) a informácie o procesoch spravuje v tabuľke procesov (process table), podľa ktorej môže prepínať procesy. Každá položka tabuľky procesov obsahuje informácie o stave jedného existujúceho používateľského procesu, predovšetkým údaje o kontexte procesu, aby bolo možné každý prerušený proces znova spustiť. Plánovač je schopný pomocou týchto informácií vykonávať prepínanie kontextu medzi procesmi tak, aby sa všetky paralelne prerušovane vykonávali. K tomu je ešte potrebné, aby sa vykonávalo automatické pravidelné spúšťanie plánovača, aby rozhodol o prerušení práve bežiaceho procesu a o spustení ďalšieho procesu. Spúšťanie sa deje prerušovaním pomocou hodinového signálu po konštantných časových kvantách, kedy na adrese prerušenia sú umiestnené privilegované inštrukcie na vykonanie akcie plánovača. Použitie správcu úloh na prepínanie všetkých ostatných procesov v systéme je metóda vyššie uvedeného tzv. preemptívneho multitaskingu. Správca sa v princípe nestará, čo robia procesy a či ich preruší a prepne vo chvíli, ktorá je pre ne vhodná, alebo nevhodná, keď ešte neskončili, resp. nedokončili, čo potrebovali vykonať (preemptívne plánovanie (=prepínanie) procesov). Na obr. 1.3 je naznačená schéma opakovaného spúšťania plánovača prepínajúceho procesy. Každý interval časového kvanta sa začína spustením plánovača, ktorý rozhodne o prepnutí na ďalší proces a vykoná toto prepnutie (okamih prepnutia je označený prerušovanou čiarou). Podiel času činnosti plánovača v rámci jedného časového kvanta sa označuje ako réžia, t. j. čas vynaložený na organizáciu a prepínanie procesov a teda nie na samotnú užitočnú činnosť. Časové kvantum má v technickej praxi veľkosť rádovo 10-100 ms. Činnosť plánovača v princípe pozostáva z týchto dvoch samostatných krokov: najprv spravodlivý výber procesu

1 Paralelné procesy 1.9 ktorý sa v ďalšom kvante spustí (plánovanie procesov, scheduling) a potom operácia samotného prepnutia kontextu. Výber procesu, ktorý bude v ďalšom časovom kvante spustený, sa vykonáva programom, označovaným ako plánovač (scheduler). Programy vykonávajúce funkciu správcu úloh a plánovača sa zvyknú vytvárať čo najkratšie a najjednoduchšie, aby nezvyšovali réžiu, teda aby zbytočne nezaberali čas procesora. OBR. 1.3. PRAVIDELNÉ SPÚŠŤANIE PLÁNOVAČA PROCESOV, AKO NADRADENÉHO RIADIACEHO PROCESU SPÚŠŤANIE PROCESOV Na obr. 1.4 je základná schéma životného cyklu procesu (process life cycle), podľa ktorej plánovač procesov spravuje množinu paralelne bežiacich procesov. Skutočne bežiaci proces je v každom časovom okamihu len jeden, ktorý sa vyberá zo zoznamu aktívnych procesov. Pri vzniku nového procesu (operácia fork, v nasledujúcej kapitole) je tento zaradený do zoznamu aktívnych procesov (v tabuľke procesov) a čaká, až ho plánovač vyberie a vykoná spustenie procesu (launching or dispatching the process) na čas jedného kvanta. Po uplynutí časového kvanta vyberá plánovač na spustenie ďalší proces zo zoznamu aktívnych procesov (alebo môže ponechať bežať ten istý proces). Skončenie procesu (process exit) znamená zrušenie všetkých jeho aktivít a vymazanie väčšiny jeho údajov. Po skončenom procese však zostáva určitá množina údajov, kde sú uložené napríklad výstupné údaje, o ktorých sa predpokladá, že môžu byť neskôr vyžadované inými procesmi na prečítanie. Ak tieto údaje ešte existujú, proces sa nachádza v stave tzv. zombie. Procesy, ktoré čakajú na určitú udalosť a dovtedy je zbytočné ich periodicky spúšťať (plánovať), môžu byť uspané (sleep), t. j. dočasne zaradené do zoznamu spiacich procesov, aby nezaťažovali prácu celého systému spúšťaním naprázdno. Proces môže byť uspaný aj na vlastnú žiadosť, volaním príslušnej služby systému. Zobudenie procesu (process wakeup), teda jeho premiestnenie do zoznamu aktívnych procesov, vykoná jadro operačného systému pri výskyte udalosti definovanej na zobudenie daného procesu. Reálne operačné systémy majú životný cyklus procesu zvyčajne zložitejší, než je na nasledujúcom obrázku. Princíp je rovnaký, ale cyklus je rozdelený do viacerých fáz než na obr. 1.4, aby sa plánovanie a paralelný beh procesov realizovali

J.Štefanovič: Základy operačných systémov 1.10 optimálne. Plánovanie procesov môže byť rozdelené na dve hierarchicky samostatné plánovania: pre neprivilegované používateľské procesy a pre privilegované procesy, patriace k činnosti jadra operačného systému. OBR. 1.4. ŽIVOTNÝ CYKLUS PROCESU SLEEP / WAKEUP YIELD JADRO SYSTÉMU A SYSTÉMOVÉ PROCESY Operácia uspania a zobudenia (sleep/wakeup) je záležitosťou správcu úloh (procesov) a vykonáva sa na požiadanie. Požiadavku na uspanie/zobudenie procesu môže vygenerovať jadro operačného systému, alebo aj ľubovoľný proces. Proces môže požiadať aj o uspanie seba samého. Požiadať o uspanie iného procesu môže, len ak má k nemu právo prístupu. Ak proces požiadal o svoje vlastné uspanie, má to zmysel pokiaľ niektorý iný proces alebo akcia bude preňho v príhodnej chvíli požadovať zobudenie. Zvláštnosťou je v systémoch možnosť volať požiadavku yield, ktorou proces prenecháva svoj čas inému procesu: sám ňou požiada správcu úloh, aby ho predčasne zastavil a vybral iný proces a ten spustil. Keď procesy požívajú yield aby si vzájomne dávali vo vhodnej chvíli prednosť, tak situácia riadenia procesov začína mať charakter kooperatívneho multitaskingu. Doteraz bolo spomenuté, že v operačnom systéme existujú používateľské procesy, procesy patriace jadru systému a riadiace programy-procesy plánovač a správca úloh. Z hľadiska organizácie a spúšťania procesov je operačný systém množina prvkov softvéru, obvykle rozdelená na dve základné skupiny: procedúry, ktoré sa spúšťajú pri reakcii na prerušenia - tieto procedúry je potrebné umiestniť do pamäte spravidla už pri štarte operačného systému. Pri prerušení sa spustí program jadra vykonávajúci volanú procedúru pre požadovanú službu jadra. Samotný štart operačného systému (system booting) vykonáva spúšťacia procedúra (system loader), ktorá umiestni do pamäte všetky potrebné údaje a inštrukcie a potom spustí pravidelný chod plánovača procesov, systémové procesy, ktoré jadro spustí, aby pracovali pre potrebu

1 Paralelné procesy 1.11 samotného systému. Tieto procesy môžu, ale aj nemusia, pracovať v privilegovanom režime a je vecou plánovača, kedy ich bude spúšťať. Tieto procesy bežia buď trvale počas celej existencie operačného systému (napríklad zabezpečenie sieťovej komunikácie), alebo sa spúšťajú vo chvíli potreby (napríklad kontrola a správa súborov na disku). Procesy patriace operačnému systému spravidla nie sú spúšťané používateľom a ani jeho procesmi a označujú sa ako systémové procesy, alebo démoni (daemons). 1.2 VZNIK A ZÁNIK PROCESOV VYTVORENIE A ZRUŠENIE PROCESU Na základnom kurze programovania sa učíme, ako sa dá vytvoriť a spustiť jeden program - proces. V tej chvíli však máme pred sebou už hotový bežiaci operačný systém a vhodné programátorské prostredie, ktoré nám to zabezpečí, takže na začiatku ešte nevieme, odkiaľ sa to všetko vzalo. Aby bolo možné najprv vôbec vytvoriť celý systém paralelne bežiacich a vzájomne komunikujúcich procesov (napríklad operačný systém), je žiaduce vytvoriť pre programátora vhodné podmienky vo forme osobitných procedúr - služieb operačného systému, volaním ktorých sa dajú jednoducho automaticky vytvárať a rušiť paralelne bežiace procesy. Na umožnenie existencie paralelne bežiacich procesov v operačnom systéme je potrebné, aby systém poskytoval bežiacim procesom minimálne tieto tri základné služby, ktoré môžu byť procesmi volané: fork(), exec(), exit() (vytvorenie, vykonanie a zrušenie) Akonáhle sú tieto procedúry dané k dispozícii, možno ich použiť v programoch/procesoch a vytvárať tak systém paralelne bežiacich procesov bez toho, aby sa programátori starali o množstvo detailov. V tejto kapitole vysvetlíme funkciu týchto troch služieb systému a tým objasníme, odkiaľ prichádza množina paralelne bežiacich procesov v operačnom systéme.

J.Štefanovič: Základy operačných systémov 1.12 FORK Procedúra fork ( vidlička ) vytvára z bežiaceho procesu druhý identický proces, ktorý je naklonovanou kópiou prvého procesu. Kópia má rovnakú množinu inštrukcií programu a rovnaký obsah pamäte. Rozdiel je len v tom, že ide o dva nezávisle bežiace procesy. Jeden z nich je pôvodný a druhý je kópia, pričom ani jeden z nich v princípe nevie, ktorým sa stal. Túto informáciu sprostredkováva hodnota, ktorú vracia funkcia fork() v nasledovnom príklade: proces() { int pid; pid=fork(); // kto som odteraz? if(pid==0) printf("som potomok s číslom %d", getpid()); else printf("som rodič a mám nového potomka %d", pid); } RODIČ A POTOMOK, PID Na riadku programu označenom kto som odteraz? sa bežiaci proces dozvie, či je to ešte stále pôvodný proces, označovaný ako rodič (parent), alebo potomok (child, offspring) podľa hodnoty, ktorú nadobudne premenná pid. Rodičovský proces dostane túto premennú s hodnotou čísla procesu potomka, ktorý z neho vznikol a proces potomok ju dostane s hodnotou nula. Volanie procedúry fork znamená v podstate takú službu jadra operačného systému, ktorá vytvorí (naklonuje) presnú kópiu procesu volajúceho túto službu. Naklonovanie procesu tak znamená zdvojenie celého obsahu pamäti a informácií súvisiacich s procesom (Obr. 1.5) a zdvojenie položky v tabuľke procesov, ktorú používa plánovač. Po vykonaní služby fork pribudne plánovaču procesov v jeho správe jeden samostatný nezávislý proces navyše. V niektorých systémoch je procedúra fork odlišne vytvorená pre procesy patriace jadru operačného systému, vtedy sa alternatívne označuje ako clone (klonovanie procesov). Každý proces je pri svojom vzniku označený jedinečným číslom PID (Process Identificator). Tieto čísla spravuje jadro systému a poskytuje ich procesom (napríklad volaním getpid() sa proces dozvie svoje číslo). OBR. 1.5. VYKONANIE SYSTÉMOVEJ OBSLUHY FORK

1 Paralelné procesy 1.13 EXEC Samotná procedúra fork má však zmysel len v kombinácii s ďalšou službou jadra exec. Táto služba vymení obsah procesu za inú postupnosť inštrukcií, ktorú získa z vykonateľného súboru (executable file). Proces potomok teda vymení svoju postupnosť vykonávaných inštrukcií za iný program, ktorý sa takto rozbehne. Nasledujúci príklad je elementárnou ukážkou implementácie vykonávača príkazov (command interpreter), čo je vlastne princíp procesu typu shell (procesu, ktorý prijíma príkazy napísané používateľom na konzolu). V nasledujúcom jednoduchom príklade shell rozpoznáva len tri jednopísmenové príkazy: e (ukončenie činnosti), d (príkaz na výpis obsahu adresára) a t (príkaz na výpis času). Príkazy pre operačný systém môžu byť zadávané buď používateľom cez terminál (tiež sprostredkovane klikaním myšou v grafickom prostredí), alebo môžu byť napísané v textových súboroch (tzv. script files), ktoré slúžia na automatické načítavanie a vykonávanie príkazov. Bežiace procesy dávajú príkazy operačnému systému ako volania služieb jadra, takže nasledujúci program vlastne prijíma príkazy od používateľa a prekladá ich do volaní jadra systému. command_interpreter() { int pid; char príkaz[2]; while(1) { printf("\n% "); gets(príkaz); // vstup príkazu z klávesnice if(command[0]=='e')exit(); // príkaz ukončenia pid=fork(); // vidlička if(pid>0) if(command[1]!='&') waitpid(pid); // som rodič, čakám kým potomok skončí else // som potomok, volám program príkazu { if(command=='d') exec(dir.exe); //# // odovzdám riadenie programu dir if(command=='t') exec(time.exe); //# // odovzdám riadenie programu time printf("unrecognized command"); // neznámy príkaz, koniec } } BEH PROCESU NA POZADÍ Činnosť interpretera spočíva najprv vo vytvorení procesu potomka pomocou procedúry fork a potom v premene tohto potomka na proces zvoleného typu. Proces rodič zostáva čakať a proces potomok analyzuje príkaz a interpretuje ho: spustí procedúru exec, ktorá spôsobí, že sa potomok v tom okamihu premení na vykonávanie programu získaného z vykonateľného súboru dir.exe alebo time.exe. Horeuvedený zdrojový text programu treba chápať predovšetkým tak, že v okamihu označenom //# celý ten vykonávaný program zanikne proces potomka začne obsahovať iný program.

J.Štefanovič: Základy operačných systémov 1.14 Ak ako druhý znak nenapíšeme do príkazu &, tak rodič zavolá službu jadra operačného systému waitpid(), ktorá pozastaví vykonávanie procesu rodič po dobu, kedy beží proces potomka. Ak v príkaze uvedieme znak &, bude proces rodič neustále bežať a môžeme s jeho pomocou spustiť ďalší proces, aj keď medzitým ešte nedošlo k ukončeniu procesu potomka. Potomok teda zostal bežať nezávisle od činnosti interpretera, zostal bežať ako proces na pozadí rodičovského procesu. Na obr. 1.6 je schéma cyklickej činnosti interpretera príkazov. Hoci operácie fork() a exec() často po sebe nasledujú, sú v systémoch realizované ako samostatné operácie, pretože je medzi ne spravidla potrebné zaradiť iné operácie, na prípravu behu nového procesu (napríklad uzatvorenie a nové otvorenie súborov). OBR. 1.6. ČINNOSŤ INTERPRETERA PRÍKAZU EXIT PROCES INIT Posledná tu spomenutá služba systému exit je požiadaním o zrušenie procesu. Vtedy sa údaje procesu vymazávajú z pamäte a zruší sa položka v tabuľke procesov. Pri prirodzenom skončení programu sa služba exit vykoná automaticky. Ak po procese zostávajú zaznamenané údaje čakajúce na prevzatie inými procesmi alebo jadrom systému, proces je v stave označovanom ako zombie. Jadro operačného systému môže ukončiť ľubovoľný proces kedykoľvek, môže to urobiť aj používateľ vydaním príkazu pre procesy, pre ktoré má právomoc ukončiť ich. V systéme UNIX sa používa príkaz kill s parametrom číslo ukončovaného procesu pid, vo Windows možno prepnúť do správcu úloh a vybrať zo zoznamu proces, ktorý chceme zrušiť. Rozbeh činnosti pri štarte operačného systému je v princípe realizovaný tak, že najprv sa uložia do pamäte základné procedúry na obsluhu prerušení, potom sa vytvorí tabuľka procesov obsahujúca prvý proces zvyčajne nazývaný init a potom sa cyklickým prerušením spôsobovaným hodinami začne spúšťať plánovač procesov, ktorý na začiatku stále opakovane plánuje a spúšťa len ten jediný proces init. Tento proces sa pomocou volania služby fork začne množiť, tým vzniknú ďalšie procesy operačného systému a nakoniec vznikne proces, ktorý očakáva prihlásenie sa používateľa do systému. Ak používateľ zadá správne údaje (heslo), tak sa ten proces zmení na používateľský shell, ktorý

1 Paralelné procesy 1.15 VYKONATEĽNÝ SÚBOR očakáva príkazy z klávesnice. Ukončenie činnosti operačného systému je tzv. system shutdown, keď má byť počítač vypnutý (na príkaz človeka, alebo pri výpadku energie a podobne). Vtedy sa v systéme ukončia všetky procesy. Organizované ukončenie všetkých paralelne bežiacich procesov je dôležité na zamedzenie straty údajov, ktoré procesy spravujú v pamäti a pri ukončení potrebujú uložiť na disk. Okamžité prerušenie činnosti zložitých operačných systémov môže mať za následok stratu údajov pripojených používateľov a tiež nekonzistenciu informácií, ktoré si operačný systém ukladá pre svoju správu. Pri následnom spustení systému sa toto rozpoznáva a systém spúšťa procesy na kontrolu a opravu údajov. Vykonateľný súbor (executable file) je špeciálny súbor, ktorý obsahuje všetky informácie potrebné na spustenie programu ako bežiaceho procesu. Tento súbor sa podľa konvencie v operačných systémoch Windows označuje menom s príponou exe, klasický Unix ho pomenováva a.out, iné operačné systémy ho pomenovávajú ako ELF (Executable & Linkable object file Format). Obsah vykonateľného súboru je daný druhom operačného systému, pre ktorý bol vytvorený. V niektorých prípadoch (napríklad v Linuxe) možno spustiť vykonateľný súbor patriaci inému operačnému systému, ak je k dispozícii príslušné softvérové vybavenie. Vykonateľný súbor sa vytvára operáciou linkovania, ktorú vykonáva príslušný program (linker) a v princípe obsahuje tieto časti: Identifikačný kód, podľa ktorého operačný systém overuje, že je to naozaj súbor daného typu. V UNIXe sa tento kód nazýva magické číslo (magic number). Text programu, teda inštrukcie v strojovom kóde, získané kompiláciou zdrojového textu vytvoreného tvorcom programu. Inicializované a neinicializované dáta programu. Vložené (prilinkované) procedúry a pomocné programy, ktoré sú prevzaté z knižníc. Napríklad volanie funkcie printf( xyz ) sa pri linkovaní nahradí samotnou postupnosťou inštrukcií jej prekopírovaním z knižnice. Odkazy na iné zdroje, poskytujúce pre daný program inštrukcie a dáta. Pri spustení programu je vytvorený nový proces (vymenený, za pomoci horeuvedenej služby exec), pričom je čítaný obsah vykonateľného súboru, alokovaná pamäť a umiestňujú sa v nej dáta, prečítané z tohto súboru.

J.Štefanovič: Základy operačných systémov 1.16 1.3 SPRÁVA PARALELNÝCH PROCESOV CIELE PLÁNOVANIA Operačné systémy používajúce organizáciu prepínania paralelných procesov na jednom zdieľanom procesore sa nazývajú systémy so zdieľaním času (time sharing). Pri prepínaní procesov je žiaduce vhodné plánovanie poradia, v ktorom sa procesy opakovane spúšťajú, pričom toto poradie môže byť priebežne aktualizované podľa situácie v systéme, aby optimálne v každom okamihu splnilo tieto základné ciele plánovania: zabezpečiť interaktívnosť používateľských procesov (človek očakáva minimálne oneskorenie pri ovládaní systému), odsunúť menej súrne úlohy na menej exponovaný čas (kontrola systému, zálohovanie, posielanie dát a podobne), zabezpečiť procesy bežiace v reálnom čase proti výpadku toku dát (audio a video projekcia).

1 Paralelné procesy 1.17 KRITÉRIÁ PLÁNOVANIA Kritériá na efektívne plánovanie procesov sú: spravodlivosť (fairness) - aby sa pre každý proces poskytlo zodpovedajúce percento času procesora, efektívnosť (efficiency) - aby sa procesor nezdržiaval častým spúšťaním procesu, čakajúceho na pomalý vstup, obrat (turnaround) - aby čas života každého procesu bol štatisticky čo najkratší (pri úspešnom vykonaní všetkých jeho úloh), čas čakania (waiting time) - priemerný čas čakania procesu na časové kvantum, v ktorom bude spustený, priepustnosť (throughput) - aby sa za časovú jednotku dokončilo čo najviac procesov, rýchla odozva (response time) - aby interaktívny používateľ nečakal dlho na odozvu, keď manipuluje so svojim softvérom.

J.Štefanovič: Základy operačných systémov 1.18 PREEMPTÍVNE PLÁNOVANIE Na udržanie priepustnosti celého systému paralelne bežiacich procesov je potrebné ustrážiť optimálny počet procesov, ktoré vznikajú aktivitou používateľov a ich procesov. Tabuľka procesov, ktorú spravuje plánovač, je často implementovaná len ako statická údajová štruktúra, pretože činnosť plánovača musí byť stručná jeho kód sa často spúšťa a nesmie zbytočne zdržiavať systém. Ak sa počet spustených procesov v systéme blíži k hraničnej kapacite, systém musí začať prinajmenšom odmietať vykonanie obsluhy fork, pretože zaplnenie celej kapacity prináša riziko zablokovania systému v sieti vzťahov medzi procesmi. Pre domáci počítač je to problém skôr akademický, pre komunikačný server zabezpečujúci spojenie tisícov mobilných klientov alebo bankové operácie v reálnom čase, je to už vážna vec. Pri plánovaní procesov existujú aj také procesy, ktoré nemožno prerušiť inými procesmi, kým svoju činnosť nedokončia. Nie je napríklad možné posielať na tlačiareň striedavo výstup z rôznych procesov, vždy sa musí dokončiť tlač z jedného zdroja. Taký proces, ktorý možno prerušiť pred dokončením jeho činnosti, je tzv. preemptívny proces (preemptive: pre-empty označuje prerušiteľnosť pred vyprázdnením množiny svojich úloh). Proces objektívne neprerušiteľný je nepreemptívny (non-preemptive). Také plánovanie procesov, pri ktorom je každý spustený proces ponechaný aby dokončil svoju požadovanú akciu, sa nazýva nepreemptívne plánovanie. Čítankovým príkladom je obsluha tlačiarne proces vykonávajúci tlačenie dokumentu na papier určite nemôže byť prerušený iným procesom tlačiacim dokument, prinajmenšom počas tlačenia jedného listu papiera. V predošlých kapitolách uvedený preemptívny multitasking je tiež prerušovanie procesov pri zdieľaní spoločného prostriedku, ktorým je v tom prípade procesor. Zdieľanie procesora procesmi znamená, že raz na ňom beží jeden proces, inokedy ďalší. Ak je činnosť jadra operačného systému, vyvolaná prerušením alebo volaním služby nepreemptívna, tak jadro nemôže byť vo svojej činnosti prerušené, kým nevykoná danú službu. Jadro má však privilégium zakázať prerušenie na procesore a podržať si procesor pre seba, kým nevykoná všetku svoju činnosť, bez ohľadu na čas jej trvania. Plánovanie a spustenie ďalšieho procesu je vtedy odložené. Pri snahe vytvoriť pohotovejší a rýchlejší systém sa jadro môže implementovať po častiach preemptívne, t. j. jeho činnosť môže byť prerušená, ak sa vykonávanie jeho kódu dostane na také definované miesto, v ktorom možno činnosť prerušiť bez straty alebo dezorganizácie dát. Ďalším zvláštnym prípadom je tok multimediálnych dát - keď je žiaduce, aby zvuk z reproduktorov a filmový obraz nebol prerušovaný pri väčšej záťaži procesora spúšťaním mnohých ďalších procesov. Multimediálne procesy teda vyžadujú osobitný prístup pri plánovaní.

1 Paralelné procesy 1.19 SPÔSOBY PLÁNOVANIA ZÁKLADNÝ SPÔSOB PRIORITA Plánovač určuje poradie spúšťania jednotlivých procesov podľa zvoleného spôsobu plánovania (scheduling policy). Tu uvádzame niekoľko základných metód plánovania, ktoré možno rôznymi spôsobmi modifikovať alebo kombinovať. Výber metódy plánovania pre konkrétny operačný systém závisí od potrieb systému a následne určuje jeho správanie sa. Vzhľadom na to, že prepínanie a plánovanie procesov prebieha v systéme cyklicky neustále, musí ísť o jednoduché rýchlo vykonateľné algoritmy, aby sa užitočný výkon systému zbytočne neznižoval. Metóda plánovania ide Pešek okolo (round Robin) ja taká, keď procesy sú usporiadané do zoznamu a spúšťajú sa cyklicky podľa poradia v zozname. Každý proces je periodicky spúšťaný na rovnaké časové kvantum. Čas činnosti plánovača a čas trvania prepnutia kontextu predstavuje režijné náklady, ktoré možno vyjadriť ako percentuálny podiel z trvania jedného kvanta. Ak je čas trvania jedného kvanta dlhší, potom režijné náklady klesajú, ale procesy dlho čakajúce v rade nie sú schopné dostatočne rýchlo reagovať na vonkajšie signály. Pri krátkom trvaní kvanta sa síce všetky procesy javia ako dostatočne pohotové, stúpajú však režijné náklady a procesor počítača venuje relatívne príliš veľa času prepínaniu procesov a činnosti plánovača. Predchádzajúca metóda je pre všetky procesy príliš demokratická a nerozlišuje medzi procesmi, ktoré si vyžadujú rýchlejšie spracovanie a procesmi, ktoré môžu čakať dlhšie v rade. Pri metóde plánovania podľa priority (priority scheduling) možno využiť tento jednoduchý algoritmus: na začiatku má každý proces pridelené číslo podľa svojej priority. Spúšťa sa vždy proces s najvyšším číslom, počas jeho behu sa po každom časovom kvante jeho číslo znižuje a akonáhle je nižšie ako číslo niektorého iného čakajúceho procesu, spustí sa ten čakajúci proces. Keď čísla všetkých procesov dosiahnu nulu, nastavia sa na pôvodné počiatočné hodnoty a pokračuje sa v ďalšom kole. Napríklad tri procesy A, B, C s číslami A (5), B (3), C (2) sa vykonajú v takomto poradí: A: 5 4 3 2 - - - - - 1 (5 krát) B: - - - - 3 2 1 - - - (3 krát) C: - - - - - - - 2 1 - (2 krát) Druhá varianta riešenia: po procese B môže tiež ísť znovu proces A, pričom počet časových kvánt pridelených jednotlivým procesom zostane rovnaký v rámci každého cyklu plánovania, určený prioritou. Ak je medzi čakajúcimi procesmi v jednom okamihu viac adeptov s rovnakým číslom, môžu sa napríklad vyberať podľa poradia v zozname procesov - podľa predošlej metódy round robin. Okrem pevne pridelenej statickej priority možno použiť dynamickú prioritu, keď je nastavovaná podľa momentálnej situácie. Napríklad keď proces A zo svojho vyhradeného času strávil určité percento nečinným čakaním na pomalú udalosť (napríklad komunikácia s pomalým pamäťovým diskom), jeho priorita sa v nasledujúcom kole zníži. Ak sa dá v systéme stanoviť percento času, ktoré proces v jemu vyhradenej dobe strávil užitočnou činnosťou, jeho číslo priority pre

J.Štefanovič: Základy operačných systémov 1.20 nasledujúce kolo sa nastavuje s prihliadnutím na tento údaj. Prepočítavanie dynamickej priority sa nemusí diať po uplynutí každého časového kvanta, pre urýchlenie činnosti systému môže postačovať občasné prepočítanie po uplynutí určitého počtu časových kvánt. V operačnom systéme UNIX môže používateľský proces dobrovoľne znížiť svoju prioritu (príkazom nice), nemá však možnosť priamo ovplyvniť jej zvýšenie. PRIORITNÉ RADY Metóda viaceré rady (multiple queues) - v tomto prípade čakajú procesy vo viacerých radoch, pričom čakatelia umiestnení v prvom rade majú najvyššiu (rovnakú) prioritu a čakatelia umiestnení v poslednom rade majú najnižšiu. Procesy vyznačujúce sa vyššou aktivitou môžu byť postupne dynamicky premiestňované do radov s vyššou prioritou a pri opačnej situácii sú postupne presunuté do radov s nižšou aktivitou. Plánovanie v operačnom systéme môže byť napríklad usporiadané tak, že určitý počet radov s najvyššou prioritou obsadzujú len procesy patriace jadru operačného systému a ich priorita je statická (nie sú premiestňované medzi radmi), zatiaľ čo rady s nižšou prioritou sú vyhradené pre používateľské procesy a ich priorita je dynamická. Metóda najkratšia úloha najprv (shortest job first): ak možno vopred zistiť alebo odhadnúť, koľko času budú procesy bežať, tak tie najkratšie sa spúšťajú najprv. Ak sa každý proces necháva bežať bez prerušenia (nepreemptívne plánovanie) tak napríklad zoznam procesov trvajúcich 8, 4, 4 a 4 časové jednotky má pri dodržaní poradia ich spúšťania časy ukončovania procesov 8, 12, 16, 20. Priemerný čas čakania procesov na spustenie je potom 14 časových jednotiek. Ak je proces trvajúci 8 jednotiek spúšťaný ako posledný, tak priemerný čas čakania procesov na spustenie je len 11 časových jednotiek. Zistenie koľko budú procesy trvať sa môže vykonávať odhadom podľa predošlej histórie procesov. Ak proces v minulosti bežal T0 časových jednotiek, predtým to bolo T1 jednotiek a ešte predtým T2, možno urobiť odhad napríklad váhovaným priemerom, kde dávnejšie pozorovania procesu majú nižšiu váhu: Tx = 1/2 T0 + 1/4 T1 + 1/4 T2. ZÁRUKY PRI PLÁNOVANÍ Metóda zaručené plánovanie (guaranteed scheduling): Keď v operačnom systéme bežia procesy kontrolujúce nejakú technologickú činnosť v reálnom čase, tak nie je prípustné, aby mal proces kontrolujúci napríklad režim chemického reaktora dlhý čas čakania na svoje opakované spustenie z toho dôvodu, že sa v reaktore dlhší čas nič nedialo. Vtedy je žiaduce rozlišovať a oddelene aplikovať dve rôzne veci: algoritmus plánovania (scheduling algorithm) a pravidlá plánovania (scheduling policy).

1 Paralelné procesy 1.21 LITTLEHO VZOREC SPOOLING PROBLÉMY PLÁNOVANIA SNAHA O VYLEPŠENIE Každé zariadenie v počítači (napríklad disk) môže mať osobitný vlastný rad požiadaviek, alebo procesov, čakajúcich na jeho obsluhu (device queue). Do tohoto radu sa dočasne umiestňujú tie procesy, ktoré chcú so zariadením komunikovať. Po obslúžení sú z tohto radu vybraté a vrátené do ich pôvodného mechanizmu plánovania. Dĺžku čakajúceho radu procesov (a nielen procesov) vyjadruje tzv. Littleho vzorec (Little s formula): L = A. W, kde L je priemerná dĺžka radu (počet čakateľov), A je priemerná frekvencia príchodu nových čakateľov (počet/čas) a W je priemerný čas čakania v rade. Pri obsluhe tlačiarne (nepreemptívne zariadenie) možno obísť použitie rady čakajúcich procesov pomocou metódy tzv. spooling, kedy je vytvorený špeciálny adresár, do ktorého môže ľubovoľný proces zapísať súbor dát určený na vytlačenie. Jeden osobitný paralelne bežiaci systémový proces (printer daemon) tieto súbory postupne číta, posiela ich dáta na tlačiareň a prečítané súbory vymazáva. Je to teda jediný proces, splnomocnený komunikovať s tlačiarňou. Klasické algoritmy plánovania procesov prinášajú tieto problémy: prepočítavanie priority všetkých procesov zaťažuje systém (zaberá čas), nie je vopred zaručený presný čas odozvy ani dokončenia procesu, aplikácie majú malý vplyv na nastavovanie svojej priority, nekontroluje sa veľmi riziko preťaženia systému (počet spustených procesov), aj proces s vysokou prioritou vždy musí čakať na ďalší taký podobný, systém môže byť zahltený príchodom množstva požiadaviek naraz. V operačných systémoch boli navrhnuté rôzne vylepšené algoritmy plánovania, s cieľom odstrániť problémy. Uvedieme niektoré príklady: metóda dve a viac tried plánovania - procesy sú rozdelené aspoň do dvoch skupín a v každej skupine je iný algoritmus plánovania. Skupiny sa striedajú podľa pevne stanovenej schémy; metóda požičanie priority (priority lending) - ak proces s vyššou prioritou čaká na prostriedok obsadený procesom s nižšou prioritou, môže tomu procesu požičať svoju prioritu, aby sa tento skoršie dokončil. Navyše, ak je čakajúci proces s vyššou prioritou zablokovaný, k prostriedku sa pri prepínaní plánovačom môže medzitým dostať aj ďalší proces s nižšou prioritou. Tento jav sa nazýva inverzia priority; metóda spravodlivé plánovanie (fair share scheduling) - konkrétna skupina procesov má spoločne prídelené určité množstvo časových kvánt procesora a toto množstvo si procesy rozdeľujú medzi sebou podľa aktuálnej potreby. Ak tento objem času nie sú schopné spotrebovať,

J.Štefanovič: Základy operačných systémov 1.22 zvyšok sa pridelí inej skupine; metóda hroziaceho termínu (deadline-driven scheduling) - používa sa napríklad pre procesy spracovávajúce dáta v reálnom čase, pre ktoré plánovač zaručí ich opakované spúšťanie s daným maximálnym oneskorením. Keď sa blíži hraničný termín a proces ešte nebol spustený, tak plánovač začne napríklad zvyšovať prioritu procesu a postupne vykonávať aj ďalšie opatrenia, smerujúce k spusteniu toho procesu; metóda stanovenia kapacity systému - Plánovač prijme ďalší proces na vykonávanie len vtedy, ak môže zaručiť požadované termíny jeho spúšťania. Kalkulácia záruky sa urobí vopred, podľa toho aká je kapacita systému a aké procesy práve bežia. URGENTNOSŤ PROCESU Druhy procesov z hľadiska voľby stratégie ich plánovania môžu byť rozlíšené napríklad takto: hard real time - musí byť dodržaný najneskorší čas pre štart činnosti, soft real time - väčšinou má byť dodržaný (take výpadky nevadia), isochronous - procesy s periodickou činnosťou v presne definovaných intervaloch, ktoré je žiadúce dodržať (napr. prenos obrazu/zvuku v reálnom čase), real-time - neperiodické procesy, občasné činnosti, ktoré ale vyžadujú rýchle spracovanie, time sharing - občasné spustenie procesu je vhodné, batch jobs procesy, ktoré sa neponáhľajú. 1.4 VLÁKNA PROCES POZOSTÁVA Z JEDNÉHO ALEBO VIACERÝCH VLÁKIEN Riadiaci bod procesu vyjadruje tá inštrukcia, ktorá sa v procese vykonáva v danom okamihu. V doterajšom texte sme predpokladali, že proces má jeden riadiaci bod, ktorý sa v čase premiestňuje pozdĺž vykonávanej postupnosti inštrukcií. V rámci jedného procesu však môže existovať viac ako jeden riadiaci bod. Znamená to, že jeden proces môže v sebe obsahovať viacero nezávisle vykonateľných postupností

1 Paralelné procesy 1.23 inštrukcií, ktoré môžu bežať paralelne, pričom spoločne zdieľajú dáta a prostredie v rámci jedného procesu. Takéto nezávislé paralelne bežiace aktivity v rámci jedného procesu sa nazývajú vlákna (threads). Vlákna možno definovať aj tak, že sú to procesy, ktoré zdieľajú podstatné zdroje svojej existencie (pamäť, premenné, otvorené súbory, údaje o procese). Pokiaľ konkrétny operačný systém podporuje použitie vlákien, tak jeho služba fork má dve podoby: buď požiadame jadro systému aby vytvorilo nový proces, alebo nové vlákno. Ak je jadro systému požiadané, aby vytvorilo nové vlákno, tak nevzniká žiadny nový proces. Zaznamenajú sa len informácie o vytvorení ďalšieho riadiaceho bodu pre existujúci proces a plánovač procesov pri spúšťaní procesu musí ešte navyše rozhodnúť, ktoré vlákno v tomto procese spustí. Keďže všetky paralelne bežiace vlákna zdieľajú v rámci procesu všetky jeho dáta a prostriedky a môžu s nimi vzájomne súčasne manipulovať, je vecou tvorcuprogramátora procesu, aby zabezpečil bezkolíznu existenciu všetkých vlákien pohromade. Výhodou rozdelenia úlohy na paralelne bežiace vlákna namiesto paralelne bežiacich procesov je jednoduchá komunikácia a zdieľanie dát medzi vláknami, čo by bolo menej efektívne pri nahradení vlákien samostatnými procesmi. Rozparalelnenie úlohy na samostatne bežiace procesy sa potom môže použiť len pri opodstatnených dôvodoch. Vytvorenie nového procesu je pre jadro operačného systému zložitejšia činnosť ako len vytvorenie nového vlákna. Predovšetkým sa pri novom vlákne nemusí alokovať pamäť počítača pre ďalší samostatne existujúci proces. PRÍKLAD S TROMA VLÁKNAMI int V nasledujúcom príklade sa proces rozdelí na tri vlákna, reprezentované funkciami main(), vlakno1(), vlakno2(). Pri behu tohto procesu sa striedavo spúšťajú všetky tri vlákna a výstupom procesu je postupnosť striedajúcich sa znakov A, B. Spôsob striedania určuje nezávislý plánovač. Ak predpokladáme takú konvenciu, že pri skončení hlavného vlákna main() sa automaticky nútene ukončia všetky ostatné vlákna (teda celý proces), potom hlavné vlákno musí počkať na dokončenie ostatných vlákien. Synchronizácia tohto čakania je realizovaná pomocou premennej count. Keďže všetky vlákna existujú v rámci jedného procesu, všetky majú prístup k tejto globálnej premennej a môžu zmeniť jej stav. count=0; void main(void) { vytvor_vlakno(vlakno1); vytvor_vlakno(vlakno2); while(count<2); // cakam na obidve vlakna return; // vlakno main zanikne, proces sa zrusi }

J.Štefanovič: Základy operačných systémov 1.24 void vlakno1(void) { // obsahom cinnosti vlakna je tato funkcia for(int x=0;x<10000;x++) printf("a"); count++; return; // tu sa cinnost skonci, vlakno1 zanikne } void vlakno2(void) { // obsahom cinnosti vlakna je tato funkcia for(int x=0;x<10000;x++) printf("b"); count++; return; // tu sa cinnost skonci, vlakno2 zanikne } VLÁKNA NEMÁ KAŽDÝ OPERAČNÝ SYSTÉM Možné vzťahy procesov a vlákien v operačnom systéme: a) Operačný systém vlákna nepozná, pracuje len s procesmi, takže každý proces v tomto systéme obsahuje formálne len jedno vlákno (má len jeden riadiaci bod). b) Pre používateľské procesy vlákna nejestvujú, jestvujú však pre procesy patriace jadru operačného systému, čím sa implementácia jadra zjednodušuje (bezkolíznosť existencie vlákien je vecou správnej implementácie jadra). c) Systém rozlišuje procesy aj vlákna. Použitie vlákien existuje aj pre jadro a aj pre používateľské procesy. d) Pre používateľské procesy vlákna nejestvujú, používateľ však môže využiť programátorskú knižnicu, ktorá umožňuje pracovať s vláknami. Plánovač síce spúšťa len procesy a nepozná vlákna, ale ním spustený proces obsahuje implementované prostriedky knižnice, ktoré spôsobujú výber niektorého z vlákien. e) Operačný systém pozná len vlákna a nepozná vôbec procesy. Jeho implementácia má potom odlišnú koncepciu, skupiny súvisiacich vlákien majú spoločnú identitu ako jedna úloha (task). Príkladom je operačný systém Mach. FIBERS Existuje ešte pojem fibers, keď systém umožňuje rozdeliť vlákno na viacero činností, vykonávaných v kooperatívnom multitaskingu v rámci jedného vlákna.

1 Paralelné procesy 1.25 CVIČENIA PRÍKLAD 1.1 V systéme s preemptívnym plánovaním procesov, ktorý používa na plánovanie algoritmus Round Robin, sa naraz začnú vykonávať dva procesy A, B. Proces A potrebuje na svoje dokončenie 1 sekundu času procesora, proces B potrebuje 2 sekundy. K preplánovaniu dochádza každých 100 ms. Réžia na preplánovanie je 5 ms a je súčasťou kvanta. V akom čase sa skončí vykonávanie každého z týchto procesov, keď sa obidva začnú vykonávať v čase 0 a okrem nich v systéme nie je žiadny iný proces? Uvažujte všetky možnosti. Odpoveď Jedno časové kvantum trvá 100 ms a pozostáva z 5 ms réžie a 95 ms užitočného času pre činnosť procesu. Proces A potrebuje na svoje dokončenie 1000/95 časových kvánt a proces B potrebuje 2000/95 časových kvánt, čo je po zaokrúhlení na celé kvantá 11, resp. 22. Plánovanie typu Round Robin znamená, že sa procesy jednoducho striedajú a počas behu budú ich kvantá v nasledujúcom poradí: A B A B A B A B A B A B A B A B A B A B A B B B B B B B B B B B B Proces A skončil po svojom 11. kvante, čo je celkovo po 21. kvante od začiatku. Proces B skončil po 33. kvante od začiatku. Ak máme uvažovať všetky možnosti, tak v úlohe nie je stanovené, ktorý proces bol naplánovaný ako prvý a druhá možnosť je potom: B A B A B A B A B A B A B A B A B A B A B A B B B B B B B B B B B PRÍKLAD 1.2 Statické priority procesov su nastavené takto: proces A má prioritu 1 (najnižšiu), proces B má prioritu 2 a proces C má prioritu 3 (najvyššiu). Nakreslite priebeh plánovania procesov pre dvanásť časových kvánt, pomocou uvedeného algoritmu plánovania podľa priority. Odpoveď Ak použijeme algoritmus spomenutý v texte, tak pri každom časovom kvante dekrementujeme prioritu bežiaceho procesu a v ďalšom kvante spúšťame vždy ten proces, ktorý ma prioritu najvyššiu. Ak sú priority zhodné, rozhoduje algoritmus Round Robin. Keď priority všetkých procesov dosiahnu hodnotu 0, tak sa znovu nastavia na počiatočnú hodnotu a cyklus sa opakuje. Proces C beží behom jedného cyklu plánovania 3-krát, proces B beží 2-krát a proces A prebehne jedenkrát.

J.Štefanovič: Základy operačných systémov 1.26 1. cyklus 2. cyklus A 1 1 1 1 1 0 1 1 1 1 1 0 B 2 2 1 1 0 0 2 2 1 1 0 0 C 3 2 2 1 1 1 3 2 2 1 1 1