Skip to main content

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.
  • 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:

  1. New (Nový) - proces se vytváří, alokuje se mu paměť a PCB. Ještě se neplánuje.
  2. Waiting (Čekající, připravený) - má všechno kromě procesoru, čeká ve frontě, až na něj přijde řada.
  3. Running (Běžící) - právě mu byl přidělen procesor. Běžících procesů je nejvýš tolik, kolik je jader.
  4. 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.
  5. 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ému
  • Waiting → Running - dispečer mu přidělil procesor
  • Running → Waiting - vypršelo časové kvantum nebo přišel důležitější proces
  • Running → Sleeping - proces si vyžádal I/O nebo prostředek
  • Sleeping → 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)

  1. Přijde přerušení (časovač, I/O) nebo systémové volání.
  2. Jádro uloží kontext běžícího procesu do jeho PCB.
  3. Plánovač vybere jiný proces.
  4. Obnoví se jeho kontext z PCB, přepne se tabulka stránek, případně vyprázdní TLB.
  5. Ří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.