Změna kontextu

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Změna kontextu (anglicky context switch) je operace, při níž multitaskingový operační systém přepíná řízení mezi procesy. Při tom se ukládá a načítá aktuální stavu procesoru. Tento děj se u moderních procesorů opakuje mnohokrát za sekundu. Změny kontextu jsou obvykle výpočetně intenzivní a hodně plánované a operační systémy jsou k tomu optimalizované. Změnou kontextu můžeme myslet změnu kontextu registrů, vláken, úloh a procesů. Ke které změně kontextu dojde, záleží na procesoru nebo operačním systému.

Co je to kontext[editovat | editovat zdroj]

Pod tímto pojmem si můžeme představit stav procesoru (obsah registrů), stav případného koprocesoru, případně i stav dalších zařízení v momentě kdy dojde ke změně kontextu. Tento současný stav procesoru se ukládá buď na zásobník procesu, nebo do připravené oblasti dat v adresním prostoru procesu.

Do kontextu můžeme zahrnout i obsahy různých cache procesoru (např L1 cache nebo TLB): ty se sice při vlastní změně neukládají ani nenačítají, ale změna kontextu explicitně nebo implicitně zneplatní jejich obsah a nutnost jejich nového naplnění patří mezi příčiny, proč je přepnutí kontextu na moderních procesorech tak „drahé“ (časově náročné) - zvláště pokud se změní adresový prostor, jak se děje při přepnutí procesů na rozdíl od přepnutí vláken.

Kdy dochází ke změně kontextu[editovat | editovat zdroj]

Ke změně kontextu dochází ve třech případech.

Multitasking[editovat | editovat zdroj]

Nejčastěji dochází ke změně kontextu při plánování procesů, kdy je nutné ukončit běh jednoho procesu a vybrat jiný, kterému bude proces následně přidělen. V preemptivních multitaskingových operačních systémech poskytuje plánovač každé úloze procesor na určitou dobu, která se nazývá Time slice.

Jestliže proces neodevzdá CPU dobrovolně (např. voláním vstupně/výstupní operace), je jeho vykonávání přerušeno příchodem přerušením od časovače a operační systém místo něj může spustit další proces, takže se procesy čekající na přidělení procesoru vystřídají. Na víceprocesorovém systému se může stát, že jeden z procesorů je trvale přidělen výpočetně náročnému procesu, zatímco ostatní procesy včetně jádra operačního systému používají ostatní procesory.

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

Některé architektury (jako třeba architektura IBM PC založená na procesory architektury x86) jsou řízeny přerušením. To znamená, že pokud procesor vyžaduje z disku nějaká data, nemusí se zatěžovat čekáním, než čtení skončí, stačí podat žádost a pokračovat s jinou operací; když čtení skončí, řadič disku vygeneruje přerušení, které v procesoru spustí část operačního systému zvanou obsluha přerušení.

Je jasné, že je nutné přepnout kontext, když je vydáno přerušeni: stav právě běžícího procesu musí být odložen, aby obsluha přerušení mohla být vykonána.

Změna mezi uživatelským a jaderným režimem[editovat | editovat zdroj]

Když si operační systém vyžádá změnu mezi uživatelským režimem (user mode) a jaderným režimem (kernel mode), není změna kontextu potřebná. Tato změna není změnou kontextu, avšak operační systém může v tento okamžik změnu kontextu provést.

Programová a hardwarová změna kontextu[editovat | editovat zdroj]

Přepínaní kontextu může být primárně prováděno softwarem nebo hardwarem. Některé procesory jako Intel 80286 a vyšší mají hardwarovou podporu pro přepínání kontextu, použitím speciálního datového segmentu TSS (task state segment). Při přepnutí úlohy nastane to, že CPU může automaticky načíst nový stav z TSS (implicitně následuje volání instrukcí odkazujících na bránu úloh (task gate), nebo explicitně následuje přerušení či výjimky). V porovnání s ostatními úlohami vykonávanými v hardwaru by tato měla být poměrně rychlá, nicméně tradiční operační systémy jako třeba Windows nebo Linux tuto vlastnost nepoužívají. To hlavně důsledkem těchto dvou důvodů: První je, že hardwarová změna kontextu neuloží všechny registry které je zapotřebí uložit, jako třeba registry s plovoucí řádovou čárkou (přestože je TS bit automaticky nastaven v kontrolním registru CR0, mající za následek chybu při provádění instrukci s plovoucí řádovou čárkou, která dává operačnímu systému možnost ukládání a načítání stavu plovoucí řádové čárky) a naopak ukládá registry které nemusí být nutné ukládat (segmentové registry). Druhým problémem je, že rychlost hardwarového přepnutí není ve skutečnosti o tolik větší než u přepnutí softwarového.

Některé architektury obsahují logiku aby dovolila existenci více hardwarových kontextů současně, eliminují potřebu ukládat a načítat kontext procesoru do paměti na změnu kontextu. Extrémní případ je sudová (barrel) procesorová architektura, která přepíná mezi vlákny při každém cyklu.

Literatura[editovat | editovat zdroj]

KOLÁŘ, Petr. Operační systémy [online]. Liberec: 2005-02-01, [cit. 2008-08-30]. Dostupné online.