Přepínač kontextu - Context switch

Při práci na počítači je kontextový přepínač proces ukládání stavu procesu nebo vlákna , aby jej bylo možné obnovit a pokračovat v provádění později. To umožňuje více procesům sdílet jednu centrální procesorovou jednotku (CPU) a je základní funkcí víceúlohového operačního systému .

Přesný význam fráze „přepnutí kontextu“ se liší. V kontextu více úkolů odkazuje na proces ukládání stavu systému pro jeden úkol, takže úkol lze pozastavit a pokračovat v jiném úkolu. Kontextové přepnutí může také nastat v důsledku přerušení , například když úkol potřebuje přístup k diskovému úložišti , čímž uvolní čas procesoru pro jiné úkoly. Některé operační systémy také vyžadují přepínání kontextu pro přesun mezi úkoly v uživatelském režimu a režimu jádra . Proces přepínání kontextu může mít negativní dopad na výkon systému.

Náklady

Kontextové přepínače jsou obvykle výpočetně náročné a velká část návrhu operačních systémů spočívá v optimalizaci používání kontextových přepínačů. Přechod z jednoho procesu na druhý vyžaduje určitý čas na správu - ukládání a načítání registrů a paměťových map, aktualizace různých tabulek a seznamů atd. Co je vlastně součástí přepínání kontextu, závisí na architekturách, operačních systémech a počet sdílených zdrojů (vlákna, která patří do stejného procesu, sdílejí mnoho zdrojů ve srovnání s nesouvisejícími nespolupracujícími procesy). Například v jádře Linuxu přepínání kontextu zahrnuje přepínání registrů, ukazatel zásobníku (je to typický registr zásobníku ukazatelů ), počítadlo programů , vypláchnutí překladové vyrovnávací paměti lookaside (TLB) a načtení tabulky stránek dalšího procesu, který se má spustit (pokud starý proces sdílí paměť s novým). Analogické přepínání kontextu se navíc děje mezi uživatelskými vlákny , zejména zelenými vlákny , a často je velmi lehké, šetří a obnovuje minimální kontext. V extrémních případech, jako je přepínání mezi goroutines v Go , přepínání kontextu je ekvivalentní Coroutine výtěžku, který je pouze o málo dražší než podprogramu volání.

Přepínací pouzdra

Pro přepnutí kontextu existují tři potenciální spouštěče:

Multitasking

Nejčastěji v rámci některého plánovacího schématu musí být jeden proces přepnut z CPU, aby mohl běžet jiný proces. Tento kontextový přepínač může být spuštěn tím, že se proces stane nespuštěným, například čekáním na dokončení operace I/O nebo synchronizace . V systému preventivních multitaskingů může plánovač také vypnout procesy, které jsou stále spustitelné. Aby se zabránilo tomu, že ostatní procesy budou trpět nedostatkem času CPU, preventivní plánovači často konfigurují přerušení časovače, aby se spustilo, když proces překročí časový úsek . Toto přerušení zajistí, že plánovač získá kontrolu k provedení přepnutí kontextu.

Přerušení manipulace

Moderní architektury jsou řízeny přerušením . To znamená, že pokud CPU například požaduje data z disku, nemusí být zaneprázdněn-čekat, až čtení skončí; může vydat požadavek (na I/O zařízení) a pokračovat v dalším úkolu. Když je čtení ukončeno, CPU může být přerušeno (v tomto případě hardwarem, který odešle požadavek na přerušení PIC ) a předloží se ke čtení. Pro přerušení je nainstalován program nazývaný obsluha přerušení a je to obsluha přerušení, která zpracovává přerušení z disku.

Když dojde k přerušení, hardware automaticky přepne část kontextu (alespoň natolik, aby se obsluha mohla vrátit k přerušenému kódu). Obslužný program může uložit další kontext v závislosti na podrobnostech konkrétního návrhu hardwaru a softwaru. Často se mění pouze minimální část kontextu, aby se minimalizovalo množství času stráveného zpracováním přerušení. Jádro není potěr nebo naplánovat zvláštní proces zvládnout přerušení, ale místo toho psovoda Vykoná v (často částečné) kontextu založena na začátku obsluhy přerušení. Jakmile je služba přerušení dokončena, obnoví se kontext platný před tím, než k přerušení došlo, takže přerušený proces může pokračovat v provádění ve správném stavu.

Přepínání režimu uživatele a jádra

Při přechodu systému mezi uživatelským režimem a režimem jádra není nutné přepínání kontextu; přechodu režimu , není sama o sobě přepnutí kontextu. V závislosti na operačním systému však v tuto chvíli může také dojít k přepnutí kontextu.

Kroky

V přepínači musí být stav aktuálně prováděného procesu nějak uložen, takže když je přeplánován, tento stav lze obnovit.

Stav procesu zahrnuje všechny registry, které proces může používat, zejména čítač programů , plus jakákoli další data specifická pro operační systém, která mohou být nezbytná. To je obvykle uloženo v datové struktuře nazývané procesní řídicí blok (PCB) nebo switchframe .

PCB může být uloženo na zásobníku jednotlivých procesů v paměti jádra (na rozdíl od zásobníku volání v uživatelském režimu ), nebo pro tyto informace může existovat nějaká konkrétní datová struktura definovaná operačním systémem. Rukojeť na PCB je přidán do fronty procesů, které jsou připraveny ke spuštění, často nazýván připravenou frontu .

Vzhledem k tomu, že operační systém účinně pozastavil provádění jednoho procesu, může poté přepínat kontext výběrem procesu z připravené fronty a obnovením jeho DPS. Přitom se načte programový čítač z DPS, a tak provádění může pokračovat ve zvoleném procesu. Priorita procesu a vlákna může ovlivnit, který proces je vybrán z připravené fronty (tj. Může to být prioritní fronta ).

Příklad

S ohledem na obecnou aritmetickou operaci sčítání A = B+1. Instrukce je uložena v registru instrukcí a čítač programu je zvýšen. A a B se čtou z paměti a jsou uloženy v registrech R1, R2. V tomto případě se B+1 vypočítá a zapíše do R1 jako konečná odpověď. Tato operace, protože existují sekvenční čtení a zápisy a nedochází k čekání na použitá volání funkcí , proto v tomto případě neprobíhá žádné přepínání/čekání kontextu.

Některé speciální pokyny však vyžadují systémová volání, která vyžadují přepnutí kontextu pro procesy čekání/spánku. Pro kontextové přepnutí do režimu jádra se používá obslužný program systémových volání . Funkce zobrazení (data x) může vyžadovat data x z disku a ovladač zařízení v režimu jádra, proto funkce display () přejde do režimu spánku a čeká na operaci ČTENÍ, aby získala hodnotu x z disku , což způsobí, že program počkat a čekat na volání funkce do uvolněného nastavení aktuální příkaz přejít do režimu spánku a počkat, až ho syscall probudí. Aby však byla zachována souběžnost, musí program znovu spustit novou hodnotu a proces spánku znovu společně.

Výkon

Samotné přepínání kontextu má náklady na výkon, kvůli spuštění plánovače úloh , vyprázdnění TLB a nepřímo kvůli sdílení mezipaměti CPU mezi více úkoly. Přepínání mezi vlákny jednoho procesu může být rychlejší než mezi dvěma samostatnými procesy, protože vlákna sdílejí stejné mapy virtuální paměti , takže vyprázdnění TLB není nutné.

Čas na přepnutí mezi dvěma samostatnými procesy se nazývá latence přepínání procesů . Čas přepnutí mezi dvěma vlákny stejného procesu se nazývá latence přepínání vláken . Doba od generování hardwarového přerušení do doby obsluhy přerušení se nazývá latence přerušení .

Přepínání mezi dvěma procesy v operačním systému s jediným adresním prostorem může být rychlejší než přepínání mezi dvěma procesy v operačním systému se soukromými adresními prostory pro každý proces.

Hardware vs. software

Přepínání kontextu lze provádět především softwarem nebo hardwarem. Některé procesory, jako Intel 80386 a jeho nástupci, mají hardwarovou podporu pro kontextové přepínače pomocí speciálního datového segmentu označeného jako segment stavu úloh (TSS). Přepnutí úkolu lze explicitně spustit pomocí instrukce CALL nebo JMP cílené na deskriptor TSS v tabulce globálního deskriptoru . K tomu může dojít implicitně při přerušení nebo výjimce, pokud je v tabulce deskriptoru přerušení (IDT) brána úloh . Když dojde k přepnutí úlohy, CPU může automaticky načíst nový stav z TSS.

Stejně jako u jiných úkolů prováděných v hardwaru by se dalo očekávat, že to bude poměrně rychlé; běžné operační systémy, včetně Windows a Linux , však tuto funkci nepoužívají. Je to hlavně ze dvou důvodů:

  • Hardwarové přepínání kontextu neuloží všechny registry (pouze obecné registry, nikoli registry s plovoucí desetinnou čárkou -i když se TSbit automaticky zapne v CR0 řídicím registru , což má za následek chybu při provádění pokynů s plovoucí desetinnou čárkou a dává OS možnost podle potřeby uložte a obnovte stav s plovoucí desetinnou čárkou).
  • Související problémy s výkonem, např. Přepínání kontextu softwaru může být selektivní a ukládat pouze ty registry, které je třeba ukládat, zatímco přepínání kontextu hardwaru ukládá téměř všechny registry, ať už jsou vyžadovány nebo ne.

Viz také

Reference

externí odkazy