Základy operačních systémů Procesy, plánování Jakub Yaghob
Základní pojmy Proces Vlákno (thread) Přerušení (interrupt) spuštěný program Vlákno (thread) oddělení místa vykonávání instrukcí od adresového prostoru Přerušení (interrupt) obsluha synchronní/asynchronní události
Procesy, vlákna - 1 proces vlákno paměť, prostředky, práva hierarchie procesů identifikace procesů (PID) vlákno uživatelský prostor jádro hybrid (m:n)
Procesy, vlákna - 2 Proces Vlákno Adresový prostor Programový čítač Prostředky Registry CPU Práva Zásobník Signály
Vlákna a Linux Linux Ostatní (Windows, Solaris) Nezná vlákna Procesy, které shodou okolností sdílí některé prostředky Speciální vlákna v jádře Ostatní (Windows, Solaris) Explicitní podpora pro vlákna
Stavy procesu
Druhy přerušení Synchronní Asynchronní Polling Záměrně – instrukce TRAP (vstup do OS) Výjimky (exception)– nesprávné chování procesu Asynchronní typicky vnější událost (HW) Polling kontrola stavu zařízení (PP)
Obsluha přerušení OS se ujme řízení uloží se stav CPU analyzuje se přerušení vyvolá se příslušná obsluha obslouží se přerušení obnovení stavu CPU může znamenat přeplánování aplikace pokračuje
Plánování plánovací entita (proces/vlákno) přidělování CPU plánovacím entitám plánovač preemptivní plánování větší OS (Win NT, Unix) nepreemptivní plánování starší nebo malé OS (Win 3.1, PalmOS)
Cíle plánování Spravedlnost Efektivnost Doba odpovědi Průchodnost každý proces dostane CPU Efektivnost využití CPU Doba odpovědi důležité pro interaktivní uživatele Průchodnost max. počet procesů ukončených v čase Minimální režie systému
Kritéria plánování Vázanost procesu na CPU Vázanost procesu na I/O Proces dávkový/interaktivní Priorita Výpadky stránek Skutečný CPU čas
Priority četnost naplánování v čase statická dynamická nemění se v průběhu času daná důležitostí procesu/uživatele dynamická mění se s časem splnění cíle spravedlnosti priorita = statická + dynamická
Plánovací algoritmy - 1 FIFO nepreemptivní kdo dřív přijde, ten dřív mele
Plánovací algoritmy - 2 Round Robin (RR) „kruhová sýkorka“ preemptivní časové kvantum (timeslice)
Plánovací algoritmy - 3 Více front se zpětnou vazbou dynamicky reaguje na vázanost procesů
Plánování v SMP fronta CPU čekajících na připravené procesy aktivní čekání spotřebovává energii pasivní čekání speciální instrukce afinita procesů k CPU
Real-time Obvykle aplikace řízená událostmi Příjem událostí a stavů (např. teploty) z čidel Reakce na stavy a události vyvoláním příslušných úkolů Každý úkol (task) má svůj reálný čas na dokončení (deadline) HW prostředky obvykle předimenzovány Plánování NP-úplný problém heuristiky Hard real-time Propásnutí času dokončení znamená kritický problém Soft real-time Propásnutí času dokončení významný, ale ne kritický problém
Plánování ve Windows – 1 Plánovač Plánuje se na úrovni vláken Není na jednom místě, ale rozprostřen po celém jádře Vlákno se stane připraveným k běhu – vzniklo nebo se odblokovalo Vlákno přestane běžet – došel mu čas, ukončilo se, zablokovalo se Změnily se priority vláken Změnila se svázanost (affinity) s CPU Datové struktury Fronty připravených vláken pro každou prioritu 32-bitová maska priorit s neprázdnou frontou 32-bitová maska volných CPU Vybere se vlákno z nejvyšší neprázdné fronty a přidělí se mu časové kvantum
Plánování ve Windows – 2 Priority 16 real-time úrovní Určeno typicky pro důležitá vlákna jádra Rozsah <16; 31> 15 proměnlivých úrovní Normální vlákna Rozsah <1; 15> 1 systémová úroveň Úroveň 0 Vlákno pro nulování stránek Dynamické priority v rozsahu <-2; 2> od základní Třídy priorit Real-time (24), High (13), Above Normal (10), Normal (8), Below Normal (6), Idle (4)
Plánování ve Windows – 3 Časová kvanta Na počátku vlákno má nastaveno 6 pro Workstation, 36 pro Server Při každém příchodu časovače se od kvanta odečte 3 na Workstation, 12 na Serveru Pokud je časové kvantum vyčerpáno, přeplánuje se Frekvence časovače je závislá na HAL 10ms na x86 jednoprocesoru 15ms na x86 MPS Pokud se vlákno zablokuje před příchodem časovače, odečte se 1
Plánování ve Windows – 4 Zvýšení (boost) priority Zvýšení vzhledem k jeho základní prioritě Vlákno běží jedno časové kvantum se zvýšenou prioritou Důvody Pří ukončení I/O operace Po ukončení čekání na synchronizační primitivum (semafor, …) Proces na popředí po ukončení čekání Vlákno s oknem po příchodu zprávy Ochrana před nenaplánováním Každou vteřinu se kontroluje (po 16), zda neexistuje vlákno, které neběželo déle než 300 tiků
Plánování ve Windows – 5 Plánovací scénáře Chtěné přepnutí Preempce Typicky čekání na I/O, synchronizační primitivum Vlákno do zablokovaného stavu Vybere se další Časové kvantum se zmenší o 1 po probuzení Preempce Objevilo se připravené vlákno s vyšší prioritou Odstraněné vlákno se umístí na začátek fronty příslušné priority Vyčerpání časového kvanta Zařazen na konec své prioritní fronty
Plánování ve Windows – 6 Plánování na SMP Každé vlákno má dvě čísla Ideální CPU – generováno náhodně při vzniku vlákna Poslední CPU – kde naposledy běželo Kam naplánovat? Pokud je nějaký volný CPU Ideální, poslední, aktuální, libovolný Pokud není volný CPU Může udělat preempci? Ideální, poslední, nejvyšší z možných Podle priority běžícího vlákna se buď stane běžícím nebo zařazen do příslušné prioritní fronty
Plánování v Linuxu – 1 Složitost O(1) Výborná SMP škálovatelnost Bez ohledu na počet procesů v systému Výborná SMP škálovatelnost Každý CPU má vlastní frontu Zlepšená SMP afinita Seskupování procesů na CPU, balancování front Dobrý výkon pro interaktivní procesy Spravedlnost Žádný proces nestojí moc dlouho, žádný naopak nedostane příliš velký timeslice Optimalizován pro 1-2 běžící procesy Rozumně škáluje i pro více
Plánování v Linuxu – 2 Runqueue Přepočítání timeslice Pro každý CPU Dvě prioritní fronty Aktivní – procesy s nenulovým timeslice Vyčerpaní – procesy s vyčerpaným timeslice Bitová maska obsazenosti pro jednotlivé priority 140 bitů Přepočítání timeslice Při vyčerpání před přesunutím do prioritní fronty vyčerpaných Po vyčerpání všech se pouze prohodí prioritní fronta aktivních a vyčerpaných
Plánování v Linuxu – 3 Naplánování Priority a timeslice Nalezení první neprázdné priority v aktivní prioritní frontě pomocí bitové masky Vybere první proces z vybrané priority Priority a timeslice Počáteční statická priorita (nice) rozsah <-20; 19>, default 0 Dynamická priorita Počítána na základě interaktivity procesu Heuristicky na základě toho, jak dlouho proces spí – vázán na I/O Úprava priority v rozsahu <-5; 5>
Plánování v Linuxu – 4 Vyvažování front na SMP Volání Pokud je fronta prázdná Jednou za 1ms, když se nic neděje, jinak každých 200ms Nalezení nejdelší fronty Musí být o 25% delší než ostatní Nalezení prioritní fronty Preferována fronta vyčerpaných procesů (asi nejsou v cache) Nejvyšší priorita Nalezení procesu Neběží, není svázán s CPU Přesunut do mé fronty Opakuj předchozí dva kroky, dokud není vyváženo