Operativni sistemi: tri laka komada. Dio 1: Uvod (prijevod)

Uvod u operativne sisteme

Hej Habr! Predstavljam Vam seriju članaka-prevoda jedne po meni zanimljive literature - OSTEP-a. U ovom materijalu se prilično duboko raspravlja o radu operativnih sistema sličnih unixu, odnosno radu sa procesima, raznim planerima, memorijom i drugim sličnim komponentama koje čine moderni OS. Original svih materijala možete pogledati ovdje ovdje. Napominjemo da je prevod urađen neprofesionalno (prilično slobodno), ali se nadam da sam zadržao opšte značenje.

Laboratorijski rad na ovu temu možete pronaći ovdje:
- original: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- moja lična adaptacija: github.com/bykvaadm/OS/tree/master/ostep

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

Rad programa

Šta se dešava kada je program pokrenut? Program koji radi radi jednu jednostavnu stvar - izvršava instrukcije. Svake sekunde, milioni, pa čak i milijarde instrukcija se preuzimaju od strane procesora iz RAM-a, zauzvrat ih dekodira (na primjer, prepoznaje kojem tipu ove instrukcije pripadaju) i izvršava ih. To može biti dodavanje dva broja, pristup memoriji, provjera stanja, skakanje na funkciju itd. Nakon izvršenja jedne instrukcije, procesor prelazi na izvršenje druge. I tako instrukcija za instrukcijom, one se izvršavaju dok se program ne završi.
Ovaj primjer se prirodno smatra pojednostavljenim - zapravo, da biste ubrzali procesor, savremeni hardver vam omogućava da izvršavate instrukcije van reda, izračunate moguće rezultate, istovremeno izvršavate instrukcije i slične trikove.

Von Neumannov model proračuna

Pojednostavljeni oblik rada koji smo mi opisali sličan je Von Neumannovom modelu računanja. Von Neumann je jedan od pionira kompjuterskih sistema, takođe je jedan od autora teorije igara. Dok program radi, dešava se gomila drugih događaja, mnogi drugi procesi i logički rad trećih strana, čija je glavna svrha da pojednostavi pokretanje, rad i održavanje sistema.
Postoji skup softvera koji je odgovoran za olakšavanje pokretanja programa (ili čak omogućavanje pokretanja više programa u isto vrijeme), koji omogućava programima da dijele istu memoriju i komuniciraju s različitim uređajima. Takav skup softvera (softvera) u suštini se naziva operativni sistem i njegovi zadaci uključuju praćenje da li sistem radi ispravno i efikasno, kao i osiguravanje lakoće upravljanja ovim sistemom.

operativni sistem

Operativni sistem, skraćeno OS, je skup međusobno povezanih programa dizajniranih za upravljanje računarskim resursima i organizovanje interakcije korisnika sa računarom..
OS svoju efektivnost postiže prije svega kroz najvažniju tehniku ​​- tehniku virtuelizacija. OS je u interakciji s fizičkim resursom (procesor, memorija, disk, itd.) i transformira ga u općenitiji, moćniji i lakši za korištenje oblik. Stoga, za opšte razumevanje, možete vrlo grubo uporediti operativni sistem sa virtuelnom mašinom.
Da bi se omogućilo korisnicima da daju komande operativnom sistemu i na taj način koriste mogućnosti virtuelne mašine (kao što je pokretanje programa, dodeljivanje memorije, pristup datoteci i tako dalje), operativni sistem obezbeđuje neki interfejs tzv. API (sučelje za programiranje aplikacije) i na koje možete pozivati ​​(poziv). Tipičan operativni sistem omogućava obavljanje stotina sistemskih poziva.
Konačno, budući da virtuelizacija omogućava pokretanje više programa (na taj način dijeljenje CPU) i istovremeno pristupanje njihovim uputstvima i podacima (na taj način dijeljenje memorije) i pristup diskovima (na taj način dijeljenje I/O uređaja). , operativni sistem se također naziva menadžer resursa. Svaki procesor, disk i memorija su resurs sistema, pa tako jedna od uloga operativnog sistema postaje zadatak upravljanja tim resursima, radeći to efikasno, pošteno ili obrnuto, u zavisnosti od zadatka za koji ovaj operativni sistem radi. je dizajniran.

CPU virtualizacija

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

Operativni sistemi: tri laka komada. Dio 1: Uvod (prijevod)

Ne izvodi nikakve posebne radnje, u stvari, sve što radi je pozivanje funkcije obrtanje(), čiji je zadatak da kruži kroz provjeru vremena i vrati se nakon jedne sekunde. Dakle, neograničeno ponavlja niz koji je korisnik prenio kao argument.
Pokrenimo ovaj program i prosledimo mu znak "A" kao argument. Rezultat nije posebno zanimljiv - sistem jednostavno izvršava program koji periodično prikazuje znak "A".
Isprobajmo sada opciju kada se pokreće mnogo instanci istog programa, ali izlaze različita slova da bi bilo jasnije. U ovom slučaju, rezultat će biti nešto drugačiji. Uprkos činjenici da imamo jedan procesor, program se izvršava istovremeno. Kako se to dešava? Ali ispostavilo se da operativni sistem, ne bez pomoći hardverskih mogućnosti, stvara iluziju. Iluzija da sistem ima više virtuelnih procesora, pretvarajući jedan fizički procesor u teoretski beskonačan broj i na taj način omogućavajući naizgled programima da rade istovremeno. Ova iluzija se zove CPU virtualizacija.
Ova slika postavlja mnoga pitanja, na primjer, ako nekoliko programa želi da radi istovremeno, 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 i predstavljaju osnovne mehanizme koje OS implementira. Otuda uloga OS-a kao menadžera resursa.

Virtualizacija memorije

Pogledajmo sada pamćenje. Fizički model memorije u modernim sistemima je predstavljen kao niz bajtova.. Za čitanje iz memorije potrebno je navesti adresa ćelijeda mu pristupite. Da biste upisali ili ažurirali podatke, također morate navesti podatke i adresu ćelije u koju ćete ih napisati.
Memoriji se stalno pristupa tokom izvršavanja programa. Program pohranjuje svoju cjelokupnu strukturu podataka u memoriju i pristupa joj izvršavajući različite instrukcije. Instrukcije se, u međuvremenu, takođe pohranjuju u memoriju, pa im se pristupa i za svaki zahtjev za sljedeću instrukciju.

malloc() poziv

Razmislite o sljedećem programu, koji dodjeljuje područje memorije pomoću poziva malloc () (https://youtu.be/jnlKRnoT1m0):

Operativni sistemi: tri laka komada. Dio 1: Uvod (prijevod)

Program radi nekoliko stvari. Prvo dodjeljuje nešto memorije (red 7), zatim ispisuje adresu dodijeljene ćelije (red 9), upisuje nulu u prvi slot dodijeljene memorije. Zatim, program ulazi u petlju u kojoj povećava vrijednost pohranjenu u memoriji na adresi u varijabli „p“. Takođe ispisuje ID samog procesa. ID procesa je jedinstven 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 pod našu teoriju! Tačno, budući da moderne distribucije imaju randomizaciju memorije omogućenu po defaultu. Ako je onemogućen, dobijamo očekivani rezultat - memorijske adrese dva istovremeno pokrenuta programa će se podudarati.

Operativni sistemi: tri laka komada. Dio 1: Uvod (prijevod)

Kao rezultat toga, ispostavilo se da dva nezavisna programa rade sa svojim privatnim adresnim prostorima, koje operativni sistem mapira u fizičku memoriju.. Stoga, korištenje memorijskih adresa unutar jednog programa neće utjecati na druge ni na koji način, a svakom se programu čini da ima svoj dio fizičke memorije, koji mu je u potpunosti dat. Realnost je, međutim, da je fizička memorija zajednički resurs kojim upravlja operativni sistem.

Dosljednost

Još jedna od važnih tema u okviru operativnih sistema je − konzistentnost. Ovaj termin se koristi kada se govori o problemima u sistemu koji se mogu javiti kada se radi sa više stvari u isto vreme u okviru istog programa. Problemi konzistentnosti se javljaju čak i unutar samog operativnog sistema. U prethodnim primjerima virtualizacije memorije i procesora shvatili smo da OS upravlja mnogim stvarima u isto vrijeme - pokreće prvi proces, zatim drugi, itd. 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 sistemi: tri laka komada. Dio 1: Uvod (prijevod)

Program u glavnoj funkciji kreira dvije niti koristeći poziv pthread_create(). U ovom primjeru, nit se može smatrati funkcijom koja radi 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 sa argumentom 1000. Kao što ste mogli pretpostaviti, rezultat bi trebao biti 2000 jer je svaka nit povećala varijablu 1000 puta. Međutim, nije sve tako jednostavno. Pokušajmo pokrenuti program sa redom veličine više ponavljanja.

Operativni sistemi: tri laka komada. Dio 1: Uvod (prijevod)

Unošenjem broja, na primjer, 100000, očekujemo da ćemo rezultat vidjeti kao broj 200000. Međutim, ako pokrenemo broj 100000 nekoliko puta, ne samo da nećemo vidjeti tačan odgovor, već ćemo dobiti i različite netačne odgovore. Odgovor leži u činjenici da su za povećanje broja potrebne tri operacije - izdvajanje broja iz memorije, povećanje i zatim ponovno upisivanje broja. Budući da se sve ove instrukcije ne izvršavaju atomski (sve u isto vrijeme), mogu se dogoditi ovakve čudne stvari. Ovaj problem se naziva u programiranju trkačko stanje. Kada nepoznate sile u nepoznatom trenutku mogu uticati na izvođenje bilo koje vaše operacije.

izvor: www.habr.com

Dodajte komentar