Operační systémy: Tři snadné kusy. Část 2: Abstrakce: Proces (překlad)

Úvod do operačních systémů

Čau Habr! Rád bych vás upozornil na sérii článků-překladů jedné dle mého názoru zajímavé literatury - OSTEP. Tento materiál poměrně hluboce pojednává o práci unixových operačních systémů, konkrétně o práci s procesy, různými plánovači, pamětí a dalšími podobnými součástmi, které tvoří moderní OS. Originál všech materiálů si můžete prohlédnout zde zde. Upozorňuji, že překlad byl proveden neprofesionálně (zcela volně), ale doufám, že jsem zachoval obecný význam.

Laboratorní práce na toto téma naleznete zde:

Ostatní části:

Můžete se také podívat na můj kanál na telegram =)

Podívejme se na nejzákladnější abstrakci, kterou OS uživatelům poskytuje: proces. Definice procesu je celkem jednoduchá – je běžící program. Samotný program je nezáživná věc umístěná na disku – je to sada instrukcí a případně nějaká statická data čekající na spuštění. Je to operační systém, který vezme tyto bajty a spustí je, čímž přemění program na něco užitečného.
Nejčastěji chtějí uživatelé spouštět více než jeden program současně, například na svém notebooku můžete spustit prohlížeč, hru, přehrávač médií, textový editor a podobně. Ve skutečnosti může typický systém současně provozovat desítky nebo stovky procesů. Tato skutečnost usnadňuje používání systému, nikdy se nemusíte starat o to, zda je CPU volné, pouze spouštíte programy.

To vyvolává problém: jak zajistit iluzi mnoha CPU? Jak může OS vytvořit iluzi téměř nekonečného počtu CPU, i když máte pouze jeden fyzický CPU?

OS vytváří tuto iluzi prostřednictvím virtualizace CPU. Spuštěním jednoho procesu, jeho zastavením, spuštěním dalšího procesu a tak dále může operační systém udržovat iluzi, že existuje mnoho virtuálních CPU, i když ve skutečnosti bude jeden nebo více fyzických procesorů. Tato technika se nazývá rozdělení zdrojů CPU podle času. Tato technika umožňuje uživatelům spouštět tolik souběžných procesů, kolik si přejí. Cena tohoto řešení je výkon – protože pokud je CPU sdíleno několika procesy, bude každý proces zpracován pomaleji.
K implementaci virtualizace CPU a hlavně k jejímu dobrému provedení potřebuje OS podporu jak na nízké, tak na vysoké úrovni. Nízká úroveň podpory se nazývá mechanismy jsou nízkoúrovňové metody nebo protokoly, které implementují požadovanou část funkčnosti. Příkladem takové funkce je přepínání kontextu, které dává OS možnost zastavit jeden program a spustit jiný program na procesoru. Toto časové rozdělení je implementováno ve všech moderních operačních systémech.
Kromě těchto mechanismů je do operačního systému zabudována určitá logika ve formě „zásad“. Politika je určitý rozhodovací algoritmus pro operační systém. Tyto zásady například rozhodují, který program by měl být spuštěn (ze seznamu příkazů) jako první. Takže například tento problém vyřeší politika tzv plánovač (zásady plánování) a při výběru řešení se bude řídit takovými údaji, jako jsou: historie spouštění (který program byl v posledních minutách spuštěn nejdéle), jakou zátěž tento proces nese (jaké typy programů byly spuštěny), metriky výkonu (zda systém je optimalizován pro interaktivní interakci nebo propustnost) a tak dále.

Abstrakce: proces

Abstrakce běžícího programu prováděného operačním systémem je to, co nazýváme proces. Jak již bylo zmíněno dříve, proces je jednoduše běžící program v libovolném okamžiku. Program, pomocí kterého můžeme získat souhrnné informace z různých systémových zdrojů, ke kterým tento program přistupuje nebo je ovlivňuje během svého provádění.
Chcete-li porozumět komponentám procesu, musíte porozumět stavům systému: co může program číst nebo měnit během své činnosti. V každém okamžiku musíte pochopit, které prvky systému jsou důležité pro provádění programu.
Jedním ze zřejmých prvků stavu systému, který proces zahrnuje, je paměti. Pokyny jsou umístěny v paměti. Data, která program čte nebo zapisuje, jsou také umístěna v paměti. Paměť, kterou může proces adresovat (tzv. adresní prostor), je tedy součástí procesu.
Součástí stavu systému jsou také registry. Mnoho instrukcí je zaměřeno na změnu hodnoty registrů nebo čtení jejich hodnoty, a tak se registry také stávají důležitou součástí provozu procesu.
Je třeba poznamenat, že stav stroje je také tvořen z některých speciálních registrů. Například, IP - ukazatel instrukce — ukazatel na instrukci, kterou program právě provádí. Existuje také ukazatel zásobníku a souvisí s tím rámový ukazatel, které se používají ke správě: parametrů funkcí, lokálních proměnných a návratových adres.
Nakonec programy často přistupují k paměti ROM (paměť pouze pro čtení). Tyto informace „I/O“ (vstup/výstup) by měly obsahovat seznam souborů aktuálně otevřených procesem.

Procesní API

Abychom lépe porozuměli tomu, jak tento proces funguje, pojďme si prostudovat příklady systémových volání, která by měla být zahrnuta do jakéhokoli rozhraní operačního systému. Tato rozhraní API jsou k dispozici v té či oné podobě na libovolném operačním systému.

Vytvořit (tvorba): OS musí obsahovat nějakou metodu, která vám umožní vytvářet nové procesy. Když zadáte příkaz do terminálu nebo spustíte aplikaci dvojitým kliknutím na ikonu, odešle se do operačního systému výzva k vytvoření nového procesu a následnému spuštění určeného programu.
Odstranění: Vzhledem k tomu, že existuje rozhraní pro vytváření procesu, měl by OS také poskytovat možnost vynutit odstranění procesu. Většina programů se přirozeně spustí a ukončí sama o sobě, když běží. V opačném případě by uživatel chtěl mít možnost je zabít, a proto by bylo užitečné rozhraní pro zastavení procesu.
Počkejte (čekání): Někdy je užitečné počkat na dokončení procesu, takže jsou k dispozici některá rozhraní, která umožňují čekat.
Různé ovládání (různé ovládání): Kromě zabíjení a čekání na proces existují i ​​další různé způsoby ovládání. Většina operačních systémů například poskytuje možnost zmrazit proces (zastavit jeho provádění na určitou dobu) a poté jej obnovit (pokračovat v provádění).
Status (stav): Existují různá rozhraní pro získání některých informací o stavu procesu, například jak dlouho běží nebo v jakém stavu se aktuálně nachází.

Operační systémy: Tři snadné kusy. Část 2: Abstrakce: Proces (překlad)

Tvorba procesu: Podrobnosti

Jednou ze zajímavostí je, jak přesně se programy transformují do procesů. Zejména to, jak OS program zvedne a spustí. Jak přesně je proces vytvořen.
Nejprve musí OS načíst programový kód a statická data do paměti (do adresního prostoru procesu). Programy jsou obvykle umístěny na disku nebo jednotce SSD v nějakém spustitelném formátu. Proces načítání programu a statických dat do paměti tedy vyžaduje, aby OS byl schopen číst tyto bajty z disku a umístit je někam do paměti.

V dřívějších operačních systémech byl proces načítání prováděn dychtivě, což znamená, že celý kód byl načten do paměti před spuštěním programu. Moderní operační systémy to dělají líně, to znamená, že načítají kusy kódu nebo dat pouze tehdy, když je program během svého provádění vyžaduje.

Jakmile se kód a statická data načtou do paměti operačního systému, je potřeba udělat ještě několik věcí, než bude proces spuštěn. Pro zásobník musí být přiděleno určité množství paměti. Programy používají zásobník pro lokální proměnné, parametry funkcí a návratové adresy. Operační systém přidělí tuto paměť a předá ji procesu. Zásobník lze alokovat i s některými argumenty, konkrétně naplňuje parametry funkce main(), například polem argc a argv.

Operační systém může také přidělit část paměti haldě programu. Hromadu používají programy k explicitnímu požadavku na dynamicky alokovaná data. Programy si tento prostor vyžádají voláním funkce malloc () a explicitně jej vymaže voláním funkce volný, uvolnit(). Halda je potřebná pro datové struktury, jako jsou propojené listy, hashovací tabulky, stromy a další. Zpočátku je haldě přiděleno malé množství paměti, ale postupem času, jak program běží, může halda vyžadovat více paměti prostřednictvím volání API knihovny malloc(). Operační systém je zapojen do procesu přidělování více paměti, aby pomohl uspokojit tato volání.

Operační systém bude také provádět inicializační úlohy, zejména ty, které se týkají I/O. Například v systémech UNIX má každý proces standardně 3 otevřené deskriptory souborů pro standardní vstup, výstup a chybu. Tyto úchyty umožňují programům číst vstup z terminálu a také zobrazovat informace na obrazovce.

Operační systém tedy načtením kódu a statických dat do paměti, vytvořením a inicializací zásobníku a provedením další práce související s prováděním I/O úloh připraví fázi pro provedení procesu. Nakonec zbývá poslední úkol: spustit program přes jeho vstupní bod, nazývaný funkce main(). Spuštěním funkce main() přenese OS řízení CPU na nově vytvořený proces, čímž se program začne vykonávat.

Stav procesu

Nyní, když už trochu rozumíme tomu, co je proces a jak je vytvořen, pojďme uvést stavy procesu, ve kterých se může nacházet. Ve své nejjednodušší podobě může být proces v jednom z těchto stavů:
Běh. Při běhu proces běží na procesoru. To znamená, že se provádějí instrukce.
Připravený. Ve stavu připravenosti je proces připraven ke spuštění, ale z nějakého důvodu jej OS v zadaný čas nespustí.
ucpaný. V zablokovaném stavu proces provádí některé operace, které brání tomu, aby byl připraven ke spuštění, dokud nenastane nějaká událost. Jedním z běžných příkladů je, když proces zahájí IO operaci, zablokuje se, takže procesor může použít jiný proces.

Operační systémy: Tři snadné kusy. Část 2: Abstrakce: Proces (překlad)

Tyto stavy si můžete představit ve formě grafu. Jak můžeme vidět na obrázku, stav procesu se může měnit mezi RUNNING a READY dle uvážení OS. Když se stav procesu změní z READY na RUNNING, znamená to, že proces byl naplánován. V opačném směru - odstraněno z rozložení. V okamžiku, kdy dojde k BLOKOVÁNÍ procesu, např. zahájím IO operaci, OS jej v tomto stavu udrží, dokud nenastane nějaká událost, například dokončení IO. v tuto chvíli přechod do stavu READY a případně ihned do stavu RUNNING, pokud se tak OS rozhodne.
Podívejme se na příklad, jak dva procesy procházejí těmito stavy. Pro začátek si představme, že oba procesy běží a každý využívá pouze CPU. V tomto případě budou jejich stavy vypadat takto.

Operační systémy: Tři snadné kusy. Část 2: Abstrakce: Proces (překlad)

V následujícím příkladu si první proces po nějaké době běhu vyžádá IO a přejde do stavu BLOCKED, což umožní spuštění dalšího procesu (OBR. 1.4). OS zjistí, že proces 0 nepoužívá CPU, a spustí proces 1. Zatímco proces 1 běží, IO je dokončeno a stav procesu 0 se změní na PŘIPRAVENO. Nakonec byl dokončen proces 1 a po dokončení se spustí, provede a dokončí svou práci proces 0.

Operační systémy: Tři snadné kusy. Část 2: Abstrakce: Proces (překlad)

Datová struktura

Samotný OS je program a stejně jako každý jiný program má některé klíčové datové struktury, které sledují různé relevantní informace. Aby bylo možné sledovat stav každého procesu, OS bude některé podporovat procesní seznam pro všechny procesy ve stavu READY a některé další informace pro sledování procesů, které právě běží. Operační systém by měl také sledovat zablokované procesy. Po dokončení IO musí OS probudit požadovaný proces a uvést jej do stavu připraveného ke spuštění.

OS musí například zachovat stav registrů procesoru. V okamžiku, kdy se proces zastaví, je stav registrů uložen do adresního prostoru procesu a v okamžiku, kdy jeho činnost pokračuje, jsou hodnoty registrů obnoveny a pokračuje se tak v provádění tohoto procesu.

Kromě připravených, blokovaných a běžících stavů existují některé další stavy. Někdy může být proces v době vytvoření ve stavu INIT. Nakonec lze proces uvést do FINÁLNÍHO stavu, když je již dokončen, ale jeho informace ještě nebyly vymazány. V systémech UNIX se tento stav nazývá zombie proces. Tento stav je užitečný v případech, kdy nadřazený proces chce znát návratový kód potomka, například obvykle 0 signalizuje úspěch a 1 chybu, ale programátoři mohou vydávat další výstupní kódy pro signalizaci různých problémů. Když se nadřazený proces ukončí, provede poslední systémové volání, jako je wait(), aby počkalo na ukončení podřízeného procesu a signalizovalo operačnímu systému, že může vymazat všechna data spojená s ukončeným procesem.

Operační systémy: Tři snadné kusy. Část 2: Abstrakce: Proces (překlad)

Klíčové body přednášky:

Proces — hlavní abstrakce běžícího programu v OS. V libovolném okamžiku lze proces popsat svým stavem: obsahem paměti v jeho adresovém prostoru, obsahem registrů procesoru, včetně ukazatele instrukce a ukazatele zásobníku, a informací o IO, jako jsou čtení nebo zápis otevřených souborů.
Procesní API sestává z volání, která mohou programy provádět s procesy. Obvykle se jedná o vytvoření, odstranění nebo jiná volání.
● Proces je v jednom z mnoha stavů, včetně spuštěného, ​​připraveného, ​​zablokovaného. Různé události, jako je plánování, výjimky z plánování nebo čekání, mohou změnit stav procesu z jednoho na druhý.
Seznam procesů obsahuje informace o všech procesech v systému. Každý záznam v něm se nazývá blok řízení procesu, což je ve skutečnosti struktura, která obsahuje všechny potřebné informace o konkrétním procesu. 

Zdroj: www.habr.com

Přidat komentář