Operativni sustavi: tri laka komada. 1. dio: Uvod (prijevod)

Uvod u operacijske sustave

Hej Habr! Predstavljam vam seriju članaka-prijevoda jedne po meni zanimljive literature - OSTEP. Ovaj materijal prilično duboko raspravlja o radu operativnih sustava nalik unixu, naime o radu s procesima, raznim planerima, memorijom i drugim sličnim komponentama koje čine moderan OS. Izvornike svih materijala možete vidjeti ovdje ovdje. Napominjem da je prijevod urađen neprofesionalno (sasvim slobodno), ali se nadam da sam zadržao opći smisao.

Laboratorijske radove iz ove teme možete pronaći ovdje:
- original: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- moja osobna prilagodba: github.com/bykvaadm/OS/tree/master/ostep

Također možete pogledati moj kanal na telegram =)

Rad programa

Što se događa kada je program pokrenut? Program koji radi radi jednu jednostavnu stvar - izvršava instrukcije. Svake sekunde, procesor dohvaća milijune, pa čak i milijarde instrukcija iz RAM-a, zatim ih dekodira (na primjer, prepoznaje kojoj vrsti te instrukcije pripadaju) i izvršava ih. To može biti zbrajanje dva broja, pristup memoriji, provjera uvjeta, skok na funkciju i tako dalje. Nakon izvršenja jedne instrukcije, procesor prelazi na izvršenje druge. I tako instrukcija za instrukcijom, izvršavaju se sve dok program ne završi.
Ovaj se primjer prirodno smatra pojednostavljenim - zapravo, kako bi se ubrzao procesor, moderni hardver vam omogućuje izvršavanje instrukcija izvan reda, izračunavanje mogućih rezultata, izvršavanje instrukcija istovremeno i slične trikove.

Von Neumannov model računanja

Pojednostavljeni oblik rada koji smo opisali sličan je Von Neumannovom modelu računanja. Von Neumann je jedan od pionira računalnih sustava, također je jedan od autora teorije igara. Dok program radi, događa se hrpa drugih događaja, rade mnogi drugi procesi i logika treće strane, čija je glavna svrha pojednostaviti pokretanje, rad i održavanje sustava.
Postoji skup softvera koji je odgovoran za jednostavno pokretanje programa (ili čak za dopuštanje više programa da rade u isto vrijeme), koji omogućuje programima da dijele istu memoriju i da komuniciraju s različitim uređajima. Takav skup softvera (softvera) se u suštini naziva operativnim sustavom i njegove zadaće uključuju praćenje da li sustav radi ispravno i učinkovito, kao i osiguravanje jednostavnosti upravljanja tim sustavom.

Operativni sustav

Operativni sustav, skraćeno OS, skup je međusobno povezanih programa dizajniranih za upravljanje računalnim resursima i organiziranje interakcije korisnika s računalom..
OS svoju učinkovitost postiže prvenstveno kroz najvažniju tehniku ​​– tehniku virtualizacija. OS stupa u interakciju s fizičkim resursom (procesor, memorija, disk, itd.) i pretvara ga u općenitiji, snažniji i lakši za korištenje oblik. Stoga, za opće razumijevanje, možete vrlo grubo usporediti operativni sustav s virtualnim strojem.
Kako bi se omogućilo korisnicima da daju naredbe operativnom sustavu i tako koriste mogućnosti virtualnog stroja (kao što je pokretanje programa, dodjela memorije, pristup datoteci i tako dalje), operativni sustav nudi neko sučelje tzv. API (aplikacijsko programsko sučelje) i na koje možete upućivati ​​pozive (poziv). Tipičan operativni sustav dopušta stotine sistemskih poziva.
Konačno, budući da virtualizacija omogućuje rad više programa (što znači dijeljenje CPU-a), i istovremeni pristup njihovim uputama i podacima (što znači dijeljenje memorije), te pristup diskovima (što znači dijeljenje I/O uređaja). ), operativni sustav se također naziva upravitelj resursa. Svaki procesor, disk i memorija resurs je sustava, pa tako jedna od uloga operacijskog sustava postaje zadaća upravljanja tim resursima, učinkovito, pošteno ili obrnuto, ovisno o zadaći za koju ovaj operacijski sustav je dizajniran.

CPU virtualizacija

Razmotrite sljedeći program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operativni sustavi: tri laka komada. 1. dio: Uvod (prijevod)

Ne izvodi nikakve posebne akcije, zapravo, sve što radi je pozivanje funkcije vrtjeti(), čiji je zadatak kružiti kroz provjeru vremena i vratiti se nakon isteka jedne sekunde. Dakle, beskonačno ponavlja niz koji je korisnik proslijedio kao argument.
Pokrenimo ovaj program i proslijedimo mu znak "A" kao argument. Rezultat nije posebno zanimljiv - sustav jednostavno izvršava program koji periodički prikazuje znak "A".
Isprobajmo sada opciju kada se izvodi mnogo instanci istog programa, ali izlaze različita slova kako bi bilo jasnije. U ovom slučaju rezultat će biti nešto drugačiji. Unatoč činjenici da imamo jedan procesor, program se izvršava istovremeno. Kako se to događa? Ali ispada da operativni sustav, ne bez pomoći hardverskih mogućnosti, stvara iluziju. Iluzija da sustav ima više virtualnih procesora, pretvarajući jedan fizički procesor u teoretski beskonačan broj i time dopuštajući naizgled istovremeno pokretanje programa. Ova iluzija se zove CPU virtualizacija.
Ova slika postavlja mnoga pitanja, na primjer, ako se nekoliko programa želi pokrenuti u isto vrijeme, koji će se pokrenuti? Za ovo pitanje odgovorne su “politike” OS-a. Politike se koriste na mnogim mjestima u OS-u i odgovaraju na ovakva pitanja te su osnovni mehanizmi koje OS implementira. Otuda uloga OS-a kao upravitelja resursima.

Virtualizacija memorije

Sada pogledajmo memoriju. Fizički model memorije u modernim sustavima predstavlja se kao niz bajtova.. Za čitanje iz memorije morate navesti adresa ćelijeda mu pristupite. Da biste upisali ili ažurirali podatke, također morate navesti podatke i adresu ćelije u koju ih želite upisati.
Memoriji se stalno pristupa tijekom izvođenja programa. Program pohranjuje svoju cjelokupnu podatkovnu strukturu u memoriju i pristupa joj izvršavanjem različitih instrukcija. Instrukcije se, u međuvremenu, također pohranjuju u memoriju, pa se i njoj pristupa za svaki zahtjev za sljedeću instrukciju.

malloc() poziv

Razmotrite sljedeći program koji dodjeljuje područje memorije pomoću poziva malloc () (https://youtu.be/jnlKRnoT1m0):

Operativni sustavi: tri laka komada. 1. dio: Uvod (prijevod)

Program radi nekoliko stvari. Prvo dodjeljuje nešto memorije (linija 7), zatim ispisuje adresu dodijeljene ćelije (linija 9), upisuje nulu u prvi utor dodijeljene memorije. Zatim, program ulazi u petlju u kojoj povećava vrijednost pohranjenu u memoriji na adresi u varijabli "p". Također ispisuje svoj ID procesa. ID procesa jedinstven je za svaki pokrenuti proces. Nakon što smo pokrenuli nekoliko kopija, naići ćemo na zanimljiv rezultat: u prvom slučaju, ako ne učinite ništa i samo pokrenete nekoliko kopija, tada će adrese biti različite. Ali to ne spada u našu teoriju! Točno, jer moderne distribucije imaju omogućenu randomizaciju memorije prema zadanim postavkama. Ako je onemogućeno, dobivamo očekivani rezultat - memorijske adrese dvaju programa koji se istovremeno izvode podudarat će se.

Operativni sustavi: tri laka komada. 1. dio: Uvod (prijevod)

Kao rezultat toga, ispada da dva neovisna programa rade sa svojim privatnim adresnim prostorom, koji zauzvrat mapira operativni sustav u fizičkoj memoriji. Dakle, korištenje memorijskih adresa unutar jednog programa neće ni na koji način utjecati na druge, a svakom programu se čini da ima svoj komad fizičke memorije, koji mu je u potpunosti dodijeljen. Realnost je, međutim, da je fizička memorija zajednički resurs kojim upravlja operativni sustav.

Dosljednost

Još jedna od važnih tema unutar operativnih sustava je − dosljednost. Ovaj izraz se koristi kada se govori o problemima u sustavu koji se mogu pojaviti kada radite s više stvari u isto vrijeme unutar istog programa. Problemi s dosljednošću javljaju se čak i unutar samog operativnog sustava. U prethodnim primjerima virtualizacije memorije i procesora shvatili smo da OS upravlja mnogim stvarima u isto vrijeme - pokreće prvi proces, zatim drugi i tako dalje. Kako se pokazalo, ovakvo ponašanje može dovesti do nekih problema. Tako, na primjer, moderni programi s više niti imaju takve poteškoće.

Razmotrite sljedeći program:

Operativni sustavi: tri laka komada. 1. dio: Uvod (prijevod)

Program u glavnoj funkciji stvara dvije niti pomoću poziva pthread_create(). U ovom primjeru, nit se može zamisliti kao funkcija koja se izvodi u istom memorijskom prostoru zajedno s drugim funkcijama, s jasno više od jedne funkcije koja radi u isto vrijeme. U ovom primjeru svaka nit pokreće i izvršava funkciju worker() koji zauzvrat jednostavno povećava varijablu,.

Pokrenimo ovaj program s argumentom 1000. Kao što ste mogli pogoditi, rezultat bi trebao biti 2000 jer je svaka nit povećala varijablu 1000 puta. Međutim, sve nije tako jednostavno. Pokušajmo pokrenuti program s redom veličine više ponavljanja.

Operativni sustavi: tri laka komada. 1. dio: Uvod (prijevod)

Unosom broja, na primjer, 100000 200000, očekujemo da ćemo vidjeti izlaz kao broj 100000 XNUMX. Međutim, ako broj XNUMX XNUMX pokrenemo nekoliko puta, ne samo da nećemo vidjeti točan odgovor, već ćemo dobiti i različite netočne odgovore. Odgovor leži u činjenici da su za povećanje broja potrebne tri operacije - izdvajanje broja iz memorije, povećavanje i zatim ponovno upisivanje broja. Budući da se sve te upute ne izvršavaju atomski (sve u isto vrijeme), mogu se dogoditi čudne stvari poput ove. Ovaj problem se u programiranju naziva stanje utrke. Kada nepoznate sile u nepoznatom trenutku mogu utjecati na izvedbu bilo koje vaše operacije.

Izvor: www.habr.com

Dodajte komentar