Operativni sustavi: tri laka komada. 2. dio: Apstrakcija: Proces (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:

Ostali dijelovi:

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

Pogledajmo najosnovniju apstrakciju koju OS pruža korisnicima: proces. Definicija procesa je prilično jednostavna - on je pokrenuti program. Sam program je beživotna stvar koja se nalazi na disku - to je skup uputa i možda nekih statičkih podataka koji čekaju na pokretanje. OS je taj koji uzima te bajtove i pokreće ih, pretvarajući program u nešto korisno.
Najčešće korisnici žele pokrenuti više od jednog programa u isto vrijeme, na primjer, na prijenosnom računalu možete pokrenuti preglednik, igricu, media player, uređivač teksta i slično. Zapravo, tipičan sustav može pokretati desetke ili stotine procesa istovremeno. Ova činjenica čini sustav lakšim za korištenje, nikada ne morate brinuti je li CPU slobodan, samo pokrećete programe.

Ovo postavlja problem: kako osigurati iluziju mnogo CPU-a? Kako OS može stvoriti iluziju gotovo beskonačnog broja CPU-a, čak i ako imate samo jedan fizički CPU?

OS stvara ovu iluziju virtualizacijom procesora. Pokretanjem jednog procesa, zatim njegovim zaustavljanjem, pokretanjem drugog procesa i tako dalje, OS može održavati iluziju da postoji mnogo virtualnih procesora, dok će zapravo postojati jedan ili više fizičkih procesora. Ova tehnika se zove podjela CPU resursa prema vremenu. Ova tehnika omogućuje korisnicima pokretanje onoliko istodobnih procesa koliko žele. Trošak ovog rješenja je izvedba - jer ako CPU dijeli nekoliko procesa, svaki proces će se obrađivati ​​sporije.
Da bi implementirao CPU virtualizaciju, a posebno da bi to učinio dobro, OS treba podršku i na niskoj i na visokoj razini. Podrška niske razine se zove mehanizmima su metode ili protokoli niske razine koji implementiraju traženi dio funkcionalnosti. Primjer takve funkcionalnosti je prebacivanje konteksta, koje OS-u daje mogućnost da zaustavi jedan program i pokrene drugi program na procesoru. Ovakva vremenska podjela implementirana je u svim modernim operacijskim sustavima.
Povrh ovih mehanizama postoji neka logika ugrađena u OS, u obliku "pravila". Politika je određeni algoritam donošenja odluka za operativni sustav. Takve politike, na primjer, odlučuju koji program treba prvi pokrenuti (s popisa naredbi). Tako će npr. ovaj problem riješiti politika tzv planer (politika rasporeda) a pri odabiru rješenja vodit će se podacima kao što su: povijest pokretanja (koji je program bio najdulje pokretan u zadnjim minutama), kakvo opterećenje taj proces nosi (koje su vrste programa pokrenuti), metrika performansi (je li sustav je optimiziran za interaktivnu interakciju ili za propusnost) i tako dalje.

Apstrakcija: proces

Nazivamo apstrakciju pokrenutog programa kojeg izvršava operativni sustav postupak. Kao što je ranije spomenuto, proces je jednostavno pokrenuti program u bilo kojem trenutku. Program pomoću kojeg možemo dobiti sažete informacije iz različitih resursa sustava kojima ovaj program pristupa ili na koje utječe tijekom svog izvođenja.
Da biste razumjeli komponente procesa, morate razumjeti stanja sustava: što program može pročitati ili promijeniti tijekom svog rada. U svakom trenutku morate razumjeti koji su elementi sustava važni za izvođenje programa.
Jedan od očitih elemenata stanja sustava koji proces uključuje jest память. Upute se nalaze u memoriji. Podaci koje program čita ili zapisuje također se nalaze u memoriji. Stoga je memorija koju proces može adresirati (zvana adresni prostor) dio procesa.
Također dio stanja sustava su i registri. Mnoge instrukcije usmjerene su na promjenu vrijednosti registara ili čitanje njihove vrijednosti, pa tako registri također postaju važan dio rada procesa.
Treba napomenuti da se stanje stroja također formira iz nekih posebnih registara. Na primjer, IP - pokazivač instrukcija — pokazivač na instrukciju koju program trenutno izvršava. Postoji također pokazivač stoga i vezano za to pokazivač okvira, koji se koriste za upravljanje: parametrima funkcije, lokalnim varijablama i povratnim adresama.
Konačno, programi često pristupaju ROM-u (memorija samo za čitanje). Ove informacije o "I/O" (ulazu/izlazu) trebale bi uključivati ​​popis datoteka koje proces trenutno otvara.

API procesa

Kako bismo bolje razumjeli kako proces funkcionira, proučimo primjere sistemskih poziva koji bi trebali biti uključeni u bilo koje sučelje operacijskog sustava. Ti su API-ji dostupni u jednom ili drugom obliku na bilo kojem OS-u.

stvoriti (stvaranje): OS mora uključivati ​​neku metodu koja vam omogućuje 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 zatim pokretanje navedenog programa.
Uklanjanje: Budući da postoji sučelje za kreiranje procesa, OS bi također trebao omogućiti mogućnost prisilnog uklanjanja procesa. Većina programa će se prirodno pokrenuti i završiti sami od sebe dok rade. Inače bi korisnik želio da ih može ubiti i stoga bi sučelje za zaustavljanje procesa bilo korisno.
Čekaj (čekanje): Ponekad je korisno pričekati da se proces završi, pa su dostupna neka sučelja koja daju mogućnost čekanja.
Misc Control (razne kontrole): Osim ubijanja i čekanja na proces, postoje i druge različite metode kontrole. Na primjer, većina operativnih sustava omogućuje zamrzavanje procesa (zaustavljanje njegovog izvršavanja na određeno razdoblje) i zatim njegovo ponovno pokretanje (nastavak izvršavanja)
status (stanje): Postoje različita sučelja za dobivanje nekih informacija o statusu procesa, kao što je koliko dugo traje ili u kojem se stanju trenutno nalazi.

Operativni sustavi: tri laka komada. 2. dio: Apstrakcija: Proces (prijevod)

Stvaranje procesa: detalji

Jedna od zanimljivosti je kako se točno programi pretvaraju u procese. Osobito kako OS preuzima i pokreće program. Kako točno nastaje proces.
Prije svega, OS mora učitati programski kod i statičke podatke u memoriju (u adresni prostor procesa). Programi se obično nalaze na disku ili SSD-u u nekom izvršnom formatu. Dakle, proces učitavanja programa i statičkih podataka u memoriju zahtijeva da OS može pročitati te bajtove s diska i smjestiti ih negdje u memoriju.

U prvim operativnim sustavima proces učitavanja odvijao se žustro, što znači da se cijeli kod učitavao u memoriju prije pokretanja programa. Moderni operacijski sustavi to čine lijeno, odnosno učitavaju dijelove koda ili podataka samo kada ih program zahtijeva tijekom svog izvođenja.

Nakon što se kod i statički podaci učitaju u memoriju OS-a, postoji još nekoliko stvari koje je potrebno učiniti prije nego što se proces može pokrenuti. Neka količina memorije mora biti dodijeljena za stog. Programi koriste stog za lokalne varijable, parametre funkcije i povratne adrese. OS dodjeljuje ovu memoriju i daje je procesu. Stog se također može dodijeliti s nekim argumentima, konkretno ispunjava parametre funkcije main(), na primjer s nizom argc i argv.

Operativni sustav također može dodijeliti nešto memorije hrpi programa. Programi koriste hrpu za izričito traženje dinamički dodijeljenih podataka. Programi traže ovaj prostor pozivanjem funkcije malloc () i eksplicitno ga briše pozivom funkcije besplatno(). Hrpa je potrebna za podatkovne strukture kao što su povezani listovi, hash tablice, stabla i drugo. Isprva se gomili dodjeljuje mala količina memorije, ali s vremenom, kako program radi, gomila može zatražiti više memorije putem API poziva knjižnice malloc(). Operativni sustav uključen je u proces dodjele više memorije kako bi se zadovoljili ti pozivi.

Operativni sustav će također obavljati zadatke inicijalizacije, posebno one koji se odnose na I/O. Na primjer, na UNIX sustavima, svaki proces prema zadanim postavkama ima 3 otvorena deskriptora datoteke, za standardni ulaz, izlaz i grešku. Ove ručke omogućuju programima čitanje unosa s terminala kao i prikaz informacija na zaslonu.

Stoga, učitavanjem koda i statičkih podataka u memoriju, stvaranjem i inicijaliziranjem stoga i obavljanjem drugog posla vezanog uz obavljanje I/O zadataka, OS priprema pozornicu za izvršenje procesa. Konačno, preostao je još jedan posljednji zadatak: pokretanje programa kroz njegovu ulaznu točku, koja se zove funkcija main(). Izvršavanjem funkcije main(), OS prenosi CPU kontrolu na novostvoreni proces, čime se program počinje izvršavati.

Stanje procesa

Sada kada smo donekle razumjeli što je proces i kako se stvara, nabrojimo stanja procesa u kojima se može nalaziti. U svom najjednostavnijem obliku, proces može biti u jednom od ovih stanja:
Trčanje. Kada se izvodi, proces se izvodi na procesoru. To znači da se instrukcije izvršavaju.
Spreman. U stanju spremnosti, proces je spreman za pokretanje, ali ga OS iz nekog razloga ne izvršava u navedeno vrijeme.
Blokiran. U blokiranom stanju, proces izvodi neke operacije koje ga sprječavaju da bude spreman za izvršenje dok se ne dogodi neki događaj. Jedan uobičajeni primjer je kada proces inicira IO operaciju, on postaje blokiran tako da neki drugi proces može koristiti procesor.

Operativni sustavi: tri laka komada. 2. dio: Apstrakcija: Proces (prijevod)

Ta stanja možete zamisliti u obliku grafikona. Kao što možemo vidjeti na slici, stanje procesa se može mijenjati između RADI i SPREMAN prema nahođenju OS-a. Kada se stanje procesa promijeni iz READY u RUNNING, to znači da je proces zakazan. U suprotnom smjeru - uklonjeno iz izgleda. U trenutku kada proces postane BLOKIRAN, na primjer, pokrenem IO operaciju, OS će ga zadržati u tom stanju dok se ne dogodi neki događaj, na primjer završetak IO. u ovom trenutku prijelaz u stanje SPREMNO i eventualno odmah u stanje RADI ako OS tako odluči.
Pogledajmo primjer kako se dva procesa kreću kroz ova stanja. Za početak, zamislimo da su oba procesa pokrenuta i da svaki koristi samo CPU. U tom će slučaju njihova stanja izgledati ovako.

Operativni sustavi: tri laka komada. 2. dio: Apstrakcija: Proces (prijevod)

U sljedećem primjeru, prvi proces, nakon nekog vremena izvođenja, zahtijeva IO i ulazi u stanje BLOKIRAN, dopuštajući drugom procesu da se pokrene (SLIKA 1.4). OS vidi da proces 0 ne koristi CPU i pokreće proces 1. Dok se proces 1 izvodi, IO je dovršen i status procesa 0 se mijenja u READY. Konačno, proces 1 je završen, a nakon završetka, proces 0 počinje, izvršava se i završava svoj rad.

Operativni sustavi: tri laka komada. 2. dio: Apstrakcija: Proces (prijevod)

Struktura podataka

Sam OS je program i kao i svaki drugi program, ima neke ključne podatkovne strukture koje prate različite relevantne informacije. Za praćenje stanja svakog procesa, OS će podržati neke lista procesa za sve procese u stanju SPREMNO i neke dodatne informacije za praćenje procesa koji se trenutno izvode. Također, OS bi trebao nadzirati blokirane procese. Nakon što je IO dovršen, OS mora probuditi traženi proces i staviti ga u stanje spremno za rad.

Na primjer, OS mora sačuvati stanje registara procesora. U trenutku zaustavljanja procesa, stanje registara se pohranjuje u adresni prostor procesa, au trenutku nastavka njegovog rada vraćaju se vrijednosti registara i na taj način se nastavlja izvršavanje ovog procesa.

Osim stanja spreman, blokiran, pokrenut, postoje i neka druga stanja. Ponekad, u trenutku stvaranja, proces može biti u INIT stanju. Konačno, proces se može staviti u FINAL stanje kada je već završen, ali njegove informacije još nisu obrisane. Na UNIX sustavima ovo stanje se zove zombi proces. Ovo stanje je korisno u slučajevima kada nadređeni proces želi znati povratni kod djeteta, na primjer, obično 0 signalizira uspjeh, a 1 grešku, ali programeri mogu izdati dodatne izlazne kodove da signaliziraju različite probleme. Kada nadređeni proces prekine, upućuje konačni sistemski poziv, kao što je wait(), kako bi pričekao da se podređeni proces prekine i signalizira OS-u da može izbrisati sve podatke povezane s prekinutim procesom.

Operativni sustavi: tri laka komada. 2. dio: Apstrakcija: Proces (prijevod)

Ključne točke predavanja:

proces — glavna apstrakcija pokrenutog programa u OS-u. U bilo kojem trenutku, proces se može opisati njegovim stanjem: sadržajem memorije u njegovom adresnom prostoru, sadržajem registara procesora, uključujući pokazivač instrukcija i pokazivač stog, i IO informacijama, kao što su otvorene datoteke koje se čitaju ili pišu.
API procesa sastoji se od poziva koje programi mogu uputiti procesima. Obično su to pozivi za stvaranje, brisanje ili drugi pozivi.
● Proces je u jednom od mnogih stanja, uključujući pokrenut, spreman, blokiran. Različiti događaji kao što su raspoređivanje, izuzeci od planiranja ili čekanja mogu promijeniti stanje procesa iz jednog u drugo.
Popis procesa sadrži informacije o svim procesima u sustavu. Svaki unos u njemu naziva se blok upravljanja procesom, što je zapravo struktura koja sadrži sve potrebne informacije o određenom procesu. 

Izvor: www.habr.com

Dodajte komentar