Operativni sustavi: Tri jednostavna dijela. Dio 1: Uvod (prijevod)

Uvod u operacijske sustave

Pozdrav, Habr! Želim vam predstaviti seriju članaka-prijevoda jedne zanimljive literature — OSTEP. Ovaj materijal duboko razmatra rad unix-sličnih operativnih sustava, naime — rad s procesima, raznim planerima, memorijom i sličnim komponentama koje čine moderni OS. Original svih materijala možete pogledati ovdje ovdje. Molim vas, imajte na umu da je prijevod izveden neprofesionalno (dovoljno slobodno), ali se nadam da sam zadržao opći smisao.

Laboratorijske vježbe vezane uz 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 osobna adaptacija: github.com/bykvaadm/OS/tree/master/ostep

A također možete zaviriti na moj kanal u telegramu =)

Rad programa

Što se događa kada se pokrene neki program? Pokrenuti program izvršava jednu jednostavnu stvar — izvršava instrukcije. Svake sekunde milijuni, pa čak i milijarde instrukcija se izvlače iz radne memorije od strane procesora, koji ih zatim dekodira (na primjer, prepoznaje kojoj vrsti pripadaju ove instrukcije) i izvršava. To mogu biti zbrajanje dvaju brojeva, pristup memoriji, provjera uvjeta, prijelaz na funkciju i tako dalje. Nakon dovršetka izvršavanja jedne instrukcije, procesor prelazi na izvršavanje druge. Tako se instrukcija za instrukcijom izvršavaju sve dok program ne završi.
Ovaj primjer je naravno pojednostavljen — zapravo, za ubrzanje rada procesora, moderna oprema omogućava izvršavanje instrukcija izvan redoslijeda, predviđanje mogućih rezultata, izvršavanje instrukcija istovremeno i slične trikove.

Fon-Najmanov model računanja

Opisani pojednostavljeni oblik rada nalikuje Fon-Najmanovom modelu računanja. Fon-Najman je jedan od pionira računalnih sustava, također je jedan od autora teorije igara. Tijekom rada programa događa se još mnoštvo drugih događaja, rade mnogi drugi procesi i vanjska logika, čija je osnovna svrha — pojednostavljenje pokretanja, rada i održavanja sustava.
Postoji skup softvera koji je odgovoran za jednostavno pokretanje aplikacija (ili čak omogućava pokretanje više programa istovremeno); on omogućuje aplikacijama da dijele istu memoriju te interagiraju s različitim uređajima. Taj skup softvera se zapravo naziva operativnim sustavom, a njegove zadaće uključuju praćenje ispravnog i učinkovitog rada sustava, kao i osiguranje jednostavnog upravljanja tim sustavom.

Operativni sistem

Operativni sustav, skraćeno OS, je skup međusobno povezanih programa koji su namijenjeni upravljanju resursima računala i organizaciji interakcije korisnika s računalom..
OS postiže svoju učinkovitost prvenstveno kroz najvažniju tehniku — tehniku virtualizacije. OS komunicira s fizičkim resursima (procesorom, memorijom, diskom i sličnima) i pretvara ih u općenitiju, s većim mogućnostima i jednostavniju za korištenje verziju samog sebe. Dakle, za opće razumijevanje, može se vrlo grubo usporediti operativni sustav s virtualnom mašinom.
Kako bi omogućila korisnicima da izdaju naredbe operativnom sustavu i na taj način koriste mogućnosti virtualne mašine (kao što su: pokretanje aplikacija, dodjela memorije, pristup datotekama itd.), operativni sustav pruža određeni sučelje koje se naziva API (application programming interface) i kojem se mogu izvoditi pozivi (call). Tipičan operativni sustav pruža mogućnost izvođenja stotina sistemskih poziva.
I konačno, budući da virtualizacija omogućuje više aplikacijama da rade (na taj način zajednički koriste CPU) i istovremeno pristupaju svojim instrukcijama i podacima (time dijeleći memoriju), kao i pristupaju diskovima (time zajednički koristeći ulazno-izlazne uređaje), operativni sustav se također naziva menadžerom resursa. Svaki procesor, disk i memorija su resursi sustava, a stoga jedna od uloga operativnog sustava postaje zadatak upravljanja tim resursima, radeći to učinkovito, pravedno ili, s druge strane, u zavisnosti od zadatka za koji je taj operativni sustav razvijen.

Virtualizacija CPU

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

Operativni sustavi: Tri jednostavna dijela. Dio 1: Uvod (prijevod)

On ne izvršava nikakve posebne radnje, suštinski, sve što radi — poziva funkciju spin(), čiji je zadatak ciklična provjera vremena i povratak, nakon što je prošla jedna sekunda. Tako se neprekidno ponavlja niz koji je korisnik poslao kao argument.
Pokrenut ćemo ovaj program i proslijediti mu kao argument znak “A”. Rezultat nije posebno zanimljiv — sustav jednostavno izvršava program koji periodično ispisuje znak “A”.
Sada ćemo isprobati varijantu kada je pokrenuto više instanci istog programa, ali ispisuju različita slova, kako bi bilo jasnije. U ovom slučaju, rezultat će biti nešto drugačiji. Iako imamo samo jedan procesor, program se izvršava simultano. Kako to? A to se događa tako što operativni sustav, uz pomoć mogućnosti hardvera, stvara iluziju. Iluziju da u sustavu postoji nekoliko virtualnih procesora, pretvarajući jedan fizički procesor u teoretski beskonačan broj i time omogućava programima da izgledaju kao da se izvršavaju simultano. Tu iluziju nazivamo Virtualizacija CPU-a.
Ovakva slika postavlja mnogo pitanja, na primjer, ako nekoliko programa želi pokrenuti istovremeno, koji će se točno pokrenuti? Na to pitanje odgovaraju “politike” OS-a. Politike se koriste na mnogim mjestima u OS-u i odgovaraju na slična pitanja, a također su osnovni mehanizmi koje OS provodi. Odakle i uloga OS-a kao upravitelja resursima.

Virtualizacija memorije

Sada razmotrimo memoriju. Fizički model memorije u modernim sustavima predstavlja se kao niz bajtova. Za čitanje iz memorije potrebno je navesti adresu ćelije, kako bismo imali pristup. Da bismo zapisali ili ažurirali podatke, također se treba navesti podaci i adresa ćelije u koju ih zapisujemo.
Pristupi memoriji događaju se neprekidno tijekom rada programa. Program pohranjuje u memoriji čitavu svoju strukturu podataka, i obraća joj se izvršavajući različite instrukcije. Usput, instrukcije se također pohranjuju u memoriji, stoga se pristupi memoriji javljaju i na svaki zahtjev za sljedećom instrukcijom.

Poziv malloc()

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

Operativni sustavi: Tri jednostavna dijela. Dio 1: Uvod (prijevod)

Program radi nekoliko stvari. Prvo, dodjeljuje određenu količinu memorije (linija 7), zatim ispisuje adresu dodijeljenog prostora (linija 9), a zatim zapisuje nulu u prvi slot dodijeljene memorije. Nakon toga program ulazi u petlju u kojoj inkrementira vrijednost zabilježenu u memoriji na adresi u varijabli “p”. Također ispisuje identifikator svog vlastitog procesa. Identifikator procesa jedinstven je za svaki pokrenuti proces. Kada pokrenemo nekoliko kopija, nailazimo na zanimljiv rezultat: U prvom slučaju, ako ne učinimo ništa i jednostavno pokrenemo nekoliko kopija, adrese će biti različite. No, to se ne uklapa u našu teoriju! Točno, jer su u modernim distribucijama prema zadanim postavkama uključene funkcije randomizacije memorije. Ako je onemogućimo, dobit ćemo očekivani rezultat — adrese memorije dviju istovremeno pokrenutih programa će se podudarati.

Operativni sustavi: Tri jednostavna dijela. Dio 1: Uvod (prijevod)

Na kraju dolazimo do zaključka da dva neovisna programa rade sa svojim vlastitim privatnim adresnim prostorima, koji su opet mapirani od strane operativnog sustava u fizičku memoriju. Stoga korištenje adresa memorije unutar jednog programa ne utječe na druge, a svakom programu se čini da ima svoj vlastiti dio fizičke memorije, potpuno predan na raspolaganje. Stvarnost, međutim, jest da je fizička memorija zajednički resurs kojim upravlja operativni sustav.

Konsistentnost

Još jedna važna tema u okviru operativnih sustava je usklađenost. Ovaj pojam se koristi kada govorimo o problemima u sustavu koji mogu nastati pri radu s više stvari istovremeno unutar jednog programa. Problemi usklađenosti javljaju se čak i unutar samog operativnog sustava. U prethodnim primjerima s virtualizacijom memorije i procesora, shvatili smo da OS upravlja mnogim stvarima istovremeno — pokreće prvi proces, zatim drugi i tako dalje. Kako se ispostavilo, takvo ponašanje može dovesti do određenih problema. Na primjer, moderni višedretveni programi suočavaju se s takvim poteškoćama.

Razmotrit ćemo sljedeći program:

Operativni sustavi: Tri jednostavna dijela. Dio 1: Uvod (prijevod)

Program u glavnoj funkciji stvara dva threada, koristeći poziv Pthread_create(). U ovom primjeru, nit se može smatrati funkcijom koja se izvršava u jednom prostoru memorije pored drugih funkcija, pri čemu je broj istovremeno pokrenutih funkcija očito veći od jedne. U ovom primjeru, svaka nit započinje i izvršava funkciju worker() koja jednostavno inkrementira varijablu,.

Pokrenimo ovaj program s argumentom 1000. Kao što ste već mogli pretpostaviti, rezultat bi trebao biti 2000, budući da je svaka nit inkrementirala varijablu 1000 puta. Međutim, nije sve tako jednostavno. Pokušajmo pokrenuti program s brojem ponavljanja red veličine veći.

Operativni sustavi: Tri jednostavna dijela. Dio 1: Uvod (prijevod)

Dajući na ulaz broj, primjerice, 100000, očekujemo da ćemo na izlazu vidjeti broj 200000. Međutim, nakon nekoliko pokretanja s brojem 100000, ne samo da nećemo dobiti točan odgovor, već ćemo dobiti i različite pogrešne odgovore. Rješenje leži u tome da su potrebne tri operacije za povećanje broja — preuzimanje broja iz memorije, inkrementacija i zatim zapisivanje broja natrag. Budući da se sve ove instrukcije ne izvršavaju atomarno (sve odjednom), takve čudne stvari mogu se dogoditi. Ovaj problem se u programiranju naziva race condition — stanje utrke. Kada nepoznate sile u nepoznatom trenutku mogu utjecati na izvršavanje nekih vaših operacija.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster