operativni sistemi
DESCRIPTION
Operativni sistemi. Niti i procesi. Prostori kernela i korisnika. Kernel operativnog sistema mora da se nalazi u delu memorije u koji korisni č ki programi nemaju direktnog pristupa – u prostoru kernela . - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/1.jpg)
Operativni sistemi
Niti i procesi
![Page 2: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/2.jpg)
Prostori kernela i korisnika
• Kernel operativnog sistema mora da se nalazi u delu memorije u koji korisnički programi nemaju direktnog pristupa – u prostoru kernela.
• Ukoliko postoji hardverska podrška za ovo, to se rešava višom privilegijom izvršavanja kôda u prostoru kernela, u odnosu na prostor korisnika. Zbog toga se često izvršavanje sa visokom privilegijom poistovećuje sa prostorm kernela, ali to nije uvek slučaj.
• Ako nema hardverske podrške, tada se sistem oslanja na “lepo ponašanje” korisničkih programa, nadajući se da oni nikada neće direktno adresirati prostor kernela.
![Page 3: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/3.jpg)
Sistemski pozivi
• Bilo da postoji ili ne postoji podrška hardvera (mikroprocesora) koja štiti prostor kernela, programi iz prostora korisnika mu pristupaju isključivo upotrebom sistemskih poziva.
• Obrnuto ne važi – program iz prostora kernela nikada nema potrebe da pristupa korisničkom programu, sem u nekim, vrlo specifičnim, situacijama.
• Kernel je skup rezidentnih biblioteka koje pružaju svoje usluge korisničkim programima (aplikacijama).
• Jedne kernel funkcije mogu da pozivaju druge kernel funkcije, ali nikada funkcije iz aplikacija.
![Page 4: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/4.jpg)
Program
• Program* se nalazi u sklopu izvršne datoteke• Izvršna datoteka dobija se nakon procesa prevođenja
izvornog programa • Program se sastoji od instrukcija i podataka• Podaci mogu da budu konstante i promenljive• Pomenljive mogu da budu perzistentne i tranzijentne• Instrukcije mogu da budu privatne ili deljene
* Za definiciju programa pogledati meterijal iz predmeta Uvod u programiranje.
![Page 5: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/5.jpg)
Program u memoriji (task)
text
data
BSS
heap
stack
Runtime library
text
data
RPT
zaglavlje
Program na disku (EXE)
Task
Neinicijalizovani podaci
Inicijalizovani podaci
Privatni podaci(tranzijentni)
Programski kôd
Dobija se nakon
prevođenja
Metapodaci na disku
Deo konteksta
CSIP
DSBP
SSSP
Deljene instrukcije i podaci
Globalni podaci
![Page 6: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/6.jpg)
Multitasking
• Sve ovo smo imali i kod MS-DOS-a.• Ono što nismo imali je da se proizvoljan broj taskova
izvršava u isto vreme – multitasking.• Ali, tvrdnja da neki operativni sistem izvršava više
taskova istovremeno nije uvek tačna, čak i kada je u pitanju sistem sa više procesora (jezgara).
• Multitasking je samo naša percepcija istovremenog izvršavanja svih taskova.
![Page 7: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/7.jpg)
Kako radi multitasking
• U stvarnosti, operativni sistem učitava program u memoriju (kada on postaje task), predaje mu kontrolu nad procesorom, tj. dozvoljava mu izvršavanje neko vreme, a zatim prekida njegovo izvršavanje.
• U tom trenutku, operativni sistem pravi „snimak“ trenutnog stanja procesora (konteksta), tj. zamrzava vrednost svih njegovih registara (segmentnih registara, registara opšte namene, programskog brojača, stek pointera, flags ...) i stavlja ih na sigurno mesto.
• Zatim dozvoljava nekom drugom tasku izvršavanje izvesno vreme, prekida njegovo izvršavanje, itd.
• Sve ovo ponavlja se vrlo brzo, tako da korisnik ima utisak da se taskovi izvršavaju istovremeno.
![Page 8: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/8.jpg)
Task (definicija)
• Iz ugla programera, termin “task” je često nejasan. • On se izjednačava sa pojmovima kao što su proces, laki
proces, korisnička nit, kernel nit, fiber, itd.
• Definicija: Task čine programski kôd i podaci koji poseduju sopstveni kontekst i sopstveni stek.
![Page 9: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/9.jpg)
Gde se čuva kontekst
• Najšešće na steku• Može i neki drugi deo memorije (u zaštićenom režimu
rada za ovo imamo i pomoć hardvera)• Ovako se čuvaju registri na tekućem steku: pushf
push ax push bx
push cx . . .pop es ; Nakon zamene stekova, izvrsavaju se pop ; instrukcije obrnutim redosledom
• Svaki task mora da ima svoj stek. • Stek se inicijalizuje adresom početka taska.
![Page 10: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/10.jpg)
Zamena konteksta
• Sva task ima inicijalizovan stek pointer na vrednost poslednjeg smeštenog registra.
• Vrednost stek pointera svakog taska čuva se u delu memorije koji se često zove TCB (Task Control Block).
• TCB može da sadrži i druge informacije vezane za task. • Zamena konteksta:
– Određuje se koji seledeći task treba da se izvršava.– Iz TCB tog taska uzima se vrednost stek pointera i stavlja u
SS/SP registre mikroprocesora.– Nastavlja se sa izvršavanjem pop instrukcija, sada sa novog
steka (na taj način se registri postavljaju na vrednosti tog taska).– Poslednja instrukcija RET učitava adresu novog taska u CS/IP.
![Page 11: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/11.jpg)
Stanja taska
• Task može da se nalazi u jednom od dva osnovna stanja:– Stanje izvršenja– Stanje neizvršenja
• Na jednom procesoru (jezgru) samo jedan task može da bude u stanju izvršenja.
• Ne treba mešati stanje taska i stanje procesora (kontekst).
neizvršenje izvršenjeProizvoljan broj taskova
Samo jedan task
Start task
Startovan je neki drugi task
Dijagram stanja konačnog automata
![Page 12: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/12.jpg)
Prinudni prekid izvršavanja
• Prinudni prekid izvršavanja nekog taska nastaje kada se ne čeka da on dobrovoljno prepusti procesor nekom drugom tasku, već mu se procesor oduzme “na silu”
• Mi ćemo to zvati istiskivanje (engl. Preemption)• Preempt – istisni• Preemptive – sa istiskivanjem
![Page 13: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/13.jpg)
Raspoređivanje
• Task nije u stanju izvršenja kada:– Nema šta da radi *– Ima šta da radi, ali mu operativni sistem ne dozvoljava prelazak u
stanje izvršenja – Dobrovoljno je prepustio stanje izvršenja nekom drugom tasku– Prinudno je prepustio stanje izvršenja nekom drugom tasku
(posledica istiskivanja)
• Kako se određuje kada će neki task da se startuje (da bude u stanju izvršenja)?
• Tu funkciju obavlja raspoređivač (scheduler).
* Kada se program “vrti” u praznoj petlji, on ipak nešto radi (možda nešto čeka), ali je to beskorisno zauzimanje procesora. Primer: JMP $
![Page 14: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/14.jpg)
Primer
task1: mov dx, zeleno mov al, _ON out dx, al mov dx, crveno mov al, _OFF out dx, al jmp task1
task2: mov dx, zeleno mov al, _OFF out dx, al mov dx, crveno mov al, _ON out dx, al jmp task2
• Nijedan task ne vodi računa o čuvanju registara koje koristi (DX i AL).
• Nema ni potrebe, jer o tome vodi računa mehanizam zamene konteksta.
• Pravljenje programa je identično kao da je jedini u sistemu.
• Ipak, potrebno je voditi računa da možda postoji još taskova koji koriste iste resurse (memoriju, ulaz/izlaz) i koji mogu da ih menjaju.
• U ovom primeru task 1 pali zeleno, a gasi crveno svetlo. Task 2 radi obrnuto - gasi zeleno, a pali crveno svetlo.
![Page 15: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/15.jpg)
Raspoređivač kao ISR
• Pretpostavimo da task nema nameru da startuje drugi task i da mu na taj način dobrovoljno prepusti procesor.
• U tom slučaju njega može da prekine samo prekid (interrupt). On najčešće potiče od sistemskog časovnika.
• Prekidna rutina sadrži algoritam koji određuje koji sledeći task će biti startovan i ona bi trebalo da taj task i startuje – jednom rečju, da radi kao raspoređivač.
• Ali, kako će ona to da uradi?• Ako na svom kraju izvrši instrukciju IRET, vratiće se u
task koji je prekinut, a ne u novi task koji treba startovati.• Prethodno će izvršiti zamenu stekova. IRET sada uzima
povratnu adresu sa novog steka.
![Page 16: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/16.jpg)
Primer: kružno raspoređivanje
• Pretpostavimo da Task 1 i Task 2 izvršavamo po algoritmu kružnog raspoređivanja (Round Robin): malo se izvršava jedan, malo drugi, pa opet prvi i tako u krug.
• Izvršavanje svakog taska određeno je intervalima prekida sistemskog časovnika (kvantumom) i isto je za oba taska.
• Ovakvo raspoređivanje koristi se u tzv. Time-sharing sistemima, gde svaki task ima dodeljen isti vremenski interval (Time Slice) za svoje izvršavanje.
task1 task1 itd ...task2 task2ISR
vreme
ISR ISR
Periodični prekidi sistemskog časovnika
![Page 17: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/17.jpg)
Komunikacija između taskova
• Da bi taskovi mogli međusobno da komuniciraju, potrebno je da poseduju neki deo memorije koji je zajednički.
• S druge strane, poželjno je što više izolovati taskove, da ne bi na bilo koji način uticali jedni na druge.
• Taskovi mogu međusobno da budu izolovani u različitom obimu:– potpuno izolovani (nemaju zajednički ni najmanji deo memorije)– neizolovani (zajednička im je cela memorija)– delimično izolovani (postoji neki deo memorije koji je zajednički)
![Page 18: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/18.jpg)
Razdvojen adresni prostor
• Nema deljenog koda ni podataka• Jedan task nikako ne može da utiče na drugi task• Taskovi ne mogu da komuniciraju
Task 1 Task 2
![Page 19: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/19.jpg)
Zajednički adresni prostor
• Kompletan kodni prostor i prostor podataka su zajednički• Jedan task može da utiče na drugi• Taskovi mogu da razmenjuju informacije
Task 1
Task 2
![Page 20: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/20.jpg)
Preklopljen adresni prostor
• Pojedini delovi koda i podataka su zajednički• Jedan task može da utiče na drugi• Taskovi mogu da razmenjuju informacije
Task 1
Task 2
![Page 21: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/21.jpg)
Taskovi i njihovi atributi
• Samo jedan task može da bude u stanju izvršenja na jednom procesorskom jezgru.
• Taskovi se nalaze u stanju neizvršenja iz različitih razloga.• Razvrstavanje taskova prema tim razlozima vrši se
upotrebom atributa koji dodatno opisuju zašto task nije u stanju izvršenja i kada bi trebalo u njega da pređe.
neizvršenje izvršenjeProizvoljan broj taskova
Samo jedan task
Start task
Startovan je neki drugi task
![Page 22: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/22.jpg)
Niti i procesi
• Na osnovu atributa, stanje neizvršenja taskova deli se na više (pod)stanja.
• Atribute formira i održava operativni sistem i oni nisu u sastavu taska.
• Taskovi sa zajedničkim adresnim prostorom i sa pridruženim atributima zovu se niti (threads).
• Skup niti (sa dodatnim atributima*) zove se proces.• Različiti procesi imaju međusobno potpuno razdvojene ili
delimično preklopljene adresne prostore.• Proces mora da ima najmanje jednu nit.
* Biće objašnjeno kasnije
![Page 23: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/23.jpg)
Stanja niti
• Zavisno od realizacije, niti mogu da imaju različita stanja, ali sledeća stanja prisutna su kod svih operativnih sistema :– Stanje nespremnosti za izvršenje. To je stanje čekanja na neki
događaj. Često se zove i blokirano stanje (Blocked), spavanje (Sleep), čekanje (Wait), itd.
– Stanje spremnosti za izvršenje– Stanje izvršenja
• Na svakom procesorskom jezgru mora da postoji jedna i samo jedna nit koja je u stanju izvršenja.
![Page 24: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/24.jpg)
Atributi niti
• Atributi niti zavise od operativnog sistema, ali u osnovi se sastoje od sledećih informacija:– Identifikator niti (Thread ID)– Kontekst– Stanje u kome se nalazi nit– Prioritet– Afinitet– Klasa raspoređivanja– Događaj na koji čeka– Preostalo vreme za izvršavanje u okviru kvantuma *– Povratna vrednost po završetku– …
* Biće objašnjeno kasnije
Jedinstveno za svaku nit
![Page 25: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/25.jpg)
Kako se čuvaju atributi
• Prilikom kreiranja, kernel svakoj niti dodeljuje memorijsku strukturu koja sadrži atribute.
• Ove strukture se obično povezuju kao jednostruko ulančane liste. Operacije nad listom su: “stavi na kraj” i “ukloni sa početka”, a izuzetno i “stavi na početak”.
• Ovakva lista naziva se red čekanja – Queue• U sastav reda ulaze strukture koje imaju neke zajedničke
atribute. Npr., jedan red čine strukture koje imaju istu vrednost atributa “Prioritet”, drugi red čine strukture koje imaju istu vrednost atributa “Događaj na koji čeka”, itd.
• Radi kraćeg izražavanja, kaže se da se nit nalazi u nekom redu čekanja.
![Page 26: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/26.jpg)
Stanje spremnosti
next next
next
NULL
NULL
spremna spremna spremna
spremna spremna
prioritet=6 prioritet=6 prioritet=6
prioritet=1 prioritet=1
TID=123 TID=456 TID=789
TID=091 TID=234• Onoliko redova koliko ima prioriteta• Nazivaju se Ready Queues ili Run Queues• Obično se prvo prazni red višeg prioriteta,
zatim nižeg, itd.• Ako u red stalno dolaze nove niti višeg
prioriteta, niti nižeg proriteta će čekati dugo – izgladnjivanje (starvation).
• Svako procesorsko jezgro ima svoje redove spremnosti (između ostalog i na osnovu atributa “Afinitet”)
next
spremna
prioritet=6
TID=567
![Page 27: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/27.jpg)
Stanje spremnosti
• Prioriteti se nitima dodeljuju na osnovu različitih kriterijuma. To npr. može da bude nit koja zahteva više procesorskog vremena, koja je više orijentisana na ulazno-izlazne operacije, ili se od nje zahteva odgovor u realnom vremenu.
• Ukoliko je potrebno dinamički menjati prioritete (dok je nit u redu čekanja), mogu se koristiti prioritetni redovi (Priority Queues).
• Ukoliko se pojavi nit višeg prioriteta, raspoređivač istiskuje nit nižeg proriteta i stavlja je na čelo reda njenog proriteta.
• Ukoliko je isteklo vreme za izvršavanje niti, raspoređivač je stavlja na začelje njenog reda proriteta.
• U svakom slučaju, niti se šalju na izvršenje prema prioritetu, a ne prema njihovoj privilegiji.
• Zaključak: Nit može da bude istisnuta i u prostoru korisnika i u prostoru kernela.
![Page 28: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/28.jpg)
Blokirano stanje
next
next
NULL
NULL
tajmer
TID=135 TID=222 TID=333
TID=357 TID=469• Onoliko redova koliko ima događaja na koje se čeka
• Nisu vezani za neko procesorsko jezgro
NULL
disk
semafor A semafor A
tajmer
blokirana
TID=246
NULL
konzola
blokirana blokiranablokirana
blokirana blokirana
next
TID=980
semafor A
blokirana
![Page 29: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/29.jpg)
Blokirano stanje
• Operacija WAIT– Nit eksplicitno poziva ovu operaciju. – Nit zatim menja svoje stanje iz izvršenja u blokirano stanje i
stavlja se u red čekanja blokiranih niti za odgovarajuću događaj. Ova operacija mora da bude atomična.
– Nit zatim eksplicitno startuje raspoređivač.– Raspoređivač određuje koja nit ide u koji red spremnih niti, a
zatim startuje nit sa početka reda najvišeg prioriteta.
![Page 30: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/30.jpg)
Blokirano stanje
• Blokirajući sistemski poziv *– Nakon sistemskog poziva, nit ulazi u prostor kernela. – Ako je sistemski poziv nije blokirajući, RETF na kraju funkcije
vraća nit u korisnički prostor.– Ako je sistemski poziv blokirajući, a funkcija naiđe na deo koji
zavisi od nekog događaja koji se još nije desio (npr. raspoloživost nekog resursa), ona će pozvati operaciju WAIT.
• Zaključak: Nit može da ide u blokirano stanje samo kada je u prostoru kernela.
* Sistemski pozivi se koriste kada je iz korisničkog prostora potrebno pozvati funkciju kernela. Iz prostora kernela, kernel funkcije se pozivaju na običan način. Iz kernel prostora ne pozivaju se funkcije korisničkog prostora.
![Page 31: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/31.jpg)
Izlaz iz blokiranog stanja
• Nit koja se nalazi u blokiranom stanju ne može sama sebe da probudi jer se ne izvršava na procesoru .
• Nju može da probudi samo raspoređivač.• On se startuje periodično ili na zahtev, ali svaki put proverava da li
je ispunjen uslov zbog koga je nit blokrana. Ako jeste, on briše nit iz reda blokiranih i stavlja je u red spremnih.
• Ali, kako raspoređivač zna da je ispunjen uslov?• To mu javlja neka druga nit ili servisna rutina nekog prekida.
![Page 32: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/32.jpg)
Solaris niti (LWP)
IDL PINNED
ONPROC SLEEP
STOP ZOMBIE FREE
thread_create()
switch()
preempt()
prun()pstop() exit()
wakeup()
syscall()
reap()
intr()
RUN
Stanje kada su resursi koje zauzima task oslobođeni, ali je struktura sa atributima još u upotrebi.
Potpuno oslobađanje
![Page 33: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/33.jpg)
Linux niti (tasks)
RUNNINGREADY
ZOMBIE
WAIT
CREATE
exec() switch()
preempt()
wait()wake_up()
exit()
uninterruptibleinterruptible
signal
signal STOPfork()
![Page 34: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/34.jpg)
Windows XP (threads)
Standby
Ready
Transition
Running
Terminated
preempt
switch
pick
terminateunblockresursi raspoloživi
resursi su raspoloživi
unblockresursi nisu
raspoloživi ali će uskoro biti
Waiting
Init
preempt, quantum end
switch
initialize
![Page 35: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/35.jpg)
Vista, Server 2008, Windows 7
Standby
DeferredReady
Transition
Running
Terminated
preempt
switch
pick
terminateunblockresursi raspoloživi
resursi su raspoloživi
unblockresursi nisu
raspoloživi ali će uskoro biti
Waiting, Gate
Waiting
Init
preempt, quantum end
switch
initialize
Ready
![Page 36: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/36.jpg)
Konkurentno izvršavanje
Primer: Pretpostavimo da je početna vrednost globalne deljene celobrojne promenljive x = 0
Nit 1 Nit 2 Nit 3 Raspoređivanje sa istiskivanjem.
(1) x = 1 (2) x = 2 (3) y = x Mogu da se izvršavaju konkurentno na jednom ili više procesora.
Konačna vrednost promenljive y je nepredvidljiva, ali se očekuje da bude 0, 1, ili 2.
Evo nekih mogućih preplitanja prethodna tri iskaza:
(3), (1), (2) konačna vrednost y je 0
(2), (1), (3) konačna vrednost y je 1
(1), (2), (3) konačna vrednost y je 2
![Page 37: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/37.jpg)
Nedeterministričko ponašanje
U slučaju konkurentnog izvršavanja, nedeterminističko ponašanje mogu izazvati jedna ili više sledećih situacija:
• Nepredvidljiva brzina napredovanja niti koje se izvršavaju na jednom jezgru procesora (zbog prebacivanja konteksta između niti)
• Nepredvidljiva brzina napredovanja niti koje se izvršavaju na različitim jezgrima ili različitim procesorima (zbog razlike u brzini jezgara ili procesora)
• Upotreba nedeterminističkih programskih konstrukcija, koje dozvoljavaju nepredvidljivi izbor između više mogućih akcija
![Page 38: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/38.jpg)
Konkurentnost
• Posmatrajmo dva nepreklapajuća događaja A i B koji se izvršavaju konkurentno. Činjenica da su A i B konkurentni znači da oni mogu da nastupe u bilo kom redosledu. Znači, njihova konkurentnost može da se modeluje kao nedeterministički izbor između dva prepletena događaja:
(A iza koga sledi B) ili (B iza koga sledi A).
• Ovaj model konkurentnosti se koristi u nekim tehnikama za testiranje i verifikaciju ponašanja programa. Međutim, treba imati u vidu da broj ovakvih permutacija enormno raste sa porastom broja niti, tako da je potpuna kontrola, čak i malih programa, veoma teška.
• Sinhronizacija:
– Uzajamno isključivanje: Događaji A i B ne smeju da se dese u isto vreme.
– Serijalizacija: Događaj A mora da se desi pre događaja B.
![Page 39: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/39.jpg)
Debagovanje
• Programeri se oslanjaju na ponovljivo, determinističko izvršavanje kako bi pronašli i otklonili greške u programu.
• Kada posmatramo grešku u jednonitnom programu, mi očekujemo da će se ona pod istim uslovima ponoviti i u budućnosti, tako da možemo da je lociramo i otklonimo.
• Ukoliko grešku ne možemo da reprodukujemo, to nam ukazuje na problem, s obzirom da samo neke greške u sekvencijalnim programima (npr. promenljive koje nisu inicijalizovane) proizvode nedeterminističke greške.
• Konkurentni programi su inherentno nedeterministički. Jedna od najvećih “glavobolja” programera ovakvih sistema je otkrivanje i otklanjanje grešaka.
![Page 40: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/40.jpg)
Dve niti, jedan brojač
• Posmatrajmo jedan web server koji koristi višenitnu obradu pristiglih zahteva.
• Svaka nit inkrementira deljenu promenljivu - brojač, da bi pratila dnevni broj pristupa (pogodaka – hits) web sajta:
…
hits = hits + 1;
…
• Šta se događa kada dve niti izvrše ovaj kôd konkurentno?
• Prvo ćemo inicijalizovati deljenu promenljivu hits
xor eax,eaxmov dword [hits],eax ;hits=0
![Page 41: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/41.jpg)
Dve niti, jedan brojač
; Pocetak niti #1mov dword eax,[hits] ;hits=0add eax,1mov dword [hits],eax ;hits=1iret
; Pocetak niti #2mov dword eax,[hits] ;hits=1add eax,1mov dword [hits],eax ;hits=2iret
vreme
Uspostavljena konekcija 1
Uspostavljena konekcija 2
![Page 42: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/42.jpg)
Stanje trke
; Pocetak niti #1mov dword eax,[hits] ;hits=0add eax,1mov dword [hits],eax ;hits=1iret ; Pocetak niti #2
mov dword eax,[hits] ;hits=0add eax,1mov dword [hits],eax ;hits=1iret
vreme
Uspostavljena konekcija 1
Uspostavljena konekcija 2
Trebalo bi da bude hits=2
Stanje trke je vremenski zavisna greška. Da li će se javiti ili ne, zavisi od raspoređivanja.
![Page 43: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/43.jpg)
Kritična sekcija
• Atomična operacija: sekvenca instrukcija koje se garantovano izvršavaju nedeljivo.
• Drugi naziv za ovo je kritična sekcija (Critical Section).
• Ako dve niti izvršavaju istu atomičnu operaciju u isto vreme, jedna nit će izvršiti celu sekvencu pre nego što druga počne – serijalizacija.
• “U isto vreme” znači paralelno kod sistema kod kojih svaka nit ima “svoje” procesorsko jezgro, a prepleteno ukoliko ima više niti nego procesorskih jezgara.
• Upotreba kritične sekcije jedan je od načina realizacije uzajamnog isključivanja (Mutual Exclusion).
![Page 44: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/44.jpg)
Uslovi za kritičnu sekciju
• Samo jedna nit može da se izvršava unutar svoje kritične sekcije (uzajamno isključivanje).
• Kod više istovremenih zahteva za ulazak u kritičnu sekciju, jedan (i samo jedan) zahtev mora da bude zadovoljen.
• Svaka nit čeka na ulazak u svoju kritičnu sekciju konačno dugo (nema izgladnjivanja).
• Niti moraju da napreduju u svom izvršavanju tokom vremena (nema uzajamnog blokiranja).
• Broj procesora i njihova pojedinačna brzina ne smeju da imaju nikakvog uticaja.
• Nit ne sme da bude istisnuta (blokirana) dok se izvršava u svojoj kritičnoj sekciji.
• Da li nit u svojoj kritičnoj sekciji sme da bude prekinuta ?
• Da, ukoliko nijedna druga nit ne ulazi u istu kritičnu sekciju.
![Page 45: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/45.jpg)
Zabrana prekida
; Pocetak niti #1climov dword eax,[hits] ;hits=0add eax,1mov dword [hits],eax ;hits=1stiiret
; Pocetak niti #2climov dword eax,[hits] ;hits=1add eax,1mov dword [hits],eax ;hits=2stiiret
vreme
Uspostavljena konekcija 1
Uspostavljena konekcija 2
Prekid se tretira kao nastupajući (pending)
Kritična sekcija
cli i sti su IOPL osetljive instrukcije. Mora da bude CPL ≤ IOPL (polje koje se nalazi u EFLAGS).
Često nije ispunjeno pa se cli i sti izvršavaju upotrebom sistemskih poziva.
![Page 46: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/46.jpg)
Problem
; Pocetak niti #1clijmp $
vreme
Uspostavljena konekcija 1
Uspostavljena konekcija 2
Prekid se tretira kao nastupajući (pending) ali se nikada ne izvršava
“Zamrzavanje” programa na jednom procesorskom jezgru
Kod višeprocesorskog sistema zabrana prekida ne obezbeđuje uzajamno isključivanje, jer se ona odnosi samo na tekući procesor.
![Page 47: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/47.jpg)
Rešenje
• Ključ (lock ili mutex)
• Kada nit uđe u kritičnu sekciju, ona je zaključava tako da ne može da uđe ni jedna druga nit. Kada izlazi, ona je otključava i vraća ključ.
• Koristi se deljena promenljiva tipa mutex nad kojom se, upotrebom sistemskih poziva, mogu izvršavati dve operacije:
– “uzimanje ključa” (acquire ili lock): nit ekskluzivno uzima ključ, a ako ga je neko drugi već uzeo, čeka u blokiranom stanju.
– “oslobađanje ključa” (release ili unlock): nit vraća ključ.
• Kako koristiti? Ograditi kritičnu sekciju odgovarajućim ključem:
mutex hit_lock;
...
acquire(hit_lock); hits = hits + 1; release(hit_lock);
kritična sekcija
![Page 48: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/48.jpg)
Sistemski poziv
• acquire(hit_lock) sistemski poziv– Stavljanje broja sistemskog poziva u registar
– Softverski prekid za sistemski poziv (ili Fast Call)
– Skok na odgovarajuću funkciju kernela
– Verifikacija ispravnosti pointera na mutex promenljivu (prethodno je deklasirana - registrovana kod kernela)
– Spin N puta čekajući da mutex brzo bude otključan
– Ako je mutex zaključan, blokirati nit i staviti je u red čekanja za taj mutex
– U suprotnom, zaključati mutex
• Izvršavanje instrukcije hits = hits+1;
• release(hit_lock) sistemski poziv
• Koliki je broj N?
Ovo je zamena konteksta (skupa operacija)Zato se nadamo da do nje neće doći (čest slučaj)
![Page 49: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/49.jpg)
Broj okretaja u spinu (N)
• Maksimalni broj okretaja Nmax odgovara vremenu potrebnom za zamenu konteksta (blokiranje). Više od toga se ne isplati.
• Ne treba ići na maksimalan broj okretaja, jer bismo onda mogli i da blokiramo nit bez dodatnog troška.
• Umesto toga treba ići na N < Nmax
• Koristimo verovatnoću, npr. Random Walk:– Krenemo od neke početne vrednosti (npr. Nmax/2)
– Dekrementiramo N ukoliko je poslednji poziv acquire() blokirao nit
– Inkrementiramo N ukoliko poslednji poziv acquire() nije blokirao nit
![Page 50: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/50.jpg)
Mutex u korisničkom prostoru
• Neki operativni sistemi dozvoljavaju pokušaj dobijanja mutex-a u korisničkom prostoru, pa tek ako nije na raspolaganju, upotrebom sistemskog poziva ulazi se u kernel.
• Primer: Windows API funkcija EnterCriticalSection( ).
• Za pristup mutex promenljivoj kod IA32, koriste se atomične instrukcije koje se formiraju upotrebom prefiksa lock.
• Atomične instrukcije mogu da budu: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD i XCHG.
• Ukoliko se XCHG koristi sa memorijskim operandom (što kod nas jeste slučaj), automatski se primenjuje protokol zaključavanja, bez obzira na prisustvo prefiksa lock i trenutne vrednosti IOPL.
• Počev od Intel Pentium Pro arhitekture, protokol zaključavanja se više ne odnosi na memorijske magistrale, već se zaključava programski kôd u L2 kešu.
![Page 51: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/51.jpg)
XCHG
CPU
L1
L2
CPU
L1
CPU
L1
Memorija
CPU
L1
L2 L2
Više jezgaraSMP
. . .. . .
Svaki od ovih CPU mogao bi da bude sa više jezgara
XCHG zaključava L2 keš. Nakon razmene u kešu, mehanizam za keš koherenciju obezbeđuje da se promena pojavi u memoriji. Ako memorijska loakcija nije u kešu, zaključava se memorijska magistrala.
xchglock xchg
![Page 52: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/52.jpg)
Mutex u korisničkom prostoru
acquire: ;edx sadrzi adresu mutex promenljive xor eax,eax lock xchg dword [edx],eax test eax,eax ;ako je eax=0, postavljen je ZF flag jnz uzimam_mutex call idi_u_kernel ;call yield kod korisnickih nitiuzimam_mutex: ret• U ovom primeru vrednost 0 se atomično razmenjuje sa mutex promenljivom. • Ako je dobijena vrenost iz razmene jednaka 1, mutex je slobodan i može da se
uđe u kritičnu sekciju. • Ako je dobijena vrednost iz razmene jednaka 0, mutex je zaključan i ulazi se u
kernel (ubrzo sledi blokiranje), ili se predaje kontrola raspoređivaču u korisničkom prostoru (yield), ako su u pitanju korisničke niti.
release: mov eax, 1 lock xchg dword [edx],eax ret
![Page 53: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/53.jpg)
Pravila
• Mutex se uzima (zaključava) ekskluzivno. Nijedna nit ne može da uzme mutex, ako ga je neka druga nit već uzela.
• Mutex mora da oslobodi (otključa) isključivo ona niti koja ga je uzela (zaključala).
• Rekurzivno zaključavanje nije dozvoljeno.• Nit ne može da se završi bez prethodnog oslobađanja mutexa. • Deo kernel memorije u kojoj se nalazi mutex, ne sme da bude
oslobođen ukoliko se u njemu nalazi zaključani mutex. • Mutex mora da bude inicijalizovan (ili statički definisan) pre nego što
se zaključa.• Eksplicitno upisivanje u mutex promenljivu nije dozvoljeno. Kod viših
programskih jezika, ovo je osigurano odgovarajućim tipom za mutex, o čijoj upotrebi vodi računa prevodilac.
![Page 54: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/54.jpg)
Spinlock
• Kernel ne koristi operacije koje zahtevaju dugotrajno zaključavanje (ne mešati ovo sa izvršavanjem niti koja je u prostor kernela došla iz korisničkog prostora, nakon sistemskog poziva).
• Zbog toga se za niti, koje se isključivo izvršavaju u kernelu, blokiranje zbog čekanja na mutex ne isplati. Kernel umesto toga koristi spinlock.
• spinlock ima smisla samo kod kernela koji su sa istiskivanjem, ili se izvršavaju na više procesorskih jezgara ili procesora.
• Ukoliko se kernel izvršava samo na jednom jezgru, kritična sekcija se osigurava zabranom istiskivanja u njoj.
• Kritična sekcija mora da bude zaključana u memoriji (isto važi i za promenljivu koja implementira spinlock), ne sme da ima reference na tabelu stranica, ne sme da poziva finkcije kernela, uključujući i sistemske pozive, i ne sme da generiše prekide ili izuzetke.
![Page 55: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/55.jpg)
Spinlock primer
acquire: ;edx - adresa spinlock promenljive xor eax,eaxspin: lock xchg dword [edx],eax test eax,eax ;ako je eax=0, postavljen je ZF flag jz spin ret
release: je identičan kao za mutex.
• “Iskorišćenje” procesorskog jezgra u ovom kôdu je 100%, što je loše.
• Počev od Pentiuma 4, unutar petlje koristi se instrukcija PAUSE, koja predstavlja malo kašnjenje (kod starijih procesora ona se prevodi u NOP), smanjujući na taj način veliki broj memorijskih referenci.
• PAUSE obaveštava procesor sa HT (HyperThreaded) arhitekturom da logičko jezgro ne radi ništa i da više procesorskog vremena dodeli drugom logičkom jezgru.
![Page 56: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/56.jpg)
Semafori
• Prethodno opisani mehanizam uzajamnog isključivanja (mutex) dobar je za obezbeđivanje kritične sekcije kada su u pitanju dve niti.
• Ukoliko imamo više niti koje čekaju na mutex, nastaje problem: kojoj niti će se dodeliti mutex kada bude oslobođen?
• Ukoliko je dodeljivanje slučajno, postoji verovatnoća da neke niti budu van svoje kritične sekcije vrlo dugo, možda čak i večno da budu blokirane.
• Semafori su generalizovano rešenje obezbeđivanja kritične sekcije.
![Page 57: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/57.jpg)
Semafori
• Semafor je sličan celobrojnoj promenljivoj, uz sledeće razlike:– Nakon kreiranja i inicijalizacije semafora, dozvoljene su samo operacije
inkrementiranja (uvećanja vrednosti za jedan) ili dekrementiranje (umanjenja vrednosti za jedan).
– U nekim implementacijama semafora (npr. Posix Threads) tekuća vrednost semafora može da se pročita.
– Kada nit dekrementira semafor, ukoliko njegova vrednost postane negativna, nit se blokira i ne može se odblokirati sve dok neka druga nit ne inkrementira semafor.
• U praktičnoj ralizaciji, semafor je struktura koja, pored navedene celobrojne promenljive, sadrži i red čekanja za taj semafor.
• U red čekanja stavljaju se i oslobađaju niti po redosledu njihovih zahteva za semaforom – FIFO.
![Page 58: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/58.jpg)
Operacije i sintaksa
Semaforske operacije su opisane različitim imenima u različitim okruženjima. Najčešće se koriste:
sem.up ( ) sema_up(&sem )sem.down( ) sema_down (&sem )
sem.signal( ) sema_signal (&sem ) ili sema_post (&sem ) sem.wait( ) sema_wait(&sem )
sem.V( ) sema_V(&sem )sem.P( ) sema_P(&sem )
gde je sem konkretna instanca nekog semafora.
Ima istorijskog razloga za ovakav pluralizam imena. up i down opisuju šta operacije rade (inkrement i dekrement). signal i wait opisuju za šta se one često koriste. V (verhoog - uvećaj) i P (prolaag – pokušaj da umanjiš) su originalna holandska imena koje je predložio Dijkstra.
![Page 59: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/59.jpg)
Implementacija semafora
typedef struct { int brojac=1; FIFO queue; } semaphore;
void sema_init(semaphore *s,int i) {s->brojac=i; s->queue=EMPTY}
void sema_wait(semaphore *s) { if (--s->brojac<0) { tid = moj_tid(); stavi_na_kraj(tid,s->queue); block(tid); } }
void sema_signal(semaphore *s) { if (s->brojac++<0){ tid=uzmi_sa_pocetka(s->queue); ready(tid); }}
![Page 60: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/60.jpg)
Implementacija semafora
• Za jedan konkretni semafor važe sledeća pravila:– sema_wait( ) i sema_signal( ) moraju da budu atomične
operacije.– Dve niti ne mogu da budu unutar sema_wait( ) ili sema_signal( )
istovremeno, čak ni jedna u sema_wait( ), a druga u sema_signal( ).
– To važi i za sisteme sa više procesorskih jezgara.
• Atomičnost ovih funkcija se postiže upotrebom mutex-a ili spinlock-a za zaštitu kritičnih sekcija. U kritične sekcije spadaju operacije inkremetiranja i dekrementiranja brojača, kao i operacije za rad sa redom čekanja.
![Page 61: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/61.jpg)
Inicijalizacija semafora
Semafor može da se inicijalizuje na nenegativnu celu vrednost i to:
0 kada je potrebna sinhronizacija između niti (signalizacija)
1 za uzajamno isključivanje (ekvivalentno mutex-u)
> 1 kada postoji više instanci deljenog resursa (broj kojim se inicijalizuje semafor odgovara broju instanci)
Inicijalizacija semafora na negativnu vrednost nije legalna.
![Page 62: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/62.jpg)
Signalizacija
• Verovatno najjednostavnija upotreba semafora je signalizacija, što znači da jedna nit šalje signal drugoj niti da je obavesti da se nešto dogodilo.
• Signalizacija omogućuje garantovanu situaciju da će se deo kôda u jednoj niti izvršavati pre dela kôda u drugoj niti. Jednom rečju, semafor rešava problem serijalizacije.
![Page 63: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/63.jpg)
Primer
Pretpostavimo da imamo semafor čije je ime sem i čija je inicijalna vrednost 0, i niti A i B imaju deljeni pristup ovom semaforu.
Nit A Nit B
citajsema_signal(&sem)
sema_wait(&sem )pisi
Pretpostavimo da citaj čita liniju teksta iz datoteke, a da pisi prikazuje ovu liniju na ekranu. Semafor u ovom programu garantuje da nit A završava citaj pre nego što nit B započne pisi.
![Page 64: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/64.jpg)
Primer ...
• Evo kako stvar radi. Ako nit B dođe prva do iskaza sema_wait, naićiće na inicijalnu vrednost 0 i blokiraće. Kada nit A signalizira, nit B će nastaviti sa radom.
• Slično, ako nit A prva dođe do iskaza sema_signal, tada će se vrednost semafora inkrementirati i kada nit dođe do sema_wait, nastaviće sa radom odmah, bez blokiranja i čekanja.
• U oba slučaja, redosled operacija citaj i pisi je garantovan.
![Page 65: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/65.jpg)
Uzajamno isključivanje
/* Uzajamno isključivanje n instanci istih niti *//* upotrebom semafora */
const int n = BROJ_NITI; semaphore sekcija;
sema_init(&sekcija,1)void N(int i) { while (true) {
sema_wait(&sekcija); /* kritična sekcija */
sema_signal(&sekcija); /* ostatak kôda */
}}
void main(){ parbegin (N(1), N(2), …, N(n)); }
![Page 66: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/66.jpg)
Primer sa ispita
• Dve konkurentne niti, N1 i N2, sekvencijalno obrađuju znak po znak iste tekstualne datoteke (datoteka.txt) maksimalne veličine 56537 znakova.
• Učitani znak nit N1 obrađuje svojom procedurom proc1(znak), a nit N2 svojom procedurom proc2(znak).
• Potrebno je sinhronizovati ove niti tako da N2 obrađuje samo one znakove koje je N1 već obradila, tj. da N1 pri čitanju datoteke „uvek ide ispred“ N2.
• Napisati kôd za ove dve niti korišćenjem semafora.
![Page 67: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/67.jpg)
Primer sa ispita
semaphore s; /* ime nije bas inventivno */
sema_init(&s,0);
/* Datoteka ima maksimalno 56537 znakova. Standardni *//* semafor (sa brojacem velicine 16-bita) je dovoljan. */
/* Nit N2 */
void N2(){ char znak; FILE *f; f = fopen(“datoteka.txt“,“r“); do { sema_wait(&s); znak = fgetc(f); proc2(znak); } while(znak!=EOF) flose(f);}
/* Nit N1 */
void N1(){ char znak; FILE *f; f = fopen(“datoteka.txt“,“r“); do { znak = fgetc(f); proc1(znak); sema_signal(&s); } while(znak!=EOF) flose(f);}
![Page 68: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/68.jpg)
Unix
Kod klasičnog Unixa, taskovi maju i dodatne atribute (pored onih koje imaju prethodno opisane niti). To su npr.:•Grupni ID•Tekući direktorijum•Korenski direktorijum•ID sesije•Kontrolni terminal•Maska za signale i registrovane akcije•Promenljive okruženja•Otvorene datoteke•Dostupni resursi•Identifikator procesa (PID)•Alarmi•Tajmeri•Nastupajući signali•...
![Page 69: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/69.jpg)
Unix procesi
• Task sa atributima jedne niti i prethodno opisanim dodatnim atributima zove se Unix proces.
• Svi atributi procesa čine strukturu koja se zove Kontrolni blok procesa (Process Control Block – PCB).
• Kod MS DOS-a, tek kada se završi jedan proces, započinje sa radom drugi proces. Komunikacija među njima je preko zajedničke datoteke.
• Kod Unix-a procesi se izvršavaju “istovremeno”. Procesi su maksimalno izolovani, sa izuzetkom jednog manjeg dela memorije koja se koristi za jednostavnu međuprocesnu komunikaciju.
• Više procesa može da se organizuje u grupu koja se naziva Job (posao). Job-u se pristupa na jedinstven način preko terminala i omogućena je centralizovana isporuka sinala njegovim procesima.
• Više Job-ova čini sesiju. Svaka sesija ima svoj kontrolni proces, najčešče Login Shell. U ovaj shell ulazi se putem kontrolnog terminala.
![Page 70: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/70.jpg)
Unix procesi
spreman
PID=123
TSS123
text
data
BSS
heap
stack
text
data
BSS
heap
stack
spreman
PID=456
memorija za komunikaciju
Adresni prostori ova dva taska su razdvojeni, sem malog zajedničkog dela za komunikaciju
Task 1 (PID = 123)
Task 2 (PID = 456)
GID=1
/home1
/root
SID=12
tty1
env1->
files1->
GID=4
/home4
/root
SID=45
tty4
env4->
files4->
TSS456
……
…
……
…
Kontrolni blok
procesa
Deo kontrolnog bloka procesa, koji nije User Area, čini jednu stavku u tabeli procesa
![Page 71: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/71.jpg)
Kontrolni blok procesa (PCB)
• Kontrolni blok procesa sadrži dve vrste polja:• Polja dostupna kernelu u svakom trenutku:
– svi atributi procesove niti, informacije o adresnom prostoru procesa, PID, UID, tabela neopsluženih signala, razni tajmeri, pointer na User Area (deo PCB dostupan procesu), itd.
• Polja dostupna samom procesu (User Area): – deskriptori otvorenih datoteka, kontrolni terminal, polja za greške
tokom sistemskog poziva, U/I parametri, tajmer za vreme izvršavanja u korisničkom i kernel prostoru, polja sa rutinama za obradu signala, itd.
![Page 72: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/72.jpg)
Swapping
• Informacije iz user area biće dostupne samo kada je proces u memoriji.
• Ukoliko se proces ne izvršava (npr. blokiran je), kernel može, u nedostatku memorije, da donese odluku da ceo proces prebaci na disk.
• To obavlja swapper, a operacija se naziva swapping-out.• Ponovno učitavanje u memoriju naizva se swapping-in.
Tada se prostor u memoriji nalazi algoritmom First fit.
![Page 73: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/73.jpg)
Kreiranje Unix procesa
• Jedini način da se iz korisničkog programa kreira novi proces je upotreba sistemskog poziva fork.
• Sintaksa: pid = fork ( )– Kernel proverava da li ima dovoljno resursa (prvenstveno
memorije) za kreiranje novog procesa
– Dodeljuje stavku u tabeli procesa
– Dodeljuje jedinstveni PID novom procesu
– Pravi logičku kopiju roditeljskog procesa. Neki delovi kodnog prostora mogu da budu deljeni
– Novi proces (potomak) nasleđuje sve atribute i memorijsku sliku od roditeljskog procesa, sa izuzetkom PID, alarma, tajmera i nastupajućih signala
![Page 74: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/74.jpg)
fork ( )
• fork je funkcija sistemskog poziva koja vraća različite vrednosti u roditeljskom i kreiranom procesu (potomku).
• Nakon kreiranja procesa, kernel vrši modifikaciju povratne vrednosti tako što kod potomka stavlja nulu, a kod roditelja PID potomka.
• Roditelj i potomak proveravaju ove vrednosti i, u skladu sa njima, preduzmaju dalje akcije.
• Primer:
if(PID=fork()== 0)
{ /* nastavak programa potomka */}else{ /* nastavak programa roditelja */}
![Page 75: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/75.jpg)
fork ( ) …
• Zašto se umesto fork jednostavno ne rezerviše potreban deo memorije, u njega ne učita nov program i tako napravi novi proces?
• Nema ko to da uradi. U izolovanom memorijskom prostoru procesa, samo taj proces može da pristupa svojoj memoriji, pa samim tim i izvršava potrebni deo kôda, kao što je npr. učitavanje novog programa.
• Nije moguće iz jednog procesa pozivati deo koda u drugom procesu, niti raditi bilo šta sa njegovom memorijom.*
* Izuzetak čine procesi koji su namenjeni baš ovakvom načinu komuniciranja, ali to spada u distribuirane sisteme. U tom slučaju nije važno da li se procesi nalaze čak i u istom računaru.
![Page 76: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/76.jpg)
Konkurentno izvršavanje
#include <sys/types.h>#include <stdio.h>
int main(){ pid_t pid; pid = fork(); if (pid ==0) { printf(“A”); fork(); printf(“B”); } else if (pid > 0){ wait(NULL); printf(“C”); } }
ABABC ili ABCAB
#include <sys/types.h>#include <stdio.h>
int main(){ pid_t pid; pid = fork(); if (pid ==0) { printf(“A”); fflush(stdout); fork(); printf(“B”); } else if (pid > 0){ printf(“C”); } }
ABBC ili ACBB
Problem serijalizacije:
![Page 77: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/77.jpg)
Stanja Unix procesa
• Atributi u PCB ukazuju da svaki Unix proces ima samo jednu nit koja se izvršava u korisničkom prostoru.
• Razlog za ovo je istorijski. Unix je razvijen na sistemima sa jednim procesorom, a po prirodi je višekorisnički (Multiuser, Time-sharing).
• Korisniku se dodeljuje jedan terminal, sa koga se, u okviru jedne sesije, pokreće jedan interaktivni proces.
• Zbog toga se kod klasičnih Unix sistema kaže da proces ima stanja, da se nalazi u redu čekanja i slično.
![Page 78: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/78.jpg)
Stanja Unix procesa
ZOMBIE
returnpreempted
new
preempt
forkswap_ out
exit
wakeup
syscall
sleep
intr
swap_ out swap_ in
wakeup
schedule
return
newswapped
CREATED
RUNUSER
RUNKERNEL
READYMEMORY
SLEEPMEMORY
SLEEPSWAPPED
READYSWAPPED
![Page 79: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/79.jpg)
init
Unix kernel
shell
C bibliotekaAPI
editor
hardver
Interfejs za sistemske pozive
Podsistem datoteka
Buffer cache
Znakovni U/I Blok U/I
Drajveri
httpd
Upravljanje memorijom
swapper
Upravljanje hardverom/dispečer prekida
Upravljanje procesima
Međuprocesna komunikacija
Raspoređivanje
Korisnički prostor
Prostor kernela
Nivo hardvera
...Unix procesi
![Page 80: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/80.jpg)
Solaris procesi
• Solaris je savremena verzija Unix-a (potiče od Berkeley BSD, a kasnije od AT&T System V).
• Kao i drugi Unix sistemi, Solaris je zasnovan na paradigmi procesa.• Proces je okruženje u korisničkom memorijskom prostoru koje
obuhvata program i resurse potrebne za njegovo izvršavanje. • Memorijski prostor procesa obezbeđuje neophodnu izolaciju u
odnosu na druge procese. Samo mali deo memorije je zajdenički i preko njega se obavlja kontrolisana međuprocesna komunikacija.
• Svaki proces mora da sadrži makar jednu nit (a može da ih ima i više) koja se raspoređuje iz prostora kernela: kernel nit.
• Proces može da ima i niti koje raspoređuje korisnički program: korisničke niti.
• Proces je kontejner za niti koje se u njemu izvršavaju.
![Page 81: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/81.jpg)
Solaris niti i procesi
Tradicionalni proces
Korisnički prostor
Prostor kernela
Hardver
= Nit = LWP = Procesor
Raspoređivanje kernel niti na veći broj procesora
Raspoređivanje korisničkih niti na veći broj virtuelnih procesora
Daemon nit
Jedini model počev od Solarisa 9
![Page 82: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/82.jpg)
Solaris kernel
Solaris ima modularni kernel
• Osnovne komponente kernela su monolitne (ali su slojevite)• Komponente koje su modularne:
– Klase raspoređivanja
– Sistemi datoteka
– Neki sistemski pozivi
– Izvršni binarni formati
– STREAMS moduli
– Međuprocesna komunikacija
– Upravljački programi
![Page 83: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/83.jpg)
Solaris kernel
Interfejs za sistemske pozive
hardver
Raspoređivanje niti i upravljanje procesima
Sistem virtuelne memorije
Translacija adresa
Redovi čekanja, časovnici, tajmeri
Kernel servisi
Umrežavanje
TCPIPsoketi
Upravljački programi uređaja i magistrala
Virtuelni sistem datoteka
TS
RT
IA
SHR UFS NFS FSspec
SD SDD
![Page 84: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/84.jpg)
Linux niti i procesi
• Za Linux kernel, niti ne postoje. • Niti se tretiraju kao procesi koji dele resurse sa drugim procesima.• Procesi (pa samim tim i niti) se kod Linuxa zovu taskovi.• Svaka nit ima jedinstveni kontrolni blok task_struct, pa kernelu
izgleda kao normalni proces (koji sa drugim procesima deli resurse, kao što je npr. memorijski prostor).
• task_struct je relativno velika struktura podataka: oko 1.7 KB na 32-bitnoj mašini.
• S druge strane, ovo i nije tako veliko, imajući u vidu da ona sadrži sve informacije koje su kernelu potrebne o procesu.
• Kernel čuva sve informacije u kružnoj, dvostruko ulančanoj listi poznatoj pod imenom task lista.
![Page 85: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/85.jpg)
Linux kernel
Linux ima modularni kernel
• Imajući u vidu da se Linux kernel izvršava u jedinstvenom zaštićenom domenu (prostoru kernela), može se zaključiti da je u pitanju monolitni kernel.
• Ipak, dodavanje novih funkcionalnosti kernelu ne zahteva njegovo ponovno prevođenje i linkovanje. To se postiže upotrebom kernel modula, koji se dodaju ili uklanjaju tokom izvršavanja sistema, slično operativnom sistemu Solaris.
![Page 86: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/86.jpg)
Linux kernel
Interfejs za sistemske pozive
hardver
Platformski zavisan interfejs ka hardveru
Upravljanje memorijom
Virtuelni sistem datoteka
spec
Upravljanje procesima
Sistemi datoteka
Umrežavanje Upravljački programi
C bibliotekaKorisnički prostor
Kernel prostor
Modularni deo
Monolitni deo
![Page 87: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/87.jpg)
Windows niti i procesi
• Windows je objektno-orijentisani operativni sistem*• Zbog toga on sledi klijent-server paradigmu• Objektima upravlja Object Manager• I niti i procesi su objekti• Objekti međusobno komuniciraju upotrebom poruka
* To ne znači da je napisan u nekom objektno-orijentisanom programskom jeziiku.
klijent proces klijent proces server proces
Korisnički prostor
Prostor kernela
Sistem za prenos poruka
![Page 88: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/88.jpg)
Windows niti i procesi
Tip objekta
Atributi
Servisi
Thread
Client IDThread contextDynamic priorityBase priorityProcessor affinityExecution timeAlert statusSuspension countImpersonation tokenTermination portExit status
Create threadOpen threadQuery thread informationSet thread informationCurrent threadTerminate threadGet contextSet contextSuspendResumeAlert threadTest thread alertRegister termination port
Process
Process IDAccess tokenBase priorityDefault processor affinityQuota limitsExecution timeI/O countersVM operation countersException/debugging portsExit status
Create processOpen processQuery process informationSet process informationCurrent processTerminate processAllocate/free virtual memoryRead/write virtual memoryProtect virtual memoryLock/unlock virtual memoryQuery virtual memoryFlush virtual memory
![Page 89: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/89.jpg)
System Service Dispatcher
Task Manager
Explorer
SvcHost.Exe
WinMgt.Exe
SpoolSv.Exe
Ob
jectM
gr.
WindowsUSER,
GDI
File
System
Cach
e
I/O Mgr
Environment Subsystems
UserApplication
Subsystem DLLs
System Processes Services Applications
SystemThreads
UserMode
KernelMode
NTDLL.DLL
Device &File Sys.Drivers
Session ManagerServices.Exe POSIX
Windows DLLs
Plu
g an
dP
lay Mg
r.
Po
wer
Mg
r.
Secu
rityR
eference
Mo
nito
r
Virtu
alM
emo
ry
Pro
cesses&
Th
reads
Lo
calP
roced
ure
Call Graphics
Drivers
Hardware Abstraction Layer (HAL)
(kernel mode callable interfaces)
Co
nfig
ura-
tion
Mg
r(reg
istry)OS/2
WindowsWin32
Windows NT arhitektura
Kernel
![Page 90: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/90.jpg)
Windows kernel
• Kernel je zbunjujući termin kod Windows-a.
• Nekada se odnosi na sve što se izvršava u prostoru kernela.
• Drugi put se odnosi na NTOSKRNL.EXE, koji sadrži jezgro operativnog sistema – executive.
• Mi ćemo termin kernel koristiti za sloj unutar executive, obeležen crvenom bojom na prethodnoj slici.
• Interesantno je da se termin “kernel” nekada koristi i za biblioteku iz korisničkog prostora koja je u sklopu zaštićenog podsistema Win32 – KERNEL32.DLL
![Page 91: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/91.jpg)
Windows kernel
Funkcionalnost Windows kernela:• Raspoređivanje niti*• Upravljanje rutinama za obradu prekida ili izuzetaka• Multiprocesorska sinhronizacija• Oporavak sistema nakon pada usled nestanka napajanja
• Windows kernel se uvek nalazi u memoriji• Windows kernel niko ne može da istisne sa procesora.
* Odnosi sa na kernel niti. Korisničke Windows niti zovu se fibers.
![Page 92: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/92.jpg)
Mikrokernel
• Pretpostavimo da se u prostoru kernela nalazi samo kernel sa minimalnim funkcijama (raspoređivanje i dodeljivanje resursa), a da se ostale funkcionalnosti sistema (npr. sistemi datoteka, drajveri, itd.) realizuju kao korisnički procesi.
• Komunikacija među procesima vrši se razmenom poruka.• Ovakav pritup naziva se mikrokernel arhitektura.• Prednost: Visoka pouzdanst i robusnost. Pad nekog podistema (npr.
drajvera) ne izaziva krah čitavog sistema.• Nedostatak: Lošije performanse zbog česte promene nivoa
privilegije prilikom prenosa poruka (zavisno od hardverske podrške).• Windows nema mikrokernel arhitekturu (iako na nju podseća) jer se
kompletan executive, drajveri, pa i korisnički interfejs, izvršavaju u prostoru kernela.
• Operativni sistemi sa mikrokernel arhitekturom: Minix, QNX Neutrino, Symbian, Mach, MAC OS-X (hibridni, na bazi Mach-a).
![Page 93: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/93.jpg)
Mikrokernel
Monolitni kernel Mikrokernel
hardver hardver
korisnički prostor
prostor kernela
aplikacija
aplikacijaIPC
VFS
IPC, sistem datoteka
raspoređivač, virtuelna memorija
drajveri uređaja, dispečer, ... IPC, raspoređivač, virtuelna memorija
UNIXserver
drajveruređaja
serverdatoteka
sistemski poziv
Problem može da nastane zbog kompleksnosti IPC meganizma i česte promene nivoa privilegije
![Page 94: Operativni sistemi](https://reader035.vdocuments.mx/reader035/viewer/2022081419/56812b13550346895d8f06ab/html5/thumbnails/94.jpg)
Exokernel
• Exokernel ide dalje: napušta prvi postulat operativnih sistema – apstrakciju hardvera.
• Umesto toga, kompletno upravljanje resursima premešta se u korisnički prostor i vidu biblioteke LibOS.
• Ovu biblioteku može da menja i korisnik, a može istovremeno da postoji i više biblioteka.
• Ostatak kernela ima zadatak samo da eksportuje postojeći hardver - ne da ga viruelizuje. On to izvodi na bezbedan način (multipleksiranje hardvera).
• Razvojena je bezbednost od upravljanja resursima.• Kod jednokorisničkih, jednoprocesnih sistema, ni to multipleksiranje
nije nam potrebno (npr. RAF_OS).