Operativni sistemi: tri laka komada. Dio 2: Apstrakcija: Proces (prijevod)

Uvod u operativne sisteme

Hej Habr! Skrećem vam pažnju na seriju članaka-prevoda jedne po meni zanimljive literature - OSTEP. 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:

Ostali dijelovi:

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

Pogledajmo najosnovniju apstrakciju koju OS pruža korisnicima: proces. Definicija procesa je prilično jednostavna – jeste pokrenuti program. Sam program je beživotna stvar koja se nalazi na disku - to je skup uputstava i eventualno nekih statičkih podataka koji čekaju da se pokrenu. Operativni sistem 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 programa istovremeno, na primjer, možete pokrenuti pretraživač, igricu, media player, uređivač teksta i slično na svom laptopu. U stvari, tipičan sistem može istovremeno pokrenuti desetine ili stotine procesa. Ova činjenica čini sistem lakšim za korišćenje, nikada ne morate da brinete o tome da li je CPU slobodan, samo pokrećete programe.

Ovo otvara problem: kako osigurati iluziju mnogih CPU-a? Kako OS može stvoriti iluziju o gotovo beskonačnom broju CPU-a, čak i ako imate samo jedan fizički CPU?

OS stvara ovu iluziju kroz CPU virtualizaciju. Pokretanjem jednog procesa, zatim njegovim zaustavljanjem, pokretanjem drugog procesa i tako dalje, OS može održati iluziju da postoji mnogo virtualnih CPU-a, dok će u stvari postojati jedan ili više fizičkih procesora. Ova tehnika se zove podjela CPU resursa po vremenu. Ova tehnika omogućava korisnicima da pokreću onoliko istovremenih procesa koliko žele. Cijena ovog rješenja su performanse - budući da ako CPU dijeli nekoliko procesa, svaki proces će se obrađivati ​​sporije.
Da bi implementirao CPU virtuelizaciju, a posebno da bi to uradio dobro, OS treba podršku niskog i visokog nivoa. Poziva se podrška niskog nivoa mehanizama su metode ili protokoli niskog nivoa 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. Ova vremenska podjela je implementirana u svim modernim operativnim sistemima.
Povrh ovih mehanizama je neka logika ugrađena u OS, u obliku „politika“. politika je određeni algoritam donošenja odluka za operativni sistem. Takve politike, na primjer, odlučuju koji program treba prvi pokrenuti (sa liste komandi). Tako će, na primjer, ovaj problem biti riješen politikom tzv planer (politika rasporeda) a prilikom odabira rješenja vodit će se takvim podacima kao što su: historija pokretanja (koji je program najduže pokrenut u posljednjim minutama), kakvo opterećenje nosi ovaj proces (koji tipovi programa su pokrenuti), metrika performansi (da li je sistem optimiziran je za interaktivnu interakciju ili za propusnost) i tako dalje.

Apstrakcija: proces

Apstraktnost pokrenutog programa koji izvršava operativni sistem je ono što zovemo proces. Kao što je ranije spomenuto, proces je jednostavno pokrenuti program, u bilo kojem trenutnom vremenskom periodu. Program pomoću kojeg možemo dobiti sažete informacije iz različitih sistemskih resursa kojima ovaj program pristupa ili na koje utiče tokom svog izvršavanja.
Da biste razumjeli komponente procesa, morate razumjeti stanja sistema: šta program može pročitati ili promijeniti tokom svog rada. U svakom trenutku morate razumjeti koji su elementi sistema važni za izvršavanje programa.
Jedan od očiglednih elemenata stanja sistema koji proces uključuje je pamâtʹ. Instrukcije se nalaze u memoriji. Podaci koje program čita ili upisuje također se nalaze u memoriji. Dakle, memorija koju proces može adresirati (nazvan adresni prostor) je dio procesa.
Također dio stanja sistema su registri. Mnoge instrukcije imaju za cilj promenu vrednosti registara ili čitanje njihove vrednosti, pa samim tim i registri postaju važan deo rada procesa.
Treba napomenuti da se stanje mašine formira i iz nekih posebnih registara. Na primjer, IP - instrukcijski pokazivač — pokazivač na instrukciju koju program trenutno izvršava. Postoji također pokazivač steka 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 (memoriji samo za čitanje). Ove “I/O” (ulaz/izlaz) informacije bi trebale uključivati ​​listu datoteka koje su trenutno otvorene procesom.

Procesni API

Da bismo poboljšali naše razumijevanje kako proces funkcionira, proučimo primjere sistemskih poziva koji bi trebali biti uključeni u bilo koji interfejs operativnog sistema. Ovi API-ji su dostupni u jednom ili drugom obliku na bilo kojem OS-u.

stvoriti (kreacija): OS mora uključiti neki metod koji vam omogućava da kreirate nove procese. Kada unesete naredbu u terminal ili pokrenete aplikaciju dvostrukim klikom na ikonu, OS se šalje poziv da kreira novi proces i zatim pokrene navedeni program.
Brisanje: Pošto postoji interfejs za kreiranje procesa, OS bi takođe trebalo da obezbedi mogućnost prinudnog uklanjanja procesa. Većina programa će se prirodno pokrenuti i prekinuti sami od sebe dok rade. U suprotnom bi korisnik želio da ih može ubiti i stoga bi interfejs za zaustavljanje procesa bio koristan.
čekajte (na čekanju): Ponekad je korisno sačekati da se proces završi, pa su obezbeđena neka sučelja koja pružaju mogućnost čekanja.
Misc Control (razne kontrole): Osim ubijanja i čekanja procesa, postoje i druge različite metode kontrole. Na primjer, većina operativnih sistema pruža mogućnost zamrzavanja procesa (zaustavljanje njegovog izvršavanja na određeni period) i zatim ga nastavlja (nastavak izvršavanja)
Status (stanje): Postoje različiti interfejsi za dobijanje nekih informacija o statusu procesa, kao što je koliko dugo je pokrenut ili u kom se stanju trenutno nalazi.

Operativni sistemi: tri laka komada. Dio 2: Apstrakcija: Proces (prijevod)

Kreiranje procesa: detalji

Jedna od zanimljivih stvari je kako se tačno programi pretvaraju u procese. Posebno kako OS podiže i pokreće program. Kako tač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 uređaju u nekom izvršnom formatu. Dakle, proces učitavanja programskih i statičkih podataka u memoriju zahtijeva da OS može pročitati te bajtove s diska i smjestiti ih negdje u memoriju.

U ranim operativnim sistemima, proces učitavanja se odvijao s velikom pažnjom, što znači da je cijeli kod učitavan u memoriju prije pokretanja programa. Moderni operativni sistemi to rade lijeno, odnosno učitavaju delove koda ili podataka samo kada ih program zahteva tokom svog izvršavanja.

Kada se kod i statički podaci učitaju u OS memoriju, potrebno je uraditi još nekoliko stvari prije nego što se proces pokrene. Za stog se mora dodijeliti određena količina memorije. 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 nekim argumentima, konkretno on ispunjava parametre funkcije main(), na primjer nizom argc i argv.

Operativni sistem također može dodijeliti nešto memorije hrpi programa. Programi koriste hrpu za eksplicitno traženje dinamički dodijeljenih podataka. Programi traže ovaj prostor pozivanjem funkcije malloc () i briše ga eksplicitno pozivanjem funkcije besplatno(). Hrpa je potrebna za strukture podataka kao što su povezani listovi, hash tablice, stabla i drugo. Isprva, mala količina memorije je dodijeljena hrpi, ali s vremenom, kako se program pokreće, hrpa može zahtijevati više memorije putem poziva API-ja biblioteke malloc(). Operativni sistem je uključen u proces dodjeljivanja više memorije kako bi se zadovoljili ti pozivi.

Operativni sistem će također obavljati zadatke inicijalizacije, posebno one koji se odnose na I/O. Na primjer, na UNIX sistemima, svaki proces po defaultu ima 3 otvorena deskriptora datoteke, za standardni ulaz, izlaz i grešku. Ove ručke omogućavaju programima da čitaju unos sa terminala, kao i da prikažu informacije na ekranu.

Dakle, učitavanjem koda i statičkih podataka u memoriju, kreiranjem i inicijalizacijom steka i obavljanjem drugih poslova vezanih za obavljanje I/O zadataka, OS priprema fazu za izvršenje procesa. Konačno, ostaje još jedan posljednji zadatak: pokretanje programa kroz njegovu ulaznu tačku, nazvanu main() funkcija. Izvršavanjem funkcije main(), OS prenosi kontrolu CPU-a na novokreirani proces, tako da program počinje da se izvršava.

Procesno stanje

Sada kada imamo određeno razumijevanje o tome šta je proces i kako se kreira, hajde da navedemo stanja procesa u kojima može biti. U svom najjednostavnijem obliku, proces može biti u jednom od ovih stanja:
Running. Prilikom pokretanja, proces se pokreće na procesoru. To znači da se instrukcije izvršavaju.
spreman. U stanju pripravnosti, proces je spreman za pokretanje, ali iz nekog razloga ga OS ne izvršava u određeno vrijeme.
blokiran. U blokiranom stanju, proces izvodi neke operacije koje ga sprečavaju da bude spreman za izvršenje dok se ne dogodi neki događaj. Jedan uobičajen primjer je kada proces započne IO operaciju, on se blokira tako da neki drugi proces može koristiti procesor.

Operativni sistemi: tri laka komada. Dio 2: Apstrakcija: Proces (prijevod)

Ova stanja možete zamisliti u obliku grafa. Kao što možemo vidjeti na slici, stanje procesa može se mijenjati između RUNNING i READY 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 ovom stanju dok se ne dogodi neki događaj, na primjer završetak IO. u ovom trenutku prelazak u stanje READY i eventualno odmah u stanje RUNNING ako OS tako odluči.
Pogledajmo primjer kako se dva procesa kreću kroz ova stanja. Za početak, zamislimo da oba procesa rade, a svaki koristi samo CPU. U ovom slučaju, njihova stanja će izgledati ovako.

Operativni sistemi: tri laka komada. Dio 2: Apstrakcija: Proces (prijevod)

U sljedećem primjeru, prvi proces, nakon nekog vremena pokretanja, zahtijeva IO i ulazi u stanje BLOCKED, dozvoljavajući drugom procesu da se pokrene (Slika 1.4). OS vidi da proces 0 ne koristi CPU i pokreće proces 1. Dok je proces 1 pokrenut, IO je završ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 i završava svoj rad.

Operativni sistemi: tri laka komada. Dio 2: Apstrakcija: Proces (prijevod)

Struktura podataka

Sam OS je program, i kao i svaki drugi program, ima neke ključne strukture podataka koje prate različite relevantne informacije. Za praćenje stanja svakog procesa, OS će podržavati neke lista procesa za sve procese u stanju READY i neke dodatne informacije za praćenje procesa koji su trenutno pokrenuti. Takođe, OS treba da prati blokirane procese. Nakon što je IO završen, OS mora probuditi traženi proces i staviti ga u stanje spremno za pokretanje.

Na primjer, OS mora sačuvati stanje registara procesora. U trenutku zaustavljanja procesa, stanje registara se pohranjuje u adresnom prostoru procesa, a u trenutku kada se njegov rad nastavlja, vrijednosti registara se vraćaju i tako se nastavlja izvršavanje ovog procesa.

Osim spremnih, blokiranih, aktivnih stanja, postoje još neka stanja. Ponekad, u vrijeme kreiranja, proces može biti u stanju INIT. Konačno, proces se može staviti u FINAL stanje kada je već završen, ali njegove informacije još nisu obrisane. Na UNIX sistemima ovo stanje se zove zombi proces. Ovo stanje je korisno u slučajevima kada roditeljski proces želi da zna 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 se nadređeni proces završi, on upućuje konačni sistemski poziv, kao što je čekaj(), da sačeka da se proces podređeni prekine i signalizira OS-u da može obrisati sve podatke povezane sa prekinutim procesom.

Operativni sistemi: tri laka komada. Dio 2: Apstrakcija: Proces (prijevod)

Ključne tačke predavanja:

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

izvor: www.habr.com

Dodajte komentar