Operating Systems: Three Easy Pieces. Part 2: Abstrakcija: Proces (prevod)

Uvod v operacijske sisteme

Pozdravljeni, Habr! Želim vam predstaviti serijo prevodnih člankov, ki se mi zdijo zanimivi — OSTEP. V tem gradivu se poglobljeno obravnava delovanje unix-podobnih operacijskih sistemov, in sicer obravnava procesov, različnih pojedinškov, pomnilnika in ostalih podobnih komponent, ki sestavljajo sodobni OS. Izvirnik vseh gradiv si lahko ogledate tukaj. tukaj. Prosimo, upoštevajte, da je prevod izveden nepoklicno (dokaj prosto), a upam, da sem ohranil splošen smisel.

Laboratorijske vaje za to temo lahko najdete tukaj:

Druge dele:

Lahko tudi obiščete moj kanal v telegram =)

Poglejmo najosnovnejšo abstrakcijo, ki jo operacijski sistem ponuja uporabnikom: proces. Opredelitev procesa je dokaj preprosta — to je delujoč program. Program sam po sebi je brezživ stvar, ki leži na disku — to je niz navodil in morda nekaterih statičnih podatkov, ki čakajo na trenutek za zagon. Prav operacijski sistem vzame te bajte in jih zažene, ter preobrazi program v nekaj uporabnega.
Najpogosteje uporabniki želijo zagnati več kot en program hkrati, na primer na vašem prenosniku lahko zaženete brskalnik, igro, predvajalnik medijev, urejevalnik besedil in podobno. Dejansko lahko tipičen sistem hkrati zažene desetine in stotine procesov. Ta dejstvo naredi sistem enostavnejši za uporabo, nikoli se vam ni treba skrbeti, ali je CPU prost, preprosto zaženete programe.

Od tu izhaja problem: kako zagotoviti iluzijo več CPU-jev? Kako lahko operacijski sistem ustvari iluzijo praktično neskončnega števila CPU-jev, tudi če imate samo en fizični CPU?

Operacijski sistem ustvarja to iluzijo s pomočjo virtualizacije CPU. Z zagonenjem enega procesa, nato ustavitvijo le-tega, z zagonom drugega procesa in tako dalje, operacijski sistem lahko ohranja iluzijo, da obstaja več virtualnih CPU-jev, čeprav dejansko gre za en ali več fizičnih procesorjev. Ta tehnika se imenuje časovna delitev virov CPU. Ta tehnika omogoča uporabnikom zagon toliko sočasnih procesov, kolikor jih želijo. Cena takšne rešitve je zmogljivost – ker, če CPU deli več procesov, bo vsak proces obravnavan počasneje.
Za uresničitev virtualizacije CPU, še posebej za to, da to počne dobro, operacijski sistem potrebuje tako nizkotasovno kot visokotaskovno podporo. Nizkotasovna podpora se imenuje mehanizmi — to so nizkotasovne metode ali protokoli, ki izvajajo potreben del funkcionalnosti. En primer take funkcionalnosti je preklapljanje kontekstov, ki omogoča operacijskemu sistemu, da ustavi en program in na procesorju zažene drugega. Takšna časovna delitev je vzpostavljena v vseh sodobnih operacijskih sistemih.
Na vrhu teh mehanizmov se nahaja neka logika, vgrajena v operacijski sistem v obliki 'politike'. Politika je nek algoritem za sprejemanje odločitev s strani operacijskega sistema. Takšne politike, na primer, odločajo, katero program naj se najprej zažene (iz seznama ukazov). Tako bo to nalogo reševala politika, ki se imenuje načrtovalec (scheduling policy) in ob izbiri rešitve bo upoštevala podatke, kot so: zgodovina zagonov (kateri program je bil najdlje zagnan v zadnji minuti), kakšno obremenitev ima ta proces (kateri tipi programov so bili zagnani), metrike zmogljivosti (ali je sistem optimiziran za interaktivno delovanje ali za kapaciteto) in tako naprej.

Abstrakcija: proces

Abstraktna delujoča programa, ki ga izvaja operacijski sistem, je tisto, kar imenujemo proces. Kot je bilo že omenjeno, je proces preprosto delujoč program v kateremkoli trenutku. Program, s katerim lahko pridobimo celovite informacije iz različnih virov sistema, ter do katerih se ta program sklicuje ali ki jih ta program obravnava med izvajanjem.
Za razumevanje sestavin procesa je potrebno razumeti stanja sistema: kaj lahko program bere ali spreminja med svojim delovanjem. V vsakem trenutku je treba razumeti, kateri elementi sistema so pomembni za delovanje programa.
Eden od očitnih elementov stanja sistema, ki ga vključuje proces, je pomnilnik. Navodila so shranjena v pomnilniku. Podatki, ki jih program bere ali piše, so prav tako shranjeni v pomnilniku. Tako je pomnilnik, ki ga proces lahko naslovi (t.i. naslovni prostor), del procesa.
Del stanja sistema so tudi registri. Številna navodila so usmerjena v spreminjanje vrednosti registrov ali branje njihovih vrednosti, tako da registri tudi postanejo pomemben del delovanja procesa.
Treba je omeniti, da stanje naprave sestavljajo tudi nekateri posebni registri. Na primer, IP — kazalec na navodilo (instruction pointer) je kazalec na navodilo, ki ga program trenutno izvaja. Obstaja tudi kazalec na kup (stack pointer) in povezan z njim kazalec okvira (frame pointer), ki se uporabljajo za upravljanje: parametrov funkcij, lokalnih spremenljivk in vrnitev naslovov.
Nazadnje, programi pogosto dostopajo do trdne programske opreme (ROM). Te informacije o “I/O” (vhodu-izhodu) morajo vključevati seznam datotek, ki jih proces trenutno odpre.

Process API

Da bi izboljšali razumevanje delovanja procesov, si oglejmo primere sistemskih klicev, ki bi morali biti vključeni v vsako vmesnik operacijskega sistema. Ti API-ji so na voljo v neki obliki v vsakem OS.

● Stworzyć (ustvarjanje): OS mora vključevati kakršen koli način za ustvarjanje novih procesov. Ko v terminal vnesete ukaz ali zaženete aplikacijo z dvojno klikom na ikono, se pošlje zahteva OS-ju za ustvarjanje novega procesa in zagon navedene aplikacije.
● Odstranjevanje: Ker obstaja vmesnik za ustvarjanje procesa, mora OS tudi omogočiti možnost prisilnega odstranjevanja procesa. Večina programov se bo seveda zagnala in končala sama po sebi v procesu delovanja. V nasprotnem primeru bi želel uporabnik imeti možnost, da jih ustavi, zato bi bil vmesnik za zaustavitev procesa dobrodošel.
● Čakanje (čakanje): Včasih je koristno počakati na dokončanje procesa, zato so na voljo nekateri vmesniki, ki omogočajo čakanje.
● Misc Control (različno upravljanje): Poleg ubijanja in čakanja na proces obstajajo še druge različne metode nadzora. Na primer, večina OS ponuja možnost zamrznitve procesa (ustavitev njegovega izvajanja za določen čas) in kasnejšo obnovitev (nadaljevanje izvajanja).
● Status (stanje): Obstajajo različni vmesniki za pridobivanje nekaterih informacij o statusu procesa, kot so trajanje njegovega delovanja ali v katerem stanju se trenutno nahaja.

Operating Systems: Three Easy Pieces. Part 2: Abstrakcija: Proces (prevod)

Ustvarjanje procesa: podrobnosti

Ena izmed zanimivih stvari je, kako se programi točno pretvorijo v procese. Še posebej, kako operacijski sistem dvigne in zažene program. Kako se točno ustvari proces.
Najprej mora operacijski sistem naložiti program zaradi kode in statičnih podatkov v pomnilnik (v naslovno območje procesa). Programi so običajno shranjeni na disku ali trdem disku v nekem izvršljivem formatu. Tako postopek nalaganja programa in statičnih podatkov v pomnilnik od operacijskega sistema zahteva, da lahko prebere te bite s diska in jih postavi nekam v pomnilnik.

V zgodnjih operacijskih sistemih je postopek nalaganja potekal netrpno (eagerly), kar pomeni, da se je koda nalagala v pomnilnik v celoti pred zagonom programa. Sodobni operacijski sistemi to počnejo leno (lazily), kar pomeni, da nalagajo koščke kode ali podatkov le takrat, ko jih program potrebuje med izvajanjem.

Ko sta koda in statični podatki naloženi v pomnilnik, mora operacijski sistem izvesti še nekaj korakov, preden sproži proces. Nekoliko pomnilnika mora biti dodeljenega za sklad. Programi uporabljajo sklad za lokalne spremenljivke, parametre funkcij in naslove vrnitve.. Operacijski sistem dodeli ta pomnilnik in ga preda procesu. Sklad se lahko tudi dodeli s nekaterimi argumenti, konkretno napolni parametre funkcije main(), kot sta polje argc in argv.

Operacijski sistem lahko prav tako dodeli nek količino pomnilnika za kup (heap) programa. Kup se uporablja za podatke, ki jih programi dinamično izrecno zahtevajo.. Programi zahtevajo to področje z klicem funkcije. malloc() in ga izrecno očistijo z klicem funkcije. free(). Kup je potreben za take podatkovne strukture kot so: seznami, hash tabele, drevesa in druge. Sprva se dodeli malo pomnilnika za kup, vendar sčasoma, med delovanjem programa, lahko kup zahteva več pomnilnika preko klica knjižničnega API-ja malloc(). Operacijski sistem je vključen v postopek dodeljevanja več pomnilnika, da bi pomagal zadovoljiti te klice.

Operacijski sistem bo prav tako izvajal naloge inicializacije, posebej tiste, ki se nanašajo na vhod-izhod. Na primer, v sistemih UNIX ima vsak proces privzeto 3 odprte datotečne descriptorje za standardni vhod, izhod in napake. Ti descriptorji omogočajo programom, da berejo vhod iz terminala in tudi izpisujejo informacije na zaslon.

Tako da, ko naloži kodo in statične podatke v pomnilnik, ustvari in inicializira sklad ter opravi druge naloge, povezane z izvajanjem vhodno-izhodnih nalog, operacijski sistem pripravi prostor za izvajanje procesa. Na koncu ostane še zadnja naloga: zagnati program preko njegove vstopne točke, imenovane funkcija main(). Pri prehodu na izvajanje funkcije main() operacijski sistem prenese nadzor CPU-ju novo ustvarjenemu procesu, tako da se program začne izvajati.

Stanje procesa

Sedaj, ko imamo nekaj razumevanja o tem, kaj je proces in kako se ustvari, naštejmo stanja procesa, v katerih se lahko nahaja. V svoji najpreprostejši obliki se proces lahko nahaja v enem od teh stanj:
● Running. V stanju izvajanja se proces izvaja na procesorju. To pomeni, da se izvajajo ukazi.
● Ready. V stanju pripravljenosti je proces pripravljen na zagon, vendar iz nekega razloga operacijski sistem ne izvaja v danem trenutku.
● Blokirano. V blokiranem stanju proces izvaja nekatere operacije, ki mu ne dovolijo, da bi bil pripravljen na izvajanje, dokler se ne zgodi neko dogajanje. Eden pogostih primerov je, ko proces inicializira operacijo IO, postane blokiran in tako lahko drug proces uporablja procesor.

Operating Systems: Three Easy Pieces. Part 2: Abstrakcija: Proces (prevod)

Ta stanja si lahko predstavljamo v obliki grafa. Kot lahko vidimo na sliki, se stanje procesa lahko spreminja med RUNNING in READY po odločitvi operacijskega sistema. Ko se stanje procesa spremeni iz READY v RUNNING, to pomeni, da je bil proces načrtovan. V obratni smeri — odstranjen iz načrtovanja. V trenutku, ko proces postane BLOCKED, na primer, ko inicializira operacijo IO, ga bo operacijski sistem držal v tem stanju, dokler se ne zgodi nek dogodek, na primer zaključek IO. V tem trenutku prehod v stanje READY in morda takoj v stanje RUNNING, če tako odloči operacijski sistem.
Poglejmo primer, kako dva procesa prehajata skozi ta stanja. Na začetku si predstavljamo, da sta oba procesa zagnana in vsaka uporablja samo CPU. V tem primeru bosta njuni stanji izgledala takole.

Operating Systems: Three Easy Pieces. Part 2: Abstrakcija: Proces (prevod)

V naslednjem primeru prvi proces po določenem času delovanja zahteva IO in preide v stanje BLOCKED, kar omogoča zagon drugemu procesu (RIS 1.4). OS vidi, da proces 0 ne uporablja CPU in zažene proces 1. Med izvajanjem procesa 1 se IO zaključi in status procesa 0 se spremeni v READY. Končno se proces 1 konča, proces 0 se zažene, izvaja in konča svoje delo.

Operating Systems: Three Easy Pieces. Part 2: Abstrakcija: Proces (prevod)

Struktura podatkov

OS je sama program in, tako kot vsak drug program, ima nekatere ključne strukture podatkov, ki spremljajo različne pomembne informacije. Za spremljanje stanja vsakega procesa bo OS imela seznam procesov za vse procese v stanju READY ter dodatne informacije za spremljanje procesov, ki se trenutno izvajajo. Poleg tega mora OS spremljati tudi blokirane procese. Po zaključku IO mora OS zbuditi potreben proces in ga prenesti v stanje pripravljenosti za zagon.

Na primer, OS mora shraniti stanje register procesorja. Ob ustavitvi procesa se stanje register shrani v naslovnem prostoru procesa, ob nadaljevanju njegovega dela pa se obnovijo vrednosti register in tako se nadaljuje izvajanje tega procesa.

Poleg stanj ready, blocked, running obstajajo še nekatere druge države. Včasih ob ustvarjanju proces lahko ima stanje INIT. Končno je proces lahko postavljen v stanje FINAL, ko je že končan, vendar informacije o njem še niso odstranjene. V sistemih UNIX se to stanje imenuje proces-zombi. To stanje je koristno za primere, ko želi starševski proces izvedeti kodo vrnitve otroka, na primer običajno 0 signalizira uspešen zaključek, 1 pa napako, vendar lahko programerji dodajo dodatne kode izhoda, ki signalizirajo različne težave. Ob zaključku starševski proces izvede zadnji sistemski klic, na primer wait(), da počaka na zaključek dela procesa otroka in obvesti OS, da lahko očisti vse podatke, povezane z zaključnim procesom.

Operating Systems: Three Easy Pieces. Part 2: Abstrakcija: Proces (prevod)

Ključne točke predavanja:

● Postopek — glavna abstrakcija delujočega programa v operacijskem sistemu. V vsakem trenutku časa se proces lahko opiše po svojem stanju: vsebina pomnilnika v njegovem naslovnem prostoru, vsebina registrskih procesorjev, vključno z kazalnikom ukazov in kazalnikom sklada, prav tako informacije o IO, na primer odprti datoteki, ki se berejo ali zapisujejo.
● Process API sestavljeni so iz klicev, ki jih programi lahko izvajajo v zvezi s procesi. Običajno so to klici za ustvarjanje, brisanje ali druge.
● Proces je v enem od številnih stanj, vključno z izvajanjem, pripravljenostjo, blokiranjem. Različni dogodki, kot so načrtovanje, izključitev iz načrtovanja ali čakanje, lahko spremenijo stanje procesa iz enega v drugo.
● Seznam procesov vsebuje informacije o vseh procesih v sistemu. Vsaka vnos v njem se imenuje procesna kontrolna enota, ki je v resnici struktura, ki vsebuje vse potrebne informacije o določenem procesu.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster