Otázka č. 13 - Správa procesů
Zadání: multitasking · stavový diagram procesů · vlákna
Proces
- Běžící program - základní jednotka, se kterou OS pracuje.
- Má vlastní paměť (LAP), vlastní stav a může běžet paralelně s jinými procesy.
- Rozdíl proti programu: program je pasivní (soubor s kódem na disku, sám o sobě nic nedělá), proces je aktivní (program za běhu). Jeden program může běžet jako víc procesů - např. několik oken prohlížeče.
Tři pohledy na proces
- Genetický - proces je instance programu, tj. konkrétní spuštění
spustitelného souboru (
.exe). Ze stejného programu jich může vzniknout víc. - Dynamický - proces je sled postupně vykonávaných instrukcí, tedy to, co se právě děje na procesoru.
- Systémový - proces je z pohledu OS soubor přidělených prostředků (paměť, otevřené soubory, procesorový čas), které jádro sleduje a spravuje.
Kontext procesu a PCB
- Kontext procesu - aktuální stav procesoru a paměti, který procesu patří. Ukládá se při přerušení a obnovuje, až proces zase dostane procesor.
- Jádro si o každém procesu vede záznam - PCB (Process Control Block).
Obsahuje mimo jiné:
- PID (identifikátor procesu), případně PID rodiče
- stav procesu
- obsah registrů včetně čítače instrukcí a stavového slova
- informace pro správu paměti - ukazatel na tabulku stránek, hranice regionů
- informace pro plánování - priorita, spotřebovaný čas CPU
- seznam otevřených souborů, pracovní adresář, vlastník a práva
- PCB všech procesů dohromady tvoří tabulku procesů.
Vyhrazené prostředky
- Některá zařízení nejde sdílet (tiskárna, zvukový výstup, sériový port).
- OS proto vytváří iluzi, že je zařízení dostupné jen pro jeden proces - přiděluje ho, zamyká, případně požadavky řadí do fronty (spooling u tiskárny).
Stavový diagram procesů
Proces během svého života prochází těmito stavy:
- New (Nový) - proces se vytváří, alokuje se mu paměť a PCB. Ještě se neplánuje.
- Waiting (Čekající, připravený) - má všechno kromě procesoru, čeká ve frontě, až na něj přijde řada.
- Running (Běžící) - právě mu byl přidělen procesor. Běžících procesů je nejvýš tolik, kolik je jader.
- Sleeping (Blokovaný, spící) - čeká na událost - vstup z klávesnice nebo myši, dokončení zápisu na disk, uvolnění prostředku. Procesor by mu byl k ničemu, proto se mu ani nepřiděluje.
- Zombie (Mrtvý) - proces skončil, ale systém o něm ještě nesmazal informace, protože si rodič nevyzvedl jeho návratový kód. Zůstává po něm jen položka v tabulce procesů.
Pozor na názvosloví: jiná literatura označuje stav 2 jako ready a stav 4 jako waiting / blocked. Význam je stejný, jen se jinak jmenuje.
Přechody mezi stavy:
New → Waiting- proces je přijat do systémuWaiting → Running- dispečer mu přidělil procesorRunning → Waiting- vypršelo časové kvantum nebo přišel důležitější procesRunning → Sleeping- proces si vyžádal I/O nebo prostředekSleeping → Waiting- událost nastala (typicky přerušení od zařízení)Running → Zombie- proces skončil nebo byl zabit
Mechanismus přepínání
- Dobrovolné - proces se procesoru vzdá sám (skončí, zablokuje se na I/O,
zavolá
sleep). - Nedobrovolné (preempce) - OS proces přeruší proti jeho vůli, typicky při přerušení od časovače.
Přepnutí kontextu (context switch)
- Přijde přerušení (časovač, I/O) nebo systémové volání.
- Jádro uloží kontext běžícího procesu do jeho PCB.
- Plánovač vybere jiný proces.
- Obnoví se jeho kontext z PCB, přepne se tabulka stránek, případně vyprázdní TLB.
- Řízení se předá vybranému procesu.
Přepnutí je čistá režie - během něj se nedělá žádná užitečná práce. Proto nesmí být časové kvantum příliš krátké.
Vytváření a rušení procesů
- Procesy tvoří stromovou hierarchii - rodič vytváří potomky.
- UNIX / Linux:
fork()vytvoří kopii rodiče (díky copy-on-write se paměť reálně nekopíruje, viz otázka č. 12),exec()nahradí obsah LAP jiným programem. Rodič si výsledek vyzvedne pomocíwait()- tím zanikne zombie. - Windows: jediné volání
CreateProcess(), které rovnou spustí zadaný program. - Sirotek (orphan) - rodič skončil dřív než potomek. Potomka „adoptuje“ init/systemd, aby ho měl kdo uklidit.
Vlákna (threads)
- Vlákno je menší jednotka než proces - jednotka vykonávání uvnitř procesu.
- Vlákna jednoho procesu sdílejí paměť, kód, data a otevřené soubory, ale každé má vlastní zásobn ík, registry a čítač instrukcí.
- Proces = jednotka vlastnictví prostředků, vlákno = jednotka plánování.
- Multithreading - víc vláken v jednom procesu si dělí práci.
Výhody:
- Rychlá komunikace - vlákna sdílejí paměť, nepotřebují tedy IPC.
- Efektivní využití více jader - jeden program může běžet na víc jádrech naráz.
- Vytvoření vlákna a přepnutí mezi vlákny je výrazně levnější než u procesů (nemění se tabulka stránek, neflushuje se TLB).
- Aplikace zůstane responzivní - výpočet v jiném vlákně nezablokuje GUI.
Nevýhody:
- Pokud se jedno vlákno zablokuje nebo spadne, může to ovlivnit celý proces (pád vlákna shodí celý proces, protože sdílejí paměť).
- Sdílená data vyžadují synchronizaci (viz otázka č. 14), jinak vzniká souběh.
- Chyba v jednom vlákně může poškodit data ostatních.
Rozlišujeme uživatelská vlákna (spravuje je knihovna, jádro o nich neví - jsou rychlá, ale blokující volání zablokuje všechna) a vlákna jádra (plánuje je přímo OS, můžou běžet na různých jádrech).
Multitasking
Cíl: umožnit více procesům a vláknům běžet „současně“. Na jednom jádře jde o iluzi - procesy se velmi rychle střídají.
Typy
- Kooperativní - proces se musí řízení vzdát sám. Jednoduché, ale jeden zacyklený proces (nekonečná smyčka) zablokuje celý systém. Používaly to staré systémy (Windows 3.x, klasický Mac OS).
- Preemptivní - OS rozhoduje, kdy který proces běží, pomocí priorit a časovače. Může procesoru odebrat proces kdykoliv. Nutné pro interaktivní systémy a systémy reálného času.
Pojmy
- Dispečer - vybírá, který proces dostane procesor, a provede předání (přepnutí kontextu, přechod do uživatelského režimu, skok na správnou instrukci).
- Idle proces - „zahálecí“ proces, který běží, když žádný jiný není připravený. Dnes typicky uspí procesor, aby se šetřila energie.
- Časovač - hardwarové přerušení, které pravidelně přepíná procesy. Bez něj by preemptivní multitasking nefungoval.
- Prioritní fronta - procesy mají priority, buď statické (pevně dané), nebo dynamické (mění se podle chování procesu).
- Časové kvantum - doba, po kterou smí proces běžet, než ho časovač vytlačí (obvykle 10-100 ms). Krátké kvantum = velká režie přepínání, dlouhé kvantum = špatná odezva.
Plánovací algoritmy (pro doplnění)
- FCFS (First Come, First Served) - fronta FIFO, nepreemptivní. Trpí konvojovým efektem: jeden dlouhý proces zdrží všechny krátké za sebou.
- SJF (Shortest Job First) - nejdřív nejkratší úloha. Dává nejkratší průměrnou dobu čekání, ale délka úlohy se dopředu nezná a dlouhé úlohy můžou stárnout.
- Round Robin - každý dostane časové kvantum, po jeho vypršení jde na konec fronty. Spravedlivé, základ interaktivních systémů.
- Prioritní plánování - vybírá se proces s nejvyšší prioritou. Hrozí stárnutí (starvation) procesů s nízkou prioritou, řeší se stárnutím priority (aging) - priorita čekajícího procesu se postupně zvyšuje.
- Víceúrovňové fronty se zpětnou vazbou - proces se mezi frontami přesouvá podle chování: kdo vyčerpá celé kvantum, klesne níž; kdo se často blokuje na I/O, zůstane nahoře. Systém si tak sám pozná interaktivní procesy. Tohle používají reálné OS.
Shrnutí
- Procesy a vlákna tvoří základ multitaskingu.
- OS spravuje jejich stavy, paměť, přidělování procesoru a synchronizaci.
- Díky multithreadingu a správě priorit lze efektivně využít výkon počítače.