Operačné systémy: Tri jednoduché kusy. Časť 1: Úvod (preklad)

Úvod do operačných systémov

Čau Habr! Chcel by som vám dať do pozornosti sériu článkov-prekladov jednej podľa mňa zaujímavej literatúry - OSTEP. Tento materiál pomerne hlboko rozoberá prácu operačných systémov podobných unixu, konkrétne prácu s procesmi, rôznymi plánovačmi, pamäťou a inými podobnými komponentmi, ktoré tvoria moderný OS. Originál všetkých materiálov si môžete pozrieť tu tu. Upozorňujem, že preklad bol urobený neprofesionálne (celkom voľne), ale dúfam, že som zachoval všeobecný význam.

Laboratórne práce na túto tému nájdete tu:
- originál: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- originál: github.com/remzi-arpacidusseau/ostep-code
- moja osobná úprava: github.com/bykvaadm/OS/tree/master/ostep

Môžete sa tiež pozrieť na môj kanál na telegram =)

Prevádzka programu

Čo sa stane, keď je spustený program? Spustený program robí jednu jednoduchú vec – vykonáva inštrukcie. Každú sekundu procesor získa milióny a možno aj miliardy inštrukcií z RAM, následne ich dekóduje (napríklad rozpozná, do akého typu tieto inštrukcie patria) a vykoná. Môže to byť pridanie dvoch čísel, prístup k pamäti, kontrola podmienky, skok na funkciu atď. Po vykonaní jednej inštrukcie procesor pristúpi k vykonaniu ďalšej. A tak sa inštrukcia za inštrukciou vykonávajú, kým sa program neskončí.
Tento príklad sa prirodzene považuje za zjednodušený – v skutočnosti vám moderný hardvér na zrýchlenie procesora umožňuje vykonávať pokyny mimo poradia, počítať možné výsledky, vykonávať pokyny súčasne a podobné triky.

Von Neumannov model výpočtu

Nami opísaná zjednodušená forma práce je podobná Von Neumannovmu modelu výpočtu. Von Neumann je jedným z priekopníkov počítačových systémov, je tiež jedným z autorov teórie hier. Počas behu programu prebieha množstvo ďalších udalostí, mnoho ďalších procesov a logiky tretích strán, ktorých hlavným účelom je zjednodušiť spúšťanie, prevádzku a údržbu systému.
Existuje súbor softvéru, ktorý je zodpovedný za uľahčenie spúšťania programov (alebo dokonca za umožnenie spustenia viacerých programov súčasne), ktorý umožňuje programom zdieľať rovnakú pamäť a komunikovať s rôznymi zariadeniami. Takáto sada softvéru (softvéru) sa v podstate nazýva operačný systém a medzi jej úlohy patrí monitorovanie, či systém funguje správne a efektívne, ako aj zabezpečenie jednoduchej správy tohto systému.

Operačný systém

Operačný systém, skrátene OS, je súbor vzájomne prepojených programov určených na správu počítačových zdrojov a organizovanie interakcie používateľa s počítačom..
OS dosahuje svoju účinnosť v prvom rade prostredníctvom najdôležitejšej techniky - techniky virtualizácie. OS interaguje s fyzickým zdrojom (procesorom, pamäťou, diskom atď.) a transformuje ho do všeobecnejšej, výkonnejšej a ľahšie použiteľnej podoby. Preto pre všeobecné pochopenie môžete veľmi zhruba porovnať operačný systém s virtuálnym strojom.
Aby používatelia mohli zadávať príkazy operačnému systému a tým využívať možnosti virtuálneho stroja (ako je spustenie programu, alokácia pamäte, prístup k súboru atď.), operačný systém poskytuje určité rozhranie tzv. API (aplikačné programovacie rozhranie) a na ktoré môžete volať (hovor). Typický operačný systém umožňuje uskutočniť stovky systémových volaní.
Napokon, keďže virtualizácia umožňuje bežať viacerým programom (teda zdieľať CPU) a súčasne pristupovať k ich inštrukciám a údajom (čím zdieľať pamäť) a pristupovať k diskom (teda zdieľať I/O zariadenia). Operačný systém sa tiež nazýva správca zdrojov. Každý procesor, disk a pamäť sú zdrojom systému, a preto sa jednou z úloh operačného systému stáva úloha tieto zdroje spravovať, či už to robiť efektívne, poctivo alebo naopak, v závislosti od úlohy, na ktorú tento operačný systém je navrhnutý.

virtualizácia CPU

Zvážte nasledujúci program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operačné systémy: Tri jednoduché kusy. Časť 1: Úvod (preklad)

Nevykonáva žiadne špeciálne akcie, v skutočnosti všetko, čo robí, je volanie funkcie točiť(), ktorého úlohou je prechádzať kontrolou času a vrátiť sa po uplynutí jednej sekundy. Donekonečna teda opakuje reťazec, ktorý používateľ odovzdal ako argument.
Spustíme tento program a dáme mu znak "A" ako argument. Výsledok nie je nijak zvlášť zaujímavý – systém jednoducho spustí program, ktorý periodicky zobrazuje znak „A“.
Teraz skúsme možnosť, keď je spustených veľa inštancií toho istého programu, ale na výstup sú rôzne písmená, aby to bolo jasnejšie. V tomto prípade bude výsledok trochu iný. Napriek tomu, že máme jeden procesor, program sa vykonáva súčasne. ako sa to stane? Ukazuje sa však, že operačný systém, nie bez pomoci hardvérových schopností, vytvára ilúziu. Ilúzia, že systém má viacero virtuálnych procesorov, premieňa jeden fyzický procesor na teoreticky nekonečný počet a tým umožňuje zdanlivým programom bežať súčasne. Táto ilúzia sa nazýva virtualizácia CPU.
Tento obrázok vyvoláva veľa otázok, napríklad, ak chce niekoľko programov bežať súčasne, ktorý z nich sa spustí? Za túto otázku sú zodpovedné „zásady“ OS. Zásady sa používajú na mnohých miestach v OS a odpovedajú na otázky, ako je táto, a sú základnými mechanizmami, ktoré OS implementuje. Z toho vyplýva úloha OS ako správcu zdrojov.

Virtualizácia pamäte

Teraz sa pozrime na pamäť. Fyzický model pamäte v moderných systémoch je reprezentovaný ako pole bajtov.. Ak chcete čítať z pamäte, musíte zadať adresa bunkypre prístup. Ak chcete zapisovať alebo aktualizovať údaje, musíte tiež zadať údaje a adresu bunky, do ktorej sa majú zapisovať.
K pamäti sa pristupuje neustále počas vykonávania programu. Program ukladá celú svoju dátovú štruktúru do pamäte a pristupuje k nej vykonávaním rôznych inštrukcií. Inštrukcie sú medzitým tiež uložené v pamäti, takže sa k nej pristupuje aj pri každej požiadavke na ďalšiu inštrukciu.

volanie malloc().

Zvážte nasledujúci program, ktorý alokuje oblasť pamäte pomocou volania malloc () (https://youtu.be/jnlKRnoT1m0):

Operačné systémy: Tri jednoduché kusy. Časť 1: Úvod (preklad)

Program robí niekoľko vecí. Najprv alokuje nejakú pamäť (riadok 7), potom vytlačí adresu pridelenej bunky (riadok 9), zapíše nulu do prvého slotu pridelenej pamäte. Potom program vstúpi do cyklu, v ktorom inkrementuje hodnotu uloženú v pamäti na adrese v premennej „p“. Tiež vytlačí svoje ID procesu. ID procesu je jedinečné pre každý spustený proces. Po spustení niekoľkých kópií narazíme na zaujímavý výsledok: V prvom prípade, ak neurobíte nič a spustíte niekoľko kópií, adresy sa budú líšiť. Ale to nepatrí do našej teórie! Správne, pretože moderné distribúcie majú randomizáciu pamäte štandardne povolenú. Ak je zakázaná, dostaneme očakávaný výsledok - adresy pamäte dvoch súčasne spustených programov sa budú zhodovať.

Operačné systémy: Tri jednoduché kusy. Časť 1: Úvod (preklad)

V dôsledku toho sa ukazuje, že dva nezávislé programy pracujú s vlastnými priestormi súkromných adries, ktoré sú zase mapované operačným systémom vo fyzickej pamäti.. Preto použitie pamäťových adries v rámci jedného programu žiadnym spôsobom neovplyvní ostatné a každému programu sa zdá, že má svoj vlastný kúsok fyzickej pamäte, ktorý je mu úplne daný. Realita je však taká, že fyzická pamäť je zdieľaný zdroj spravovaný operačným systémom.

Dôslednosť

Ďalšou z dôležitých tém v rámci operačných systémov je − konzistencia. Tento výraz sa používa, keď sa hovorí o problémoch v systéme, ktoré sa môžu vyskytnúť pri práci s mnohými vecami súčasne v rámci toho istého programu. Problémy s konzistentnosťou vznikajú dokonca aj v samotnom operačnom systéme. V predchádzajúcich príkladoch virtualizácie pamäte a procesora sme si uvedomili, že OS spravuje veľa vecí súčasne – spustí prvý proces, potom druhý atď. Ako sa ukázalo, toto správanie môže viesť k určitým problémom. Napríklad moderné viacvláknové programy majú takéto ťažkosti.

Zvážte nasledujúci program:

Operačné systémy: Tri jednoduché kusy. Časť 1: Úvod (preklad)

Program v hlavnej funkcii vytvorí dve vlákna pomocou volania pthread_create(). V tomto príklade si vlákno možno predstaviť ako funkciu spustenú v rovnakom pamäťovom priestore spolu s inými funkciami, pričom je zrejmé, že súčasne beží viac ako jedna funkcia. V tomto príklade sa každé vlákno spustí a vykoná funkciu worker(), ktorý zase jednoducho zvyšuje premennú,.

Spustite tento program s argumentom 1000. Ako ste možno uhádli, výsledok by mal byť 2000, pretože každé vlákno inkrementovalo premennú 1000-krát. Všetko však nie je také jednoduché. Skúsme spustiť program s rádovo väčším počtom opakovaní.

Operačné systémy: Tri jednoduché kusy. Časť 1: Úvod (preklad)

Zadaním čísla, napríklad 100000, očakávame, že výstup uvidíme ako číslo 200000. Ak však číslo 100000 spustíme niekoľkokrát, nielenže neuvidíme správnu odpoveď, ale dostaneme aj rôzne nesprávne odpovede. Odpoveď spočíva v tom, že na zvýšenie čísla sú potrebné tri operácie - vytiahnutie čísla z pamäte, zvýšenie a následné zapísanie čísla späť. Keďže všetky tieto inštrukcie nie sú vykonávané atomicky (všetky súčasne), môžu sa stať takéto zvláštne veci. Tento problém sa nazýva v programovaní rasový stav. Keď neznáme sily v neznámom okamihu môžu ovplyvniť výkon ktorejkoľvek z vašich operácií.

Zdroj: hab.com

Pridať komentár