Přepnutí kontextu

Přepnutí neboli změna kontextu (anglicky context switch) je operace, při níž víceúlohový operační systém přepíná řízení mezi procesy. Při tom je potřeba uložit aktuální stav CPU odpovídající doposud běžícímu procesu a obnovit stav CPU pro pokračování druhého procesu. K tomuto ději dochází v moderních operačních systémech mnohokrát za sekundu. Přepnutí kontextu může být na některých procesorech časově poměrně náročná operace, proto se ji operační systémy snaží maximálně optimalizovat. Snazší může být přepínání mezi vlákny téhož procesu. Jaké činnosti se provádějí při přepínání kontextu, závisí na procesoru a operačním systému.

Co je to kontext

Kontext je stav procesoru (především obsah registrů), případně dalších částí počítače (koprocesoru), který je nutné uchovat, aby bylo možné přepnout na provádění jiného procesu a později přepnout zpět na původní proces, aniž by došlo k narušení jeho činnosti. Stav procesoru se obvykle ukládá do paměti přidělené procesu, často na zásobník procesu, nebo do předem 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ím přepnutí kontextu neukládají ani nenačítají, ale je nutné jejich obsah explicitně nebo implicitně zneplatnit, aby došlo k jejich novému naplnění. To je příčinou, proč je přepnutí kontextu na moderních procesorech tak „drahé“ (časově náročné) – zvláště pokud dojde ke změně adresového prostoru, jak se děje při přepnutí procesů na rozdíl od přepnutí vláken.

Kdy dochází k přepnutí kontextu

K přepnutí kontextu může dochází ve třech případech:

Multitasking

Nejčastěji dochází k přepnutí 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.

Přepnutí mezi uživatelským a jaderným režimem

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

Programové a hardwarové přepnutí 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é přepnutí 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 procesorů mají podporu pro současné uchovávání několika kontextů, která umožňuje velmi rychlé přepínání kontextů bez potřeby uložit kontext jednoho procesu do paměti a načíst kontext jiného procesu. Extrémním případem je sudová (barrel) procesorová architektura, která při každém cyklu přepíná mezi vlákny.

Literatura

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