Obsluha přerušení

Z Wikipedie, otevřené encyklopedie

Obsluha přerušení (zkratka ISR, anglicky interrupt handler nebo též interrupt service routine), je v informatice speciální procedura, která je v operačním systému vyvolána při obsluze přerušení. Přerušení je asynchronní událost, při jejímž příchodu je přerušena činnost procesoru, je vyvolána obsluha přerušení, a poté činnost procesoru pokračuje na místě, kde bylo přerušení vyvoláno. Obsluha přerušení je obvykle součástí ovladačů zařízení, které se instalují do operačního systému kvůli obsluze připojených hardwarových zařízení (tzv. vnější přerušení), ale slouží též pro obsluhu přerušení vyvolaných uvnitř procesoru (tzv. vnitřní přerušení) a softwarových přerušení vyvolaných speciální strojovou instrukcí.

Obsluha přerušení[editovat | editovat zdroj]

Přerušení je původně asynchronní mechanismus, pomocí kterého pomalá vstupně-výstupní zařízení získávala pozornost procesoru nezávisle na právě prováděné činnosti.[1] Když pásková jednotka nebo pevný disk dostane pomocí strojových I/O instrukcí za úkol přečíst určitá data, nemusí procesor (právě prováděný program) čekat, až pomalé zařízení příslušná data připraví pro vyzvednutí. Díky existenci přerušení může procesor pokračovat v jiné činnosti pomocí převedení procesu ze stavu běžící do stavu blokovaný (viz článek Proces (program)). V okamžiku, kdy jsou data v zařízení připravena (typicky ve vyrovnávací paměti), vyvolá zařízení přerušení. Procesor dokončí právě prováděnou strojovou instrukci a pomocí tabulky přerušení je vyvolána obsluha přerušení (ISR) pro zařízení, které o přerušení požádalo.

Obsluha přerušení je obvykle součástí ovladače zařízení. Na svém začátku musí obsluha přerušení nejprve na vhodné místo v operační paměti uložit stav procesoru a jeho registry, aby přerušený proces po návratu nic nepoznal (aby nebyl narušen přerušený výpočet). Pro uložení těchto informací je možné použít speciální strojovou instrukci, avšak častěji je používána sada běžných instrukcí, protože hardwarová podpora je buď pomalá nebo neúplná. Po uložení stavu procesoru a registrů, které obsluha přerušení bude používat, dojde k vlastní obsluze zařízení, při které jsou z vyrovnávací paměti zařízení odebrána data (viz příklad výše) nebo naopak doplněny další instrukce a data (například u grafické karty).

Po provedení obsluhy zařízení je obnoven stav procesoru a procesor pokračuje ve vykonávání programu následující instrukcí v místě, kde došlo k přerušení. Přerušený program tak (až na zpoždění) nepozná, že byl přerušen.

Rozdělení obsluhy přerušení[editovat | editovat zdroj]

Obsluha vstupně-výstupního zařízení je typicky časově kritická operace, která nemůže být přerušena (z důvodu časování komunikace pomocí I/O instrukcí), protože by příslušný hardware mohl ztratit data (nová data by ve vyrovnávací paměti přepsala starší, o které by se muselo znovu žádat) a podobně (některá zařízení vyžadují přesně časované souslednosti pokynů, mohlo by dojít k předání neúplných instrukcí atd). Proto je nutné během vykonávání obsluhy přerušení zakázat přerušení (vykonávání ISR není možné přerušit) a povolit ho až na konci provádění obsluhy přerušení. V takovém případě však dochází v operačním systému k velkým latencím (zpožděním), kdy počítač během dlouhé obsluhy přerušení není schopen vykonat jinou činnost (například obsluhu myši, překreslování obrazovky a podobně), což uživatel vnímá negativně (systém se „zasekává“).

Aby nedocházelo k dlouhým prodlevám při obsluze přerušení (a například nebyla ztrácena data z kritických zařízení při obsluze méně významných zařízení), je obvykle v operačním systému rozdělena obsluha přerušení na dvě části (například v jádře linuxu).[2] První část obsluhy přerušení (anglicky First-Level Interrupt Handler (FLIH), označována též jako hard interrupt handlers nebo fast interrupt handlers) provede jen nejnutnější úkoly, zaregistruje v systému činnosti, které je možné udělat později a skončí.

Druhá část obsluhy přerušení (anglicky Second-Level Interrupt Handlers (SLIH), slow/soft interrupt handlers, v Linuxu bottom half handlers nebo deferred procedure call, tj. odložené volání procedury) je prováděna později, kdy je možné ji provést v lépe naplánovaném čase. Odloženým způsobem se typicky zpracovávají data od/pro zařízení, které dodává větší objemy dat (síťová karta, pevný disk). V takovém případě jsou v první části obsluhy přerušení nakopírována připravená data ze zařízení do operační paměti a druhá část obsluhy přerušení se věnuje jejich vlastnímu zpracování, například doručení dat do paměťového prostoru cílového programu.

Rozdělením obsluhy přerušení je možné výrazným způsobem snížit latenci systému a zvýšit jeho průchodnost. Využívají ji všechny moderní operační systémy (Microsoft Windows, Linux, atd.). Pokud by tato možnost nebyla využita, mohlo by u počítačů s vyšším I/O zatížením docházet ke ztrátám dat z důvodu jejich přepsání ve vyrovnávacích pamětech s omezenou velikostí, protože by systém trávil většinu času v nepřerušitelných dlouhých obsluhách přerušení. Operační systém reálného času (RTOS) tuto techniku používá, aby splnil požadavky na nízkou latenci.

Polling[editovat | editovat zdroj]

Obsluha vstupně-výstupní zařízení je typicky vyvolávána přerušením. Pro některá velmi pomalá zařízení není však použití přerušení nezbytné, a proto se pro ně používá režim dotazování (polling), což znamená obsluhu zařízení synchronním způsobem.

Existují také příliš rychlá a nízkoúrovňová zařízení přenášející krátkodobě velké množství dat, pro která má obsluha přerušení příliš velkou režii a je nutné je v určitých situacích ovládat přímo, někdy s použitím pollingu – některé ovladače zařízení (například vysokorychlostních síťových karet) obsahují podporu pollingu a do tohoto režimu přecházejí automaticky při dosažení určité míry I/O zátěže.

Vlákna přerušení[editovat | editovat zdroj]

Některé operační systémy (například Solaris, Mac OS X, WinCE a FreeBSD) používají odlišný způsob obsluhy přerušení, který se označuje jako vlákna přerušení (anglicky interrupt threads). Obsluha přerušení je realizována jako samostatné vlákno (proces, kernel thread) s vysokou prioritou, které má povoleno přerušení, ale co je důležitější, může být blokováno pomocí mutexů. Takové řešení značně zjednodušuje zamykání v jádře. Vlákno může také být přerušeno jiným vláknem s vyšší prioritou.

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku interrupt handler na anglické Wikipedii.

  1. KOLÁŘ, Petr. Operační systémy [online]. [cit. 2018-09-07]. S. 12. Dostupné v archivu pořízeném dne 2014-07-14. 
  2. http://www.tldp.org/LDP/tlk/kernel/kernel.html

Literatura[editovat | editovat zdroj]

  • KOLÁŘ, Petr. Operační systémy [online]. Liberec: 2005-02-01 [cit. 2008-08-30]. S. 7. Dostupné v archivu pořízeném dne 2014-07-14. 

Související články[editovat | editovat zdroj]