Přepínání kontextu
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 31. ledna 2019; kontroly vyžadují
7 úprav .
Kontextové přepínání ( anglicky context switch ) - v multitaskingových OS a prostředích - proces ukončení provádění jedné úlohy (procesu, vlákna, vlákna) procesorem při zachování všech potřebných informací a stavu nutných pro následné pokračování z přerušeného místa a obnovení a načtení stavu úlohy, který má být proveden procesorem.
Procedura přepínání kontextu zahrnuje tzv. plánování úloh - proces rozhodování, na kterou úlohu přenést řízení.
Popis
Přepínač kontextu uloží a obnoví následující informace:
- Registrovat kontext obecných registrů (včetně registru příznaků )
- Kontext stavu registru s plovoucí desetinnou čárkou ( x86 )
- Stav registru SSE , AVX ( x86 )
- Stav registru segmentů (x86)
- Stav některých řídicích registrů (například registr CR3 zodpovědný za paměť procesu stránkování) (x86)
V jádře OS jsou ke každému vláknu přidruženy následující struktury:
- Obecné informace pid, tid, uid, gid, euid, egid atd.
- Stav procesu/vlákna
- Přístupová práva
- Zdroje a zámky používané vláknem
- Čítače využití zdrojů (např. použité časovače CPU)
- Oblasti paměti přidělené procesu
Přepínání kontextu a výkon
Kromě toho, což je velmi důležité, během přepínání kontextu dochází k následujícím softwarově neviditelným hardwarovým akcím, které ovlivňují výkon:
- Instrukce procesoru a data jsou vymazány
- TLB je vyčištěno , což je zodpovědné za stránkování lineárních adres na fyzické.
Kromě toho je třeba vzít v úvahu následující skutečnosti, které ovlivňují stav systému:
- Obsah mezipaměti (zejména mezipaměti první úrovně), nashromážděný a „optimalizovaný“ pro provádění jednoho vlákna, se ukazuje jako zcela nepoužitelný pro nové vlákno, na které se přepíná.
- Když se přepne kontext na proces, který nebyl dlouhou dobu používán (viz stránkování ), mnoho stránek nemusí být fyzicky dostupných v hlavní paměti, což způsobí načtení prohozených stránek ze sekundární paměti.
Přepínání kontextu a OS
Z hlediska aplikační vrstvy lze přepínání kontextu rozdělit na dobrovolné (dobrovolné) a vynucené (nedobrovolné): běžící proces/vlákno může sám přenést řízení na jiné vlákno, nebo jej může jádro násilně odebrat. to.
- Když vyprší časové kvantum, jádro operačního systému může převzít kontrolu z běžícího procesu/vlákna. Z pohledu programátora to znamená, že řízení mohlo uniknout vláknu v „nejhorší“ chvíli, kdy by datové struktury mohly být v nekonzistentním stavu, protože nebyla dokončena jejich úprava.
- Proveďte blokovací systémové volání . Když aplikace provádí I/O, může se jádro rozhodnout, že může předat řízení jinému vláknu/procesu, zatímco čeká na dokončení diskového nebo síťového I/O požadovaného tímto vláknem. Tato možnost je nejproduktivnější.
- Synchronizační primitiva jádra. Mutexy , semafory atd. To je hlavní zdroj problémů s výkonem. Nedostatečně promyšlená práce se synchronizačními primitivy může vést k desítkám tisíc a ve zvláště opomíjených případech až ke stovkám tisíců přepnutí kontextu za sekundu.
- Systémové volání, které explicitně čeká na událost (výběr, dotaz, epoll, pauza, čekání, ...) nebo časový bod (spánek, nanospánek, ...). Tato možnost je relativně produktivní, protože jádro OS má informace o čekajících procesech.
Vlastnosti procedury plánovače
Rozdíl mezi operačním systémem v reálném čase a operačním systémem se sdílením času je nejzřetelněji vidět v rozdílu v logice plánování pro kontextové přepínače: Plánovač systému se sdílením času se snaží maximalizovat výkon celého systému, možná na úkor výkonu jednotlivé procesy. Úkolem systémového plánovače v reálném čase je zajistit, aby jednotlivé kritické procesy probíhaly prioritně, bez ohledu na to, jak velká je režie pro zbytek systému jako celku.
Implementace přepínání kontextu v moderních operačních systémech
Jak je patrné z výše uvedeného, přepínání kontextu je operace velmi náročná na zdroje a čím je procesor „vychytanější“, tím je tato operace náročnější na zdroje. Na základě toho jádro používá řadu strategií, aby za prvé snížilo počet přepínání kontextu a za druhé, aby přepínání kontextu bylo méně náročné na zdroje.
Metody, jak snížit počet kontextových přepínačů:
- Je možné nakonfigurovat kvantum času procesoru přidělené vláknu. Při sestavování linuxového jádra je možné zadat Server/Desktop/Low-Latency Desktop. U serverových konfigurací je toto množství větší.
Metody pro snížení náročnosti zdrojů přepínání kontextu:
- Při přepínání kontextu mezi vlákny sdílejícími stejný adresní prostor v rámci stejného procesu se jádro nedotkne registru CR3, čímž se šetří TLB
- V mnoha případech se jádro nachází ve stejném adresním prostoru jako uživatelský proces. Při přepínání kontextu mezi uživatelským prostorem a prostorem jádra (a naopak), k němuž dochází například při provádění systémových volání, se jádro nedotkne registru CR3, čímž šetří TLB
- Při plánování se jádro snaží minimalizovat přesun procesu mezi zpracovatelskými jádry v systému SMP , čímž zlepšuje efektivitu L2 cache.
- Ke skutečnému uložení/obnovení kontextu koprocesoru s pohyblivou řádovou čárkou a kontextových registrů MMX/SSE dochází při prvním přístupu nového vlákna, což je optimalizováno pro případ, kdy většina vláken provádí pouze operace s obecnými registry.
Výše uvedené příklady se týkají linuxového jádra , nicméně podobné metody používají i jiné operační systémy, i když v případě proprietárních OS je problematické toto použití dokázat/vyvrátit.
Terminologické poznámky
Odkazy