Operačné systémy: Tri jednoduché kusy. Časť 2: Abstrakcia: Proces (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:

Ďalšie časti:

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

Pozrime sa na najzákladnejšiu abstrakciu, ktorú OS poskytuje používateľom: proces. Definícia procesu je pomerne jednoduchá - je spustený program. Samotný program je nezáživná vec nachádzajúca sa na disku – je to súbor inštrukcií a prípadne nejaké statické dáta, ktoré čakajú na spustenie. Je to OS, ktorý vezme tieto bajty a spustí ich, čím premení program na niečo užitočné.
Používatelia chcú najčastejšie spúšťať viac ako jeden program súčasne, napríklad na svojom notebooku môžete spustiť prehliadač, hru, prehrávač médií, textový editor a podobne. V skutočnosti môže typický systém súčasne spúšťať desiatky alebo stovky procesov. Táto skutočnosť uľahčuje používanie systému, nikdy sa nemusíte starať o to, či je CPU voľný, stačí spustiť programy.

To vyvoláva problém: ako poskytnúť ilúziu mnohých CPU? Ako môže OS vytvoriť ilúziu takmer nekonečného počtu CPU, aj keď máte iba jeden fyzický CPU?

Operačný systém vytvára túto ilúziu prostredníctvom virtualizácie CPU. Spustením jedného procesu, jeho zastavením, spustením ďalšieho procesu atď., OS môže udržiavať ilúziu, že existuje veľa virtuálnych CPU, hoci v skutočnosti bude jeden alebo viac fyzických procesorov. Táto technika sa nazýva rozdelenie zdrojov CPU podľa času. Táto technika umožňuje používateľom spúšťať toľko súbežných procesov, koľko si želajú. Náklady na toto riešenie sú výkon – keďže ak je CPU zdieľané viacerými procesmi, každý proces bude spracovaný pomalšie.
Na implementáciu virtualizácie CPU a hlavne na to, aby to bolo dobré, potrebuje OS podporu na nízkej aj vysokej úrovni. Nízka úroveň podpory je tzv mechanizmov sú nízkoúrovňové metódy alebo protokoly, ktoré implementujú požadovanú časť funkcionality. Príkladom takejto funkcie je prepínanie kontextu, ktoré dáva OS možnosť zastaviť jeden program a spustiť iný program na procesore. Toto časové rozdelenie je implementované vo všetkých moderných operačných systémoch.
Okrem týchto mechanizmov je do operačného systému zabudovaná určitá logika vo forme „zásad“. Politika je určitý rozhodovací algoritmus pre operačný systém. Takéto politiky napríklad rozhodujú, ktorý program by sa mal spustiť (zo zoznamu príkazov) ako prvý. Čiže napríklad tento problém vyrieši politika tzv plánovač (zásady plánovania) a pri výbere riešenia sa bude riadiť takými údajmi ako: história spúšťania (ktorý program bol spustený najdlhšie v posledných minútach), akú záťaž tento proces nesie (aké typy programov boli spustené), metriky výkonu (či systém je optimalizovaný pre interaktívnu interakciu alebo pre priepustnosť ) atď.

Abstrakcia: proces

Abstrakciu bežiaceho programu vykonávaného operačným systémom nazývame proces. Ako už bolo spomenuté, proces je jednoducho spustený program v akomkoľvek okamžitom časovom období. Program, pomocou ktorého môžeme získať súhrnné informácie z rôznych systémových prostriedkov, ku ktorým tento program pristupuje alebo ich ovplyvňuje počas svojho vykonávania.
Aby ste porozumeli komponentom procesu, musíte pochopiť stavy systému: čo môže program čítať alebo meniť počas svojej činnosti. V každom okamihu musíte pochopiť, ktoré prvky systému sú dôležité pre vykonávanie programu.
Jedným zo zjavných prvkov systémového stavu, ktorý proces zahŕňa, je pamäte. Pokyny sú umiestnené v pamäti. Dáta, ktoré program číta alebo zapisuje, sa tiež nachádzajú v pamäti. Pamäť, ktorú môže proces adresovať (nazývaný adresný priestor), je teda súčasťou procesu.
Súčasťou stavu systému sú aj registre. Mnoho inštrukcií je zameraných na zmenu hodnoty registrov alebo čítanie ich hodnoty, a tak sa aj registre stávajú dôležitou súčasťou fungovania procesu.
Treba poznamenať, že stav stroja je tiež tvorený z niektorých špeciálnych registrov. Napríklad, IP - ukazovateľ inštrukcie — ukazovateľ na inštrukciu, ktorú program práve vykonáva. Je tu tiež ukazovateľ zásobníka a súvisí s tým ukazovateľ rámčeka, ktoré sa používajú na správu: parametrov funkcií, lokálnych premenných a návratových adries.
Nakoniec programy často pristupujú k ROM (pamäti iba na čítanie). Tieto „I/O“ (vstupné/výstupné) informácie by mali obsahovať zoznam súborov aktuálne otvorených procesom.

Process API

Aby sme lepšie pochopili, ako tento proces funguje, preštudujme si príklady systémových volaní, ktoré by mali byť zahrnuté v akomkoľvek rozhraní operačného systému. Tieto rozhrania API sú dostupné v tej či onej forme na akomkoľvek OS.

vytvoriť (tvorba): OS musí obsahovať nejakú metódu, ktorá vám umožní vytvárať nové procesy. Keď zadáte príkaz do terminálu alebo spustíte aplikáciu dvojitým kliknutím na ikonu, do OS sa odošle výzva na vytvorenie nového procesu a následné spustenie určeného programu.
Odstránenie: Keďže existuje rozhranie na vytváranie procesu, OS by mal poskytovať aj možnosť vynútiť odstránenie procesu. Väčšina programov sa pri spustení prirodzene spustí a ukončí sama. V opačnom prípade by ich používateľ chcel zabiť, a preto by bolo užitočné rozhranie na zastavenie procesu.
Počkajte (čakanie): Niekedy je užitočné počkať na dokončenie procesu, preto sú k dispozícii niektoré rozhrania, ktoré umožňujú čakať.
Rôzne ovládanie (rôzne ovládanie): Okrem zabíjania a čakania na proces existujú aj iné rôzne spôsoby ovládania. Napríklad väčšina operačných systémov poskytuje možnosť zmraziť proces (zastaviť jeho vykonávanie na určitú dobu) a potom ho obnoviť (pokračovať v vykonávaní).
postavenie (stav): Existujú rôzne rozhrania na získanie niektorých informácií o stave procesu, napríklad ako dlho beží alebo v akom stave sa momentálne nachádza.

Operačné systémy: Tri jednoduché kusy. Časť 2: Abstrakcia: Proces (preklad)

Tvorba procesu: Podrobnosti

Jednou zo zaujímavostí je, ako presne sa programy transformujú na procesy. Najmä to, ako operačný systém zdvihne a spustí program. Ako presne sa proces vytvára.
V prvom rade musí OS načítať programový kód a statické dáta do pamäte (do adresného priestoru procesu). Programy sú zvyčajne umiestnené na disku alebo jednotke SSD v nejakom spustiteľnom formáte. Proces načítania programu a statických údajov do pamäte teda vyžaduje, aby OS dokázal prečítať tieto bajty z disku a umiestniť ich niekde do pamäte.

V skorých operačných systémoch sa proces načítania robil dychtivo, čo znamená, že celý kód bol načítaný do pamäte ešte pred spustením programu. Moderné operačné systémy to robia lenivo, to znamená, že načítavajú časti kódu alebo údajov len vtedy, keď si ich program počas svojho vykonávania vyžaduje.

Po načítaní kódu a statických údajov do pamäte operačného systému je potrebné vykonať niekoľko ďalších vecí, kým sa proces spustí. Pre zásobník musí byť pridelené určité množstvo pamäte. Programy používajú zásobník pre lokálne premenné, parametre funkcií a návratové adresy. Operačný systém prideľuje túto pamäť a poskytuje ju procesu. Zásobník môže byť alokovaný aj s niektorými argumentmi, konkrétne napĺňa parametre funkcie main(), napríklad poľom argc a argv.

Operačný systém môže tiež prideliť časť pamäte halde programu. Hromadu používajú programy na explicitné vyžiadanie dynamicky pridelených údajov. Programy si tento priestor vyžiadajú volaním funkcie malloc () a vymaže ho explicitne volaním funkcie zadarmo(). Halda je potrebná pre dátové štruktúry, ako sú prepojené hárky, hašovacie tabuľky, stromy a iné. Najprv je halde pridelené malé množstvo pamäte, ale postupom času, ako sa program spúšťa, si halda môže vyžiadať viac pamäte prostredníctvom volania API knižnice malloc(). Operačný systém je zapojený do procesu prideľovania väčšej pamäte, aby pomohol uspokojiť tieto volania.

Operačný systém bude tiež vykonávať inicializačné úlohy, najmä tie, ktoré súvisia s I/O. Napríklad v systémoch UNIX má každý proces štandardne 3 otvorené deskriptory súborov pre štandardný vstup, výstup a chybu. Tieto rukoväte umožňujú programom čítať vstup z terminálu, ako aj zobrazovať informácie na obrazovke.

Operačný systém teda načítaním kódu a statických údajov do pamäte, vytvorením a inicializáciou zásobníka a vykonaním ďalšej práce súvisiacej s vykonávaním I/O úloh pripraví štádium na vykonanie procesu. Nakoniec zostáva posledná úloha: spustiť program cez jeho vstupný bod, nazývaný funkcia main(). Vykonaním funkcie main() prenesie OS riadenie CPU na novovytvorený proces, čím sa program začne vykonávať.

Stav procesu

Teraz, keď už trochu rozumieme tomu, čo je proces a ako vzniká, poďme uviesť stavy procesu, v ktorých sa môže nachádzať. Vo svojej najjednoduchšej forme môže byť proces v jednom z týchto stavov:
Bezat. Pri spustení proces beží na procesore. To znamená, že sa vykonávajú inštrukcie.
Pripravený. V stave pripravenosti je proces pripravený na spustenie, ale operačný systém ho z nejakého dôvodu nevykoná v určenom čase.
upchatý. V zablokovanom stave proces vykonáva niektoré operácie, ktoré bránia tomu, aby bol pripravený na vykonanie, kým nenastane nejaká udalosť. Jedným z bežných príkladov je, keď proces spustí operáciu IO, zablokuje sa, takže procesor môže použiť nejaký iný proces.

Operačné systémy: Tri jednoduché kusy. Časť 2: Abstrakcia: Proces (preklad)

Tieto stavy si môžete predstaviť vo forme grafu. Ako môžeme vidieť na obrázku, stav procesu sa môže meniť medzi RUNNING a READY podľa uváženia OS. Keď sa stav procesu zmení z READY na RUNNING, znamená to, že proces bol naplánovaný. V opačnom smere - odstránené z rozloženia. V momente, keď sa nejaký proces ZABLOKUJE, napríklad spustím operáciu IO, OS ho v tomto stave udrží, kým nenastane nejaká udalosť, napríklad dokončenie IO. v tomto momente prechod do stavu READY a prípadne ihneď do stavu RUNNING, ak sa tak OS rozhodne.
Pozrime sa na príklad, ako sa dva procesy pohybujú cez tieto stavy. Na začiatok si predstavme, že sú spustené oba procesy a každý z nich využíva iba CPU. V tomto prípade budú ich stavy vyzerať takto.

Operačné systémy: Tri jednoduché kusy. Časť 2: Abstrakcia: Proces (preklad)

V nasledujúcom príklade prvý proces po určitom čase behu požaduje IO a vstúpi do stavu BLOKOVANÉ, čo umožňuje spustenie ďalšieho procesu (obr. 1.4). OS zistí, že proces 0 nepoužíva CPU a spustí proces 1. Kým je spustený proces 1, IO sa dokončí a stav procesu 0 sa zmení na PRIPRAVENÝ. Nakoniec sa dokončil proces 1 a po dokončení sa spustí, vykoná a dokončí svoju prácu proces 0.

Operačné systémy: Tri jednoduché kusy. Časť 2: Abstrakcia: Proces (preklad)

Dátová štruktúra

Samotný OS je program a ako každý iný program má niektoré kľúčové dátové štruktúry, ktoré sledujú rôzne relevantné informácie. Na sledovanie stavu každého procesu bude OS podporovať niektoré procesný zoznam pre všetky procesy v stave READY a niektoré ďalšie informácie na sledovanie procesov, ktoré práve bežia. Operačný systém by mal tiež monitorovať zablokované procesy. Po dokončení IO musí OS prebudiť požadovaný proces a uviesť ho do stavu pripraveného na spustenie.

Napríklad OS musí zachovať stav registrov procesora. V momente, keď sa proces zastaví, stav registrov sa uloží do adresného priestoru procesu a v momente, keď jeho činnosť pokračuje, hodnoty registrov sa obnovia a pokračuje sa tak vo vykonávaní tohto procesu.

Okrem pripravených, zablokovaných a spustených stavov existujú aj ďalšie stavy. Niekedy môže byť proces v čase vytvorenia v stave INIT. Nakoniec môže byť proces uvedený do KONEČNÉHO stavu, keď je už dokončený, ale jeho informácie ešte neboli vymazané. V systémoch UNIX sa tento stav nazýva zombie proces. Tento stav je užitočný v prípadoch, keď nadradený proces chce poznať návratový kód potomka, napríklad zvyčajne 0 signalizuje úspech a 1 chybu, ale programátori môžu vydať dodatočné výstupné kódy na signalizáciu rôznych problémov. Keď sa nadradený proces ukončí, vykoná posledné systémové volanie, ako napríklad wait(), aby počkalo na ukončenie podriadeného procesu a signalizovalo OS, že môže vymazať všetky údaje spojené s ukončeným procesom.

Operačné systémy: Tri jednoduché kusy. Časť 2: Abstrakcia: Proces (preklad)

Kľúčové body prednášky:

Proces — hlavná abstrakcia bežiaceho programu v OS. V ktoromkoľvek danom čase môže byť proces opísaný jeho stavom: obsah pamäte v jeho adresnom priestore, obsah registrov procesora, vrátane ukazovateľa inštrukcie a ukazovateľa zásobníka, a IO informácií, ako sú napríklad čítanie alebo zápis otvorených súborov.
Process API pozostáva z volaní, ktoré môžu programy uskutočniť s procesmi. Zvyčajne ide o vytvorenie, odstránenie alebo iné hovory.
● Proces je v jednom z mnohých stavov vrátane spustených, pripravených, zablokovaných. Rôzne udalosti, ako je plánovanie, výnimky z plánovania alebo čakania, môžu zmeniť stav procesu z jedného na druhý.
Zoznam procesov obsahuje informácie o všetkých procesoch v systéme. Každý záznam v ňom sa nazýva blok riadenia procesov, čo je v skutočnosti štruktúra, ktorá obsahuje všetky potrebné informácie o konkrétnom procese. 

Zdroj: hab.com

Pridať komentár