Operacijski sustavi: Tri jednostavna dijela. Dio 2: Apstrakcija: Proces (prijevod)

Uvod u operacijske sustave

Pozdrav, Habr! Želim predstaviti seriju članaka-prijevoda jedne zanimljive literature po mom mišljenju — OSTEP. U ovom materijalu duboko se razmatra rad unix-sličnih operacijskih sustava, a posebno — rad s procesima, raznim planerima, memorijom i drugim sličnim komponentama koji č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:

Ostali dijelovi:

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

Razmotrit ćemo najosnovniju apstrakciju koju OS pruža korisnicima: proces. Definicija procesa je prilično jednostavna — to je radni program. Program sam po sebi je bezdušna stvar, smještena na disku — to je skup uputa i možda nekih statičnih podataka koji čekaju trenutak pokretanja. Upravo OS uzima te bajtove i pokreće ih, pretvarajući program u nešto korisno.
Najčešće korisnici žele pokretati više od jednog programa istovremeno, na primjer, možete pokrenuti preglednik, igru, multimedijske player, uređivač teksta i slično na svom prijenosniku. U stvari, tipičan sustav može pokretati desetke i stotine procesa istovremeno. Ova činjenica čini sustav jednostavnijim za korištenje, nikada se ne morate brinuti je li CPU slobodan, jednostavno pokrećete programe.

Odavde proizlazi problem: kako stvoriti iluziju mnogih CPU-a? Kako OS može stvoriti iluziju praktički beskonačnog broja CPU-a, čak i ako imate samo jedan fizički CPU?

OS stvara tu iluziju putem virtualizacije CPU-a. Pokrećući jedan proces, zatim ga zaustavljajući, pokrećući drugi proces i tako dalje, OS može održavati iluziju da postoji mnogo virtualnih CPU-a, iako zapravo postoji samo jedan ili nekoliko fizičkih procesora. Ova tehnika se naziva vremensko dijeljenje CPU resursa. Ova tehnika omogućuje korisnicima pokretanje onoliko istodobnih procesa koliko žele. Cijena ovog rješenja je performansa – jer ako CPU dijele više procesa, svaki proces će se obrađivati sporije.
Za ostvarenje virtualizacije CPU-a, a osobito kako bi to učinili dobro, OS treba i nisko- i visoko-nivoj podršci. Nisko-nivojna podrška se naziva mehanizmima — to su nisko-nivojne metode ili protokoli koji implementiraju potrebni dio funkcionalnosti. Primjer takve funkcionalnosti je prebacivanje konteksta, što omogućava OS-u da zaustavi jedan program i pokrene drugi program na procesoru. Ova vremenska dioba implementirana je u svim modernim OS-ima.
Na vrhu tih mehanizama nalazi se određena logika ugrađena u OS, u obliku 'politika'. Politika — to je neki algoritam donošenja odluka od strane operativnog sustava. Takve politike, na primjer, odlučuju koju program treba pokrenuti (iz liste naredbi) kao prvu. Tako, primjerice, ovu će odluku donijeti politika koja se naziva planer (scheduling policy) i pri odabiru rješenja oslanjat će se na podatke kao što su: povijest pokretanja (koji je program bio najduže pokrenut u posljednjoj minuti), koju opterećenost taj proces predstavlja (koje vrste programa su pokrenute), metrike performansi (je li sistem optimiziran za interaktivnu interakciju ili za propusnost) i tako dalje.

Apstrakcija: proces

Apstrakcija radnog programa, koju izvršava operativni sustav, to je ono što nazivamo procedura. Kako je ranije rečeno, proces je samo radni program u bilo kojem trenutku. Program putem kojeg možemo dobiti ukupne informacije s raznih resursa sustava, i na koje se taj program obraća ili koje program zahvaća tijekom svog izvršavanja.
Za razumijevanje sastavnica procesa potrebno je shvatiti stanja sustava: što program može čitati ili mijenjati tijekom svog rada. U bilo kojem trenutku treba razumjeti koji su elementi sustava važni za izvršenje programa.
Jedan od očitih elemenata stanja sustava koji uključuje proces je memorija. Upute se nalaze u memoriji. Podaci koje program čita ili zapisuje također se nalaze u memoriji. Tako, memorija koju proces može adresirati (takozvani adresni prostor) je dio procesa.
Također, dio stanja sustava su registri. Mnoge upute su usmjerene na promjenu vrijednosti registara ili čitanje njihovih vrijednosti, pa registari postaju važan dio rada procesa.
Valja napomenuti da se stanje mašine također sastoji od nekih specijalnih registara. Na primjer, IP — pokazivač instrukcija — pokazuje na instrukciju koju program izvršava u trenutku. Također postoji pokazivač stoga i s njim povezan pokazivač okvira, koji se koriste za upravljanje: parametrima funkcija, lokalnim varijablama i adresama povratka.
Na kraju, programi često pristupaju ROM-u (trajnom memorijskom uređaju). Takve informacije o "I/O" (ulaz-izlaz) trebaju uključivati popis datoteka koje su trenutno otvorene od strane procesa.

API procesa

Kako bismo poboljšali razumijevanje rada procesa, proučimo primjere sistemskih poziva koji trebaju biti uključeni u svaki operacijski sustav. Ovi API-ji su na bilo kojem OS-u dostupni u nekom obliku.

● Create (kreiranje): OS mora sadržavati neku metodu koja omogućava stvaranje novih procesa. Kada unesete naredbu u terminal ili pokrenete aplikaciju dvostrukim klikom na ikonu, šalje se poziv OS-u za stvaranje novog procesa i pokretanje navedene aplikacije.
● Brisanje: Kako postoji sučelje za stvaranje procesa, OS također mora omogućiti prisilno brisanje procesa. Većina programa će se prirodno pokrenuti i završiti sama po sebi tijekom izvršavanja. U suprotnom, korisnik bi trebao imati mogućnost da ih prekine, stoga će sučelje za zaustavljanje procesa biti korisno.
● Čekanje (čekanje): Ponekad je korisno sačekati završetak procesa, stoga se osiguravaju neka sučelja koja pružaju mogućnost čekanja.
● Razno upravljanje (različito upravljanje): Osim ubijanja i čekanja procesa, postoje i druge raznovrsne metode kontrole. Na primjer, većina operativnih sustava nudi mogućnost zamrzavanja procesa (zaustavljanje njegove izvršnje na određeno vrijeme) i kasnijeg ponovnog pokretanja (nastavak izvršenja)
● Status (stanje): Postoje razni sučelja za dobivanje određenih informacija o statusu procesa, kao što su trajanje njegove uspješnosti ili u kojem je stanju trenutno.

Operacijski sustavi: Tri jednostavna dijela. Dio 2: Apstrakcija: Proces (prijevod)

Izrada procesa: detalji

Jedna od zanimljivih stvari je kako se programi zapravo transformiraju u procese. Osobito, kako operativni sustav pokreće i starta program. Kako se konkretno stvara proces.
Prvo, operativni sustav mora učitati kod programa i statičke podatke u memoriju (u adresni prostor procesa). Programi se obično nalaze na disku ili čvrstom stanju u nekom izvršnom formatu. Tako da proces učitavanja programa i statičkih podataka u memoriju zahtijeva od operativnog sustava sposobnost da pročita te bajtove s diska i smjesti ih negdje u memoriji.

U ranim operativnim sustavima proces učitavanja izvodio se nestrpljivo (eagerly), što znači da je kod učitan u memoriju u cijelosti prije nego što je program pokrenut. Moderni operativni sustavi to rade lijeno (lazily), učitavajući komade koda ili podataka samo kada su potrebni programu tijekom njegovog izvršavanja.

Nakon što su kod i statički podaci učitani u memoriju, operativni sustav treba izvesti još nekoliko stvari prije nego što započne proces. Određen broj memorije mora se dodijeliti za stog. Programi koriste stog za lokalne varijable, parametre funkcija i adrese povratka.. Operativni sustav dodjeljuje tu memoriju i dodaje je procesu. Stog se također može dodijeliti s određenim argumentima, konkretno popunjava parametre funkcije main(), primjerice nizom argc i argv.

Operativni sustav također može dodijeliti određenu količinu memorije za hrpu (heap) programa. Hrpa se koristi od strane programa za eksplicitno tražene dinamički dodijeljene podatke.. Programi traže ovaj prostor pozivajući funkciju malloc() i eksplicitno ga oslobađaju pozivajući funkciju free(). Heap je potreban za strukture podataka kao što su: povezane liste, hash tabele, stabla i druge. U početku se za heap rezervira malo memorije, ali kako program radi, heap može zatražiti više memorije putem poziva malloc() bibliotečkog API-a. Operacijski sustav je uključen u proces dodjeljivanja veće količine memorije kako bi pomogao u zadovoljavanju tih poziva.

Operacijski sustav također obavlja inicijalizacijske zadatke, posebno one koji se odnose na ulaz-izlaz. Na primjer, u UNIX sustavima svaki proces po defaultu ima 3 otvorena deskriptora datoteka za standardni ulaz, izlaz i greške. Ovi deskriptori omogućuju programima da čitaju unos s terminala, kao i da ispisuju informacije na ekran.

Dakle, učitavanjem koda i statičkih podataka u memoriju, stvaranjem i inicijaliziranjem stoga, te izvršavanjem drugih zadataka vezanih za ulaz-izlaz, OS priprema teren za izvršavanje procesa. Na kraju, ostaje posljednji zadatak: pokrenuti program kroz njegovu ulaznu točku, koja se naziva funkcija main(). Prelazeći na izvršavanje funkcije main(), OS predaje kontrolu CPU-u novostvorenom procesu, čime program počinje s izvršavanjem.

Stanje procesa

Sada kada imamo neko razumijevanje o tome što je proces i kako se stvara, navedimo stanja procesa u kojima može biti. U najjednostavnijem obliku, proces može biti u jednom od ovih stanja:
● Ispunjeno. U ispunjenom stanju, proces se izvršava na procesoru. To znači da se izvršavaju instrukcije.
● Spremno. U stanju spremnosti, proces je spreman za pokretanje, ali iz nekog razloga OS ga ne izvršava u tom trenutku.
● Založeno. U zablokiranom stanju, proces izvršava neke operacije koje ga sprečavaju da bude spreman za izvršavanje dok se ne dogodi neki događaj. Jedan od uobičajenih primjera je kada proces inicijalizira IO operaciju, postaje blokiran i tako drugi proces može koristiti procesor.

Operacijski sustavi: Tri jednostavna dijela. Dio 2: Apstrakcija: Proces (prijevod)

Zamislite te stanje kao graf. Kao što možemo vidjeti na slici, stanje procesa može se mijenjati između RUNNING i READY prema odluci OS-a. Kada se stanje procesa mijenja s READY na RUNNING to znači da je proces zakazano izvršen. U suprotnom slučaju — uklonjen iz rasporeda. U trenutku kada proces postane BLOCKED, na primjer, prilikom inicijalizacije IO operacije, OS će ga zadržati u tom stanju do nastanka nekog događaja, kao što je završetak IO. U tom trenutku dolazi do prijelaza u stanje READY, a moguće i trenutačno u stanje RUNNING, ako to odluči OS.
Pogledajmo primjer kako dva procesa prolaze kroz ta stanja. Za početak zamislimo da su oba procesa pokrenuta i da svaki koristi samo CPU. U tom slučaju, njihova stanja će izgledati ovako.

Operacijski sustavi: Tri jednostavna dijela. Dio 2: Apstrakcija: Proces (prijevod)

U sljedećem primjeru prvi proces nakon nekog vremena rada zahtijeva IO i prelazi u stanje BLOCKED, omogućavajući drugom procesu da se pokrene (SLO 1.4). OS vidi da proces 0 ne koristi CPU i pokreće proces 1. Tijekom izvršavanja procesa 1 — IO se završava i status procesa 0 se mijenja u READY. Na kraju, proces 1 završava, a nakon njegovog završetka, proces 0 se pokreće, izvršava i završava svoj rad.

Operacijski sustavi: Tri jednostavna dijela. Dio 2: Apstrakcija: Proces (prijevod)

Struktura podataka

OS je sama program, i kao i svaki drugi program ima određene ključne strukture podataka koje prate razne relevantne dijelove informacija. Za praćenje stanja svakog procesa, OS će održavati neki popis procesa za sve procese u stanju READY i neku dodatnu informaciju za praćenje procesa koji se trenutno izvršavaju. Također, OS mora pratiti i blokirane procese. Nakon završetka IO, OS je obvezan probuditi potreban proces i prevesti ga u stanje spremnosti za pokretanje.

Tako, na primjer, OS mora sačuvati stanje registara procesora. U trenutku zaustavljanja procesa, stanje registara se pohranjuje u adresnom prostoru procesa, a u trenutku nastavka njegovog rada — vraćaju se vrijednosti registara i tako se nastavlja izvršenje tog procesa.

Osim stanja ready, blocked i running, postoje još neka druga stanja. Ponekad, u trenutku stvaranja, proces može imati stanje INIT. Na kraju, proces može biti stavljen u stanje FINAL kada je već završen, ali informacije o njemu još nisu očišćene. U UNIX sustavima to stanje se naziva zombie proces. Ovo stanje je korisno u slučajevima kada roditeljski proces želi saznati kod povratka potomka, na primjer, obično 0 signalizira uspješan završetak, a 1 o grešci, međutim, programeri mogu praviti dodatne kodove izlaza, signalizirajući o različitim problemima. Kada završi, roditeljski proces izvršava posljednji sistemski poziv, kao što je wait(), kako bi čekao završetak rada procesa potomka i signalizirao OS-u da može očistiti sve podatke povezane sa završenim procesom.

Operacijski sustavi: Tri jednostavna dijela. Dio 2: Apstrakcija: Proces (prijevod)

Ključne točke predavanja:

● Proces — glavna apstrakcija aktivnog programa u operativnom sustavu. U bilo kojem trenutku, proces se može opisati prema svom stanju: sadržaju memorije u njegovom adresnom prostoru, sadržaju registara procesora, uključujući pokazivač instrukcija i pokazivač stoga, kao i informacijama o IO-u, na primjer otvorenim datotekama koje se čitaju ili zapisuju.
● API procesa sastoji se od poziva koje programi mogu raditi u vezi s procesima. Obično su to pozivi za stvaranje, brisanje ili drugi.
● Proces se nalazi u jednom od mnogih stanja, uključujući running, ready, blocked. Različiti događaji, kao što su planiranje, izuzeće iz planiranja ili čekanje, mogu prevesti stanje procesa iz jednog u drugo.
● Popis procesa sadrži informacije o svim procesima u sustavu. Svaki unos u njemu naziva se process control block, koja je zapravo struktura koja sadrži sve potrebne informacije o konkretnom procesu. 

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