Přepnutí kontextu

Z Wikipedie, otevřené encyklopedie

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í stav CPU. Tento děj se u moderních CPU 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

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

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

Multitasking

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 procesor 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í

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

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

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

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