Operacijski sistemi: trije preprosti deli. 1. del: Uvod (prevod)

Uvod v operacijske sisteme

Pozdravljeni, Habr! Predstavljam vam serijo člankov-prevodov ene po mojem mnenju zanimive literature - OSTEP. To gradivo precej poglobljeno preučuje delo operacijskih sistemov, podobnih unixu, in sicer delo s procesi, različnimi načrtovalci, pomnilnikom in drugimi podobnimi komponentami, ki sestavljajo sodoben OS. Original vseh materialov si lahko ogledate tukaj tukaj. Upoštevajte, da je prevod narejen neprofesionalno (precej svobodno), vendar upam, da sem ohranil splošni pomen.

Laboratorijske naloge na to temo najdete tukaj:
- original: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- moja osebna prilagoditev: github.com/bykvaadm/OS/tree/master/ostep

Ogledate si lahko tudi moj kanal na telegram =)

Delovanje programa

Kaj se zgodi, ko se program izvaja? Program, ki se izvaja, naredi eno preprosto stvar - izvaja navodila. Vsako sekundo procesor pridobi milijone in celo morda milijarde navodil iz RAM-a, nato pa jih dekodira (na primer prepozna, kateri vrsti so ta navodila) in jih izvede. To je lahko seštevanje dveh številk, dostop do pomnilnika, preverjanje pogoja, skok na funkcijo itd. Po izvedbi enega ukaza procesor nadaljuje z izvajanjem drugega. In tako se navodilo za navodilom izvaja, dokler se program ne konča.
Ta primer seveda velja za poenostavljenega - pravzaprav za pospešitev procesorja sodobna strojna oprema omogoča izvajanje ukazov izven vrstice, izračun možnih rezultatov, sočasno izvajanje navodil in podobne trike.

Von Neumannov model računanja

Poenostavljena oblika dela, ki smo jo opisali, je podobna Von Neumannovemu modelu računanja. Von Neumann je eden od pionirjev računalniških sistemov, je tudi eden od avtorjev teorije iger. Med delovanjem programa se odvija kup drugih dogodkov, delujejo številni drugi procesi in logika tretjih oseb, katerih glavni namen je poenostaviti zagon, delovanje in vzdrževanje sistema.
Obstaja nabor programske opreme, ki je odgovorna za enostavno izvajanje programov (ali celo za omogočanje hkratnega izvajanja več programov), omogoča programom, da si delijo isti pomnilnik in komunicirajo z različnimi napravami. Tak nabor programske opreme (software) se v bistvu imenuje operacijski sistem in njegove naloge vključujejo spremljanje, da sistem deluje pravilno in učinkovito, ter zagotavljanje enostavnosti upravljanja tega sistema.

Operacijski sistem

Operacijski sistem, skrajšano OS, je nabor medsebojno povezanih programov, namenjenih upravljanju računalniških virov in organizaciji interakcije uporabnika z računalnikom..
OS svojo učinkovitost dosega predvsem z najpomembnejšo tehniko – tehniko virtualizacija. OS sodeluje s fizičnim virom (procesorjem, pomnilnikom, diskom itd.) in ga spremeni v bolj splošno, zmogljivejšo in lažjo za uporabo obliko. Zato lahko za splošno razumevanje zelo grobo primerjate operacijski sistem z virtualnim strojem.
Da bi uporabnikom omogočili dajanje ukazov operacijskemu sistemu in s tem uporabo zmožnosti navideznega stroja (kot je zagon programa, dodeljevanje pomnilnika, dostop do datoteke itd.), operacijski sistem nudi vmesnik, imenovan API (aplikacijski programski vmesnik) in na katerega lahko kličete (klic). Tipičen operacijski sistem omogoča na stotine sistemskih klicev.
Končno, ker virtualizacija omogoča zagon več programov (s čimer si delijo CPE) in istočasen dostop do njihovih navodil in podatkov (s čimer si delijo pomnilnik) ter dostop do diskov (s čimer si delijo V/I naprave). ), se operacijski sistem imenuje tudi upravitelj virov. Vsak procesor, disk in pomnilnik je vir sistema, zato ena od vlog operacijskega sistema postane naloga upravljanja teh virov, učinkovito, pošteno ali obratno, odvisno od naloge, za katero ta operacijski sistem je zasnovan.

Virtualizacija procesorja

Razmislite o naslednjem programu:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operacijski sistemi: trije preprosti deli. 1. del: Uvod (prevod)

Ne izvaja nobenih posebnih dejanj, pravzaprav je vse, kar počne, samo klicanje funkcije spin(), katerega naloga je, da kroži skozi preverjanje časa in se vrne po pretečeni eni sekundi. Tako neomejeno ponavlja niz, ki ga je uporabnik posredoval kot argument.
Zaženimo ta program in mu kot argument posredujemo znak "A". Rezultat ni posebej zanimiv - sistem preprosto izvaja program, ki občasno prikaže znak "A".
Zdaj pa poskusimo možnost, ko se izvaja veliko primerkov istega programa, vendar izpisuje različne črke, da bo bolj jasno. V tem primeru bo rezultat nekoliko drugačen. Kljub temu, da imamo en procesor, se program izvaja sočasno. Kako se zgodi? Toda izkazalo se je, da operacijski sistem, ne brez pomoči zmogljivosti strojne opreme, ustvarja iluzijo. Iluzija, da ima sistem več virtualnih procesorjev, ki spremenijo en fizični procesor v teoretično neskončno število in s tem omogočijo navidezno hkratno izvajanje programov. Ta iluzija se imenuje Virtualizacija procesorja.
Ta slika odpira številna vprašanja, na primer, če se želi več programov izvajati hkrati, kateri se bo zagnal? Za to vprašanje so odgovorne "politike" operacijskega sistema. Politike se uporabljajo na številnih mestih v operacijskem sistemu in odgovarjajo na podobna vprašanja ter so osnovni mehanizmi, ki jih OS izvaja. Od tod tudi vloga OS kot upravitelja virov.

Virtualizacija pomnilnika

Zdaj pa poglejmo spomin. Fizični model pomnilnika v sodobnih sistemih je predstavljen kot niz bajtov.. Za branje iz pomnilnika morate določiti naslov celiceza dostop do njega. Če želite zapisati ali posodobiti podatke, morate določiti tudi podatke in naslov celice, kamor jih želite zapisati.
Do pomnilnika se med izvajanjem programa stalno dostopa. Program shrani celotno podatkovno strukturo v pomnilnik in do nje dostopa z izvajanjem različnih ukazov. Navodila so medtem shranjena tudi v pomnilniku, tako da se do njega dostopa tudi za vsako zahtevo po naslednjem navodilu.

klic malloc().

Razmislite o naslednjem programu, ki s klicem dodeli območje pomnilnika malloc () (https://youtu.be/jnlKRnoT1m0):

Operacijski sistemi: trije preprosti deli. 1. del: Uvod (prevod)

Program naredi več stvari. Najprej dodeli nekaj pomnilnika (vrstica 7), nato natisne naslov dodeljene celice (vrstica 9), zapiše nič v prvo režo dodeljenega pomnilnika. Nato program vstopi v zanko, v kateri poveča vrednost, shranjeno v pomnilniku na naslovu v spremenljivki "p". Natisne tudi svoj ID procesa. ID procesa je edinstven za vsak tekoči proces. Ko smo zagnali več kopij, bomo naleteli na zanimiv rezultat: v prvem primeru, če ne storite ničesar in samo zaženete več kopij, bodo naslovi drugačni. Ampak to ne sodi v našo teorijo! Pravilno, saj imajo sodobne distribucije privzeto omogočeno randomizacijo pomnilnika. Če je onemogočen, dobimo pričakovani rezultat - pomnilniška naslova dveh sočasno delujočih programov se bosta ujemala.

Operacijski sistemi: trije preprosti deli. 1. del: Uvod (prevod)

Posledično se izkaže, da dva neodvisna programa delujeta s svojimi zasebnimi naslovnimi prostori, ki jih nato operacijski sistem preslika v fizični pomnilnik. Zato uporaba pomnilniških naslovov znotraj enega programa na noben način ne bo vplivala na druge in vsakemu programu se zdi, da ima svoj kos fizičnega pomnilnika, ki mu je v celoti dodeljen. V resnici pa je fizični pomnilnik vir v skupni rabi, ki ga upravlja operacijski sistem.

Doslednost

Druga pomembna tema znotraj operacijskih sistemov je − doslednost. Ta izraz se uporablja, ko govorimo o težavah v sistemu, ki se lahko pojavijo pri delu z več stvarmi hkrati v istem programu. Težave z doslednostjo se pojavljajo celo v samem operacijskem sistemu. V prejšnjih primerih virtualizacije pomnilnika in procesorja smo ugotovili, da OS upravlja veliko stvari hkrati - zažene prvi proces, nato drugega in tako naprej. Kot se je izkazalo, lahko to vedenje povzroči nekaj težav. Tako na primer sodobni večnitni programi doživljajo takšne težave.

Razmislite o naslednjem programu:

Operacijski sistemi: trije preprosti deli. 1. del: Uvod (prevod)

Program v glavni funkciji ustvari dve niti s pomočjo klica pthread_create(). V tem primeru si lahko nit predstavljamo kot funkcijo, ki se izvaja v istem pomnilniškem prostoru skupaj z drugimi funkcijami, pri čemer je očitno več kot ena funkcija, ki teče hkrati. V tem primeru vsaka nit zažene in izvede funkcijo worker(), ki nato preprosto poveča spremenljivko,.

Zaženimo ta program z argumentom 1000. Kot ste morda uganili, bi moral biti rezultat 2000, ker je vsaka nit povečala spremenljivko 1000-krat. Vendar vse ni tako preprosto. Poskusimo zagnati program z redom velikosti več ponovitev.

Operacijski sistemi: trije preprosti deli. 1. del: Uvod (prevod)

Če vnesemo številko, na primer 100000, pričakujemo, da bomo videli rezultat kot številko 200000. Če pa številko 100000 zaženemo večkrat, ne le da ne bomo videli pravilnega odgovora, ampak bomo dobili tudi različne napačne odgovore. Odgovor je v dejstvu, da so za povečanje števila potrebne tri operacije - črpanje števila iz pomnilnika, povečanje in nato zapis števila nazaj. Ker se vsa ta navodila ne izvajajo atomsko (vsa hkrati), se lahko zgodijo čudne stvari, kot je ta. Ta problem se v programiranju imenuje stanje dirke. Ko lahko neznane sile v neznanem trenutku vplivajo na uspešnost katere koli vaše operacije.

Vir: www.habr.com

Dodaj komentar