Multitasking

Z MediaWiki SPŠ a VOŠ Písek
Skočit na navigaci Skočit na vyhledávání
Verze k tisku již není podporovaná a může obsahovat chyby s vykreslováním. Aktualizujte si prosím záložky ve svém prohlížeči a použijte prosím zabudovanou funkci prohlížeče pro tisknutí.

Multitasking (z angličtiny, multi = mnoho, task = úloha) označuje v informatice schopnost operačního systému provádět (přinejmenším zdánlivě) několik procesů současně (tzv. víceúlohový systém). Jádro operačního systému velmi rychle střídá na procesoru běžící procesy (tzv. změna kontextu), takže uživatel počítače má dojem, že běží současně.

Dnešní operační systémy jsou typicky víceúlohové – sem patří např. Microsoft Windows, Linux i Mac OS X. Naopak DOS je příkladem jednoúlohového systému, na kterém vždy běží pouze jediný program a teprve po jeho ukončení je možné spustit jiný.

Multiprogramování

Multiprogramování (anglicky multiprogramming) je technika vícenásobného zpracování, kdy se zdroje počítače dělí mezi více úloh. V počátcích bylo multiprogramování řešeno tak, že se úlohy vystřídaly v běhu v okamžiku, kdy jedna z nich čekala na pomalejší periferii, až dokončí vstupně-výstupní operaci (požadavek na tisk, čtení z pásky, disku a podobně). V dnešní době operační systém střídá úlohy v rychlém sledu, aby obsluha počítače mohla se všemi plynule pracovat. Multiprogramování tak v současné době využívá multitasking jako hlavní nástroj.

Programátor využívá multitasking zcela přirozeným způsobem, nemusí ho ve svém programu nijak řešit. Naopak může programovat tak, že předpokládá současný běh více procesů zároveň, využívá komunikaci mezi procesy, může problém vyřešit několika samostatnými programy, které jsou spuštěny současně a podobně.

Implementace

V počítači obvykle není k dispozici tolik procesorů, kolik úloh chceme spustit zároveň. Proto není možné zajistit, aby všechny spuštěné úlohy běžely současně. Místo toho je zajištěno, že se běžící úlohy na procesoru (resp. procesorech) počítače velmi rychle střídají a vytváří se tak zdání jejich současného běhu. Čas, po který je umožněno každé úloze běžet, se nazývá časové kvantum.

Na obrázku vpravo jsou znázorněny úlohy A, B a C, které se střídají v běhu na jednom procesoru, přičemž je naznačeno, že úloha může běžet kratší dobu, než je maximální časové kvantum.

Podle způsobu přidělování a odebírání časových kvant úlohám se rozlišují dva základní způsoby multitaskingu:

  • nepreemptivní multitasking
  • preemptivní multitasking

Nepreemptivní multitasking

Nepreemptivní multitasking vyžaduje aktivní spoluúčast běžících úloh. Každá úloha je povinna dostatečně často systémovým voláním předat řízení zpět operačnímu systému, který díky tomu může spustit jinou úlohu, která se po chvíli opět dobrovolně vzdá procesoru atd. Výhodou řešení je jednodušší implementace operačního systému. Podstatnou nevýhodou je skutečnost, že chybně naprogramovaná úloha, která nevrátí řízení zpět operačnímu systému, způsobí úplné zastavení systému i ostatních úloh.

Microsoft Windows, které nepoužívaly 32bitové jádro NT (tj. Windows 3.x, Windows 95, Windows 98), používaly nepreemptivní multitasking. Z marketingových důvodů byl však označován jako kooperativní multitasking s tím, že úloha, která byla na popředí (tj. měla aktivní okno), dostávala větší časová kvanta, než ostatní úlohy (které uživatel přímo neovládal, a proto mu to nevadilo, naopak systém vypadal jako výkonnější). Ve Windows 2.x (vydané v roce 1988) a novějších bylo možné samostatně spouštět více DOS aplikací, které běžely v preemptivním multitaskingu, ale vlastní Windows aplikace běžely v kooperativním multitaskingu, takže chybně naprogramovaná aplikace způsobila „zatuhnutí“ celého systému. Nepreemptivní multitasking používal též Mac OS (používaný před Mac OS X) a RISC OS.

Preemptivní multitasking

V preemptivním multitaskingu o přidělování a odebírání procesoru jednotlivým úlohám plně rozhoduje operační systém. V pravidelných intervalech (typicky zhruba 100× až 1000× za sekundu) přeruší provádění běžícího programu, vyhodnotí aktuální situaci (které úlohy žádají o přidělení procesoru, jejich priority atd.) a nechá běžet buď opět úlohu, kterou přerušil, nebo jinou úlohu, která má zájem o přidělení procesoru. I v preemptivním multitaskingu však může úloha dobrovolně požádat o přepnutí kontextu a vzdát se zbytku svého kvanta (úloha takzvaně „usne“ nebo se zablokuje provedením pomalé vstupně-výstupní operace, jako je například čtení dat z pevného disku).

Preemptivní multitasking používají Windows 95 (jen pro 32bitové programy, zbytek běží nepreemptivně). Plně preemptivní je až řada Windows NT. Dále ho již od svého vzniku používá Mac OS X, unixová jádra (včetně Linuxu) a další operační systémy.

Výhodou tohoto řešení je, že nedochází k „zatuhnutí“ počítače, neboť i v případě, že se úloha zacyklí, odebere operační systém pomocí časovače dané úloze řízení a přidělí procesor jiné úloze. Nevýhodou je složitější implementace operačního systému a nutnost hardwarové podpory v procesoru počítače (viz privilegovaný režim).


Atomické operace

U některých operací musí být zaručeno, že proběhnou celé, že jejich provádění nebude v polovině přerušeno např. přepnutím na jinou úlohu. Takové operace se označují jako atomické. Každá atomická operace musí proběhnout buď celá, nebo vůbec. Příkladem atomické operace je např. použití semaforu či jiného synchronizačního primitiva. Mezi zjištěním jeho stavu a následnou změnou nesmí být úloha přerušena, protože úloha, která by pak dostala řízení, by mohla stav semaforu změnit a došlo by k chybnému chování.

Příklad:

  • Proces kontroluje, zda je na semaforu signál volno,
  • Proces zjistí, že ano, proto se chystá nastavit stůj a vpustit vlak na trať.
  • V tu chvíli ovšem dojde k přepnutí na jinou úlohu.
  • Druhá úloha zkontroluje, že na semaforu je signál volno, nastaví stůj a z druhé strany vpustí vlak na trať.
  • Dojde k přepnutí zpět na první úlohu.
  • Ta dokončí nastavení na stůj a vpustí vlak na trať, čímž dojde ke kolizi.

U kooperativního multitaskingu je atomicita takových operací zaručena prostě tím, že se v jejím průběhu nevolají systémové funkce, které by umožnily přepnutí kontextu. Jelikož nikdy jindy k přepnutí dojít nemůže, je tím zaručena správná funkce. U preemptivního multitaskingu je naopak potřeba takovému nevhodnému přepnutí explicitně bránit - aplikace používají synchronizační primitiva implementovaná buď jako služby operačního systému, nebo s využitím hardwarové podpory. U skutečného multitaskingu, tzn. při práci na více procesorech, se atomicita operací zajišťuje pouze pomocí hardwarových prostředků: procesor poskytuje instrukce současně zjišťující a měnící stav paměti, které jsou nejen atomické z hlediska samotného procesoru, ale navíc vyvolají hardwarovou synchronizaci mezi procesory. V dřívějších systémech postačovalo „zamknout“ paměťovou sběrnici, tedy zabránit ostatním procesorům v přístupu k paměti. Moderní systémy vyžadují navíc zneplatnit části cache ostatních procesorů.

Zdroj: http://cs.wikipedia.org

--Bkolesnicenko 11. 6. 2010, 08:19 (UTC)