Operační systémy: Tři snadné kusy. Část 1: Úvod (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:
- originál: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- originál: github.com/remzi-arpacidusseau/ostep-code
- moje osobní adaptace: github.com/bykvaadm/OS/tree/master/ostep

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

Provoz programu

Co se stane, když program běží? Běžící program dělá jednu jednoduchou věc – vykonává instrukce. Každou vteřinu získá procesor miliony a možná i miliardy instrukcí z RAM, následně je dekóduje (například rozpozná, k jakému typu tyto instrukce patří) a provede je. Může to být přidání dvou čísel, přístup do paměti, kontrola podmínky, skok na funkci a tak dále. Po provedení jedné instrukce přistoupí procesor k provedení další. A tak se provádějí instrukce za instrukcí, dokud program neskončí.
Tento příklad je přirozeně považován za zjednodušený – ve skutečnosti vám moderní hardware pro zrychlení procesoru umožňuje provádět instrukce mimo pořadí, počítat možné výsledky, provádět instrukce současně a podobné triky.

Von Neumannův model výpočtu

Námi popisovaná zjednodušená forma práce je podobná Von Neumannovu modelu výpočtu. Von Neumann je jedním z průkopníků počítačových systémů, je také jedním z autorů teorie her. Během běhu programu se odehrává hromada dalších událostí, pracuje mnoho dalších procesů a logiky třetích stran, jejichž hlavním účelem je zjednodušit spouštění, provoz a údržbu systému.
Existuje sada softwaru, která je zodpovědná za usnadnění spouštění programů (nebo dokonce za umožnění spouštění více programů současně), která umožňuje programům sdílet stejnou paměť a komunikovat s různými zařízeními. Takováto sada softwaru (softwaru) se v podstatě nazývá operační systém a mezi její úkoly patří sledování, zda systém funguje správně a efektivně, a také zajištění snadné správy tohoto systému.

Operační systém

Operační systém, zkráceně OS, je sada vzájemně propojených programů určených ke správě počítačových zdrojů a organizaci interakce uživatele s počítačem..
OS dosahuje své účinnosti především prostřednictvím nejdůležitější techniky – techniky virtualizace. OS interaguje s fyzickým zdrojem (procesorem, pamětí, diskem atd.) a transformuje jej do obecnější, výkonnější a snáze použitelné formy sebe sama. Pro obecné pochopení tedy můžete velmi zhruba porovnat operační systém s virtuálním strojem.
Aby uživatelé mohli zadávat příkazy operačnímu systému a využívat tak možnosti virtuálního stroje (jako je spuštění programu, alokace paměti, přístup k souboru atd.), poskytuje operační systém určité rozhraní tzv. API (rozhraní pro programování aplikací) a na které lze volat (volání). Typický operační systém umožňuje provádět stovky systémových volání.
A konečně, protože virtualizace umožňuje spouštění více programů (tedy sdílení CPU) a současný přístup k jejich instrukcím a datům (tedy sdílení paměti) a přístup k diskům (tedy sdílení I/O zařízení). ), operační systém se také nazývá správce zdrojů. Každý procesor, disk a paměť je zdrojem systému, a proto se jednou z rolí operačního systému stává úkol tyto zdroje spravovat, dělat to efektivně, poctivě nebo naopak, v závislosti na úkolu, pro který tento operační systém je navržen.

virtualizace CPU

Zvažte následující program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operační systémy: Tři snadné kusy. Část 1: Úvod (překlad)

Neprovádí žádné speciální akce, ve skutečnosti vše, co dělá, je volání funkce točit(), jehož úkolem je procházet kontrolou času a vrátit se po uplynutí jedné sekundy. Opakuje tedy donekonečna řetězec, který uživatel předal jako argument.
Spusťte tento program a předejte mu znak "A" jako argument. Výsledek není nijak zvlášť zajímavý – systém jednoduše spustí program, který periodicky zobrazuje znak „A“.
Nyní zkusme možnost, když je spuštěno mnoho instancí stejného programu, ale na výstupu jsou různá písmena, aby to bylo jasnější. V tomto případě bude výsledek poněkud odlišný. Přestože máme jeden procesor, program se spouští současně. jak se to stane? Ukazuje se však, že operační systém, nikoli bez pomoci hardwarových schopností, vytváří iluzi. Iluze, že systém má více virtuálních procesorů, mění jeden fyzický procesor na teoreticky nekonečný počet a tím umožňuje zdánlivě spouštět programy současně. Tato iluze se nazývá virtualizace CPU.
Tento obrázek vyvolává mnoho otázek, například pokud chce několik programů běžet současně, který z nich bude spuštěn? Za tuto otázku jsou zodpovědné „zásady“ OS. Zásady se používají na mnoha místech operačního systému a odpovídají na otázky, jako je tato, a jsou základními mechanismy, které operační systém implementuje. Odtud je role OS jako správce zdrojů.

Virtualizace paměti

Nyní se podíváme na paměť. Fyzický model paměti v moderních systémech je reprezentován jako pole bajtů.. Chcete-li číst z paměti, musíte zadat adresa buňkypro přístup. Chcete-li zapsat nebo aktualizovat data, musíte také zadat data a adresu buňky, kam je zapsat.
Během provádění programu je přístup k paměti neustále. Program ukládá celou svou datovou strukturu do paměti a přistupuje k ní prováděním různých instrukcí. Instrukce jsou mezitím také uloženy v paměti, takže je také přístupná pro každý požadavek na další instrukci.

volání malloc().

Zvažte následující program, který přiděluje oblast paměti pomocí volání malloc () (https://youtu.be/jnlKRnoT1m0):

Operační systémy: Tři snadné kusy. Část 1: Úvod (překlad)

Program dělá několik věcí. Nejprve alokuje nějakou paměť (řádek 7), poté vytiskne adresu přidělené buňky (řádek 9), zapíše nulu do prvního slotu alokované paměti. Dále program vstoupí do smyčky, ve které inkrementuje hodnotu uloženou v paměti na adrese v proměnné „p“. Vytiskne také své ID procesu. ID procesu je jedinečné pro každý běžící proces. Po spuštění několika kopií narazíme na zajímavý výsledek: V prvním případě, pokud neuděláte nic a pouze spustíte několik kopií, adresy se budou lišit. Ale to nespadá do naší teorie! Správně, protože moderní distribuce mají randomizaci paměti ve výchozím nastavení povolenou. Pokud je deaktivován, dostaneme očekávaný výsledek – adresy paměti dvou současně běžících programů se budou shodovat.

Operační systémy: Tři snadné kusy. Část 1: Úvod (překlad)

V důsledku toho se ukazuje, že dva nezávislé programy pracují se svými vlastními soukromými adresovými prostory, které jsou naopak mapovány operačním systémem ve fyzické paměti.. Proto použití paměťových adres v rámci jednoho programu nijak neovlivní ostatní a každému programu se zdá, že má svůj vlastní kus fyzické paměti, který je mu zcela dán. Realita je však taková, že fyzická paměť je sdílený prostředek spravovaný operačním systémem.

Konzistence

Dalším důležitým tématem v rámci operačních systémů je − konzistence. Tento termín se používá, když se mluví o problémech v systému, které mohou nastat při práci s mnoha věcmi současně v rámci stejného programu. Problémy s konzistencí vznikají i v samotném operačním systému. V předchozích příkladech s virtualizací paměti a procesoru jsme si uvědomili, že OS spravuje mnoho věcí současně – spustí první proces, pak druhý a tak dále. Jak se ukázalo, toto chování může vést k určitým problémům. Takže například moderní vícevláknové programy mají takové potíže.

Zvažte následující program:

Operační systémy: Tři snadné kusy. Část 1: Úvod (překlad)

Program v hlavní funkci vytvoří pomocí volání dvě vlákna pthread_create(). V tomto příkladu lze vlákno chápat jako funkci běžící ve stejném paměťovém prostoru vedle jiných funkcí, přičemž je zřejmé, že současně běží více než jedna funkce. V tomto příkladu se každé vlákno spustí a provede funkci worker(), která zase jednoduše zvýší proměnnou,.

Spusťte tento program s argumentem 1000. Jak jste možná uhodli, výsledek by měl být 2000, protože každé vlákno inkrementovalo proměnnou 1000krát. Vše však není tak jednoduché. Zkusme spustit program s řádově větším počtem opakování.

Operační systémy: Tři snadné kusy. Část 1: Úvod (překlad)

Zadáním čísla, například 100000, očekáváme, že výstup uvidíme jako číslo 200000. Pokud však číslo 100000 spustíme několikrát, nejenže neuvidíme správnou odpověď, ale také dostaneme různé nesprávné odpovědi. Odpověď spočívá ve skutečnosti, že pro zvýšení čísla jsou zapotřebí tři operace - vytažení čísla z paměti, zvýšení a následné zapsání čísla zpět. Protože všechny tyto instrukce nejsou prováděny atomicky (všechny současně), mohou se dít podivné věci, jako je tato. Tento problém se nazývá v programování závodní podmínky. Když neznámé síly v neznámém okamžiku mohou ovlivnit výkon kterékoli z vašich operací.

Zdroj: www.habr.com

Přidat komentář