Transcript Niti i procesi
Slide 1
Operativni sistemi
Niti i procesi
Slide 2
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.
Slide 3
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.
Slide 4
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.
Slide 5
Program u memoriji (task)
Program na
disku (EXE)
Task
Runtime library
SP
SS
Metapodaci
na disku
Dobija se
nakon
prevođenja
stack
zaglavlje
heap
RPT
BSS
data
text
BP
DS
IP
CS
data
text
Deo konteksta
Deljene
instrukcije i
podaci
Privatni podaci
(tranzijentni)
Globalni podaci
Neinicijalizovani
podaci
Inicijalizovani
podaci
Programski kôd
Slide 6
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.
Slide 7
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.
Slide 8
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.
Slide 9
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.
Slide 10
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.
Slide 11
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).
Start task
Proizvoljan
broj taskova
neizvršenje
izvršenje
Samo jedan
task
Startovan je
neki drugi task
Dijagram stanja konačnog automata
Slide 12
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
Slide 13
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 $
Slide 14
Primer
task1:
mov
mov
out
mov
mov
out
jmp
•
•
•
•
dx, zeleno
al, _ON
dx, al
dx, crveno
al, _OFF
dx, al
task1
task2:
mov
mov
out
mov
mov
out
jmp
dx, zeleno
al, _OFF
dx, al
dx, crveno
al, _ON
dx, al
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.
Slide 15
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.
Slide 16
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.
Periodični prekidi sistemskog časovnika
task1
vreme
ISR
task2
ISR
task1
ISR
task2
itd ...
Slide 17
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)
Slide 18
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
Slide 19
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
Slide 20
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
Slide 21
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.
Start task
Proizvoljan
broj taskova
neizvršenje
izvršenje
Startovan je
neki drugi task
Samo jedan
task
Slide 22
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
Slide 23
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.
Slide 24
Atributi niti
• Atributi niti zavise od operativnog sistema, ali u osnovi
se sastoje od sledećih informacija:
–
–
–
–
–
–
–
–
–
–
Identifikator niti (Thread ID)
Jedinstveno za svaku nit
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
Slide 25
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.
Slide 26
Stanje spremnosti
TID=567
TID=123
TID=456
TID=789
spremna
spremna
spremna
spremna
prioritet=6
prioritet=6
prioritet=6
prioritet=6
next
NULL
next
next
• Onoliko redova koliko ima prioriteta
TID=091
• Nazivaju se Ready Queues ili Run Queues
spremna
• Obično se prvo prazni red višeg prioriteta,
prioritet=1
zatim nižeg, itd.
• Ako u red stalno dolaze nove niti višeg
prioriteta, niti nižeg proriteta će čekati dugo
next
– izgladnjivanje (starvation).
• Svako procesorsko jezgro ima svoje redove spremnosti
(između ostalog i na osnovu atributa “Afinitet”)
TID=234
spremna
prioritet=1
NULL
Slide 27
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.
Slide 28
Blokirano stanje
TID=246
TID=135
TID=222
TID=333
blokirana
blokirana
blokirana
blokirana
konzola
disk
tajmer
tajmer
NULL
NULL
next
NULL
TID=980
TID=357
TID=469
blokirana
blokirana
blokirana
semafor A
semafor A
semafor A
next
next
NULL
• Onoliko redova koliko ima
događaja na koje se čeka
• Nisu vezani za neko
procesorsko jezgro
Slide 29
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.
Slide 30
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.
Slide 31
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.
Slide 32
Solaris niti (LWP)
IDL
PINNED
thread_create()
intr()
switch()
RUN
syscall()
ONPROC
preempt()
pstop()
SLEEP
wakeup()
exit()
prun()
STOP
Stanje kada su resursi koje zauzima task oslobođeni,
ali je struktura sa atributima još u upotrebi.
ZOMBIE
reap()
FREE
Potpuno oslobađanje
Slide 33
Linux niti (tasks)
fork()
signal
CREATE
STOP
ZOMBIE
signal
switch()
exec()
READY
exit()
RUNNING
preempt()
wake_up()
wait()
WAIT
uninterruptible
interruptible
Slide 34
Windows XP (threads)
Init
pick
preempt,
quantum end
preempt
initialize
resursi su
raspoloživi
Standby
switch
Ready
Running
terminate
unblock
resursi raspoloživi
Transition
unblock
resursi nisu
raspoloživi ali će
uskoro biti
switch
Terminated
Waiting
Slide 35
Vista, Server 2008, Windows 7
Ready
Init
pick
Standby
switch
preempt,
quantum end
preempt
initialize
resursi su
raspoloživi
Deferred
Ready
switch
terminate
unblock
resursi raspoloživi
unblock
resursi nisu
raspoloživi ali će
uskoro biti
Running
Transition
Terminated
Waiting,
Gate
Waiting
Slide 36
Konkurentno izvršavanje
Primer:
Pretpostavimo da je početna vrednost globalne deljene
celobrojne promenljive x = 0
Nit 1
(1) x = 1
Nit 2
(2) x = 2
Nit 3
(3) y = x
Raspoređivanje sa istiskivanjem.
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
Slide 37
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
Slide 38
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.
Slide 39
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.
Slide 40
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,eax
mov dword [hits],eax
;hits=0
Slide 41
Dve niti, jedan brojač
; Pocetak niti #1
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
Uspostavljena
konekcija 1
;hits=0
;hits=1
Uspostavljena
konekcija 2
; Pocetak niti #2
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
vreme
;hits=1
;hits=2
Slide 42
Stanje trke
; Pocetak niti #1
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
Uspostavljena
konekcija 1
;hits=0
;hits=1
Uspostavljena
konekcija 2
; Pocetak niti #2
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
;hits=0
;hits=1
Trebalo bi da bude hits=2
Stanje trke je vremenski zavisna
greška. Da li će se javiti ili ne,
zavisi od raspoređivanja.
vreme
Slide 43
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).
Slide 44
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.
Slide 45
Zabrana prekida
; Pocetak niti #1
cli
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
sti
iret
Uspostavljena
konekcija 1
;hits=0
;hits=1
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.
Uspostavljena
konekcija 2
Prekid se tretira
kao nastupajući
(pending)
; Pocetak niti #2
cli
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
sti
iret
vreme
;hits=1
;hits=2
Slide 46
Problem
; Pocetak niti #1
cli
jmp $
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.
vreme
Slide 47
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
Slide 48
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)
Slide 49
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
Slide 50
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.
Slide 51
XCHG
Svaki od ovih CPU mogao
bi da bude sa više jezgara
CPU
CPU
CPU
L1
L1
L2
CPU
...
L1
...
L1
L2
L2
xchg
Memorija
lock xchg
Više jezgara
SMP
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.
Slide 52
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 niti
uzimam_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
Slide 53
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.
Slide 54
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.
Slide 55
Spinlock primer
acquire:
xor eax,eax
spin: lock
xchg dword [edx],eax
test eax,eax
jz spin
ret
;edx - adresa spinlock promenljive
;ako je eax=0, postavljen je ZF flag
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.
Slide 56
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.
Slide 57
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.
Slide 58
Operacije i sintaksa
Semaforske operacije su opisane različitim imenima u različitim
okruženjima. Najčešće se koriste:
sem.up ( )
sem.down( )
sema_up(&sem )
sema_down (&sem )
sem.signal( )
sem.wait( )
sema_signal (&sem ) ili sema_post (&sem )
sema_wait(&sem )
sem.V( )
sem.P( )
sema_V(&sem )
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.
Slide 59
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);
}
}
Slide 60
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.
Slide 61
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.
Slide 62
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.
Slide 63
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
citaj
sema_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.
Slide 64
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.
Slide 65
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)); }
Slide 66
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.
Slide 67
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 N1 */
/* Nit N2 */
void N1(){
char znak;
FILE *f;
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);
f = fopen(“datoteka.txt“,“r“);
do {
znak = fgetc(f);
proc1(znak);
sema_signal(&s);
} while(znak!=EOF)
flose(f);
}
*/
*/
}
Slide 68
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
...
Slide 69
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.
Slide 70
Unix procesi
Kontrolni
blok
procesa
GID=1
GID=4
/home1
/home4
/root
/root
SID=12
SID=45
tty1
tty4
env1->
env4->
files1->
files4->
PID=123
PID=456
…
…
spreman
spreman
…
…
TSS123
TSS456
…
…
Adresni prostori ova dva taska su razdvojeni,
sem malog zajedničkog dela za komunikaciju
memorija za komunikaciju
stack
stack
heap
heap
BSS
BSS
data
data
text
text
Task 1 (PID = 123)
Task 2 (PID = 456)
Deo kontrolnog bloka procesa, koji nije User Area, čini jednu stavku u tabeli procesa
Slide 71
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.
Slide 72
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.
Slide 73
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
Slide 74
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 */}
Slide 75
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.
Slide 76
Konkurentno izvršavanje
#include
#include
#include
#include
int main(){
pid_t pid;
pid = fork();
if (pid ==0) {
printf(“A”);
fork();
printf(“B”);
}
else if (pid > 0){
wait(NULL);
printf(“C”);
}
}
int main(){
pid_t pid;
pid = fork();
if (pid ==0) {
printf(“A”);
fflush(stdout);
fork();
printf(“B”);
}
else if (pid > 0){
printf(“C”);
}
}
Problem serijalizacije:
ABABC ili ABCAB
ABBC ili ACBB
Slide 77
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.
Slide 78
Stanja Unix procesa
intr
ZOMBIE
exit
return
RUN
KERNEL
sleep
SLEEP
MEMORY
swap_ out
preempt
wakeup
syscall
schedule
READY
MEMORY
swap_ out
swap_ in
wakeup
READY
SLEEP
SWAPPED
SWAPPED
RUN
USER
return
preempted
new
CREATED
new
swapped
fork
Slide 79
Unix kernel
init
shell
editor
httpd
Unix procesi
...
API
C biblioteka
Korisnički
prostor
Interfejs za sistemske pozive
Podsistem datoteka
Upravljanje procesima
Međuprocesna komunikacija
Buffer cache
Znakovni U/I
Blok U/I
Raspoređivanje
Upravljanje
memorijom
Drajveri
Prostor
kernela
swapper
Upravljanje hardverom/dispečer prekida
hardver
Nivo
hardvera
Slide 80
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.
Slide 81
Solaris niti i procesi
Raspoređivanje korisničkih niti na
veći broj virtuelnih procesora
Tradicionalni
proces
Jedini model počev od Solarisa 9
Korisnički
prostor
Prostor
kernela
Daemon nit
Raspoređivanje kernel niti
na veći broj procesora
Hardver
= Nit
= LWP
= Procesor
Slide 82
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
Slide 83
Solaris kernel
Interfejs za sistemske pozive
TS
RT
Virtuelni sistem datoteka
IA
UFS NFS
SHR
Raspoređivanje
niti i upravljanje
procesima
Kernel
servisi
Sistem
virtuelne
memorije
Redovi
čekanja,
časovnici,
tajmeri
Umrežavanje
Upravljački programi
uređaja i magistrala
Translacija adresa
spec
FS
SD SDD
hardver
TCP
IP
soketi
Slide 84
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.
Slide 85
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.
Slide 86
Linux kernel
C biblioteka
Korisnički prostor
Interfejs za sistemske pozive
Kernel prostor
Umrežavanje
spec
Upravljački
programi
Virtuelni sistem datoteka
Sistemi datoteka
Modularni deo
Upravljanje memorijom
Upravljanje procesima
Monolitni deo
Platformski zavisan interfejs ka hardveru
hardver
Slide 87
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
klijent proces
klijent proces
server proces
Korisnički prostor
Prostor kernela
Sistem za prenos poruka
*
To ne znači da je napisan u nekom objektno-orijentisanom programskom jeziiku.
Slide 88
Windows niti i procesi
Tip objekta
Atributi
Servisi
Thread
Process
Client ID
Thread context
Dynamic priority
Base priority
Processor affinity
Execution time
Alert status
Suspension count
Impersonation token
Termination port
Exit status
Process ID
Access token
Base priority
Default processor affinity
Quota limits
Execution time
I/O counters
VM operation counters
Exception/debugging ports
Exit status
Create thread
Open thread
Query thread information
Set thread information
Current thread
Terminate thread
Get context
Set context
Suspend
Resume
Alert thread
Test thread alert
Register termination port
Create process
Open process
Query process information
Set process information
Current process
Terminate process
Allocate/free virtual memory
Read/write virtual memory
Protect virtual memory
Lock/unlock virtual memory
Query virtual memory
Flush virtual memory
Slide 89
Windows NT arhitektura
System Processes
Services
Environment
Subsystems
Applications
Service
Control Mgr.
SvcHost.Exe
LSASS
Task Manager
WinMgt.Exe
WinLogon
User
Mode
Explorer
SpoolSv.Exe
OS/2
User
Application
Services.Exe
Session Manager
Windows
Win32
POSIX
Subsystem DLLs
Windows DLLs
NTDLL.DLL
System
Threads
Kernel
Mode
System Service Dispatcher
Windows
USER,
GDI
(kernel mode callable interfaces)
I/O Mgr
Local
Procedure
Call
Hardware Abstraction Layer (HAL)
Configuration Mgr
(registry)
Kernel
Processes
&
Threads
Virtual
Memory
Security
Reference
Monitor
Power
Mgr.
Plug and
Play Mgr.
Object
Mgr.
File
System
Cache
Device &
File Sys.
Drivers
Graphics
Drivers
Slide 90
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
Slide 91
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.
Slide 92
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).
Slide 93
Mikrokernel
Monolitni kernel
aplikacija
Mikrokernel
sistemski poziv
VFS
korisnički
prostor
IPC, sistem datoteka
aplikacija
IPC
raspoređivač, virtuelna memorija
drajveri uređaja, dispečer, ...
hardver
prostor
kernela
UNIX
server
drajver server
uređaja datoteka
IPC, raspoređivač, virtuelna memorija
hardver
Problem može da nastane zbog kompleksnosti IPC
meganizma i česte promene nivoa privilegije
Slide 94
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).
Operativni sistemi
Niti i procesi
Slide 2
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.
Slide 3
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.
Slide 4
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.
Slide 5
Program u memoriji (task)
Program na
disku (EXE)
Task
Runtime library
SP
SS
Metapodaci
na disku
Dobija se
nakon
prevođenja
stack
zaglavlje
heap
RPT
BSS
data
text
BP
DS
IP
CS
data
text
Deo konteksta
Deljene
instrukcije i
podaci
Privatni podaci
(tranzijentni)
Globalni podaci
Neinicijalizovani
podaci
Inicijalizovani
podaci
Programski kôd
Slide 6
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.
Slide 7
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.
Slide 8
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.
Slide 9
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.
Slide 10
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.
Slide 11
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).
Start task
Proizvoljan
broj taskova
neizvršenje
izvršenje
Samo jedan
task
Startovan je
neki drugi task
Dijagram stanja konačnog automata
Slide 12
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
Slide 13
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 $
Slide 14
Primer
task1:
mov
mov
out
mov
mov
out
jmp
•
•
•
•
dx, zeleno
al, _ON
dx, al
dx, crveno
al, _OFF
dx, al
task1
task2:
mov
mov
out
mov
mov
out
jmp
dx, zeleno
al, _OFF
dx, al
dx, crveno
al, _ON
dx, al
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.
Slide 15
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.
Slide 16
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.
Periodični prekidi sistemskog časovnika
task1
vreme
ISR
task2
ISR
task1
ISR
task2
itd ...
Slide 17
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)
Slide 18
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
Slide 19
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
Slide 20
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
Slide 21
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.
Start task
Proizvoljan
broj taskova
neizvršenje
izvršenje
Startovan je
neki drugi task
Samo jedan
task
Slide 22
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
Slide 23
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.
Slide 24
Atributi niti
• Atributi niti zavise od operativnog sistema, ali u osnovi
se sastoje od sledećih informacija:
–
–
–
–
–
–
–
–
–
–
Identifikator niti (Thread ID)
Jedinstveno za svaku nit
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
Slide 25
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.
Slide 26
Stanje spremnosti
TID=567
TID=123
TID=456
TID=789
spremna
spremna
spremna
spremna
prioritet=6
prioritet=6
prioritet=6
prioritet=6
next
NULL
next
next
• Onoliko redova koliko ima prioriteta
TID=091
• Nazivaju se Ready Queues ili Run Queues
spremna
• Obično se prvo prazni red višeg prioriteta,
prioritet=1
zatim nižeg, itd.
• Ako u red stalno dolaze nove niti višeg
prioriteta, niti nižeg proriteta će čekati dugo
next
– izgladnjivanje (starvation).
• Svako procesorsko jezgro ima svoje redove spremnosti
(između ostalog i na osnovu atributa “Afinitet”)
TID=234
spremna
prioritet=1
NULL
Slide 27
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.
Slide 28
Blokirano stanje
TID=246
TID=135
TID=222
TID=333
blokirana
blokirana
blokirana
blokirana
konzola
disk
tajmer
tajmer
NULL
NULL
next
NULL
TID=980
TID=357
TID=469
blokirana
blokirana
blokirana
semafor A
semafor A
semafor A
next
next
NULL
• Onoliko redova koliko ima
događaja na koje se čeka
• Nisu vezani za neko
procesorsko jezgro
Slide 29
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.
Slide 30
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.
Slide 31
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.
Slide 32
Solaris niti (LWP)
IDL
PINNED
thread_create()
intr()
switch()
RUN
syscall()
ONPROC
preempt()
pstop()
SLEEP
wakeup()
exit()
prun()
STOP
Stanje kada su resursi koje zauzima task oslobođeni,
ali je struktura sa atributima još u upotrebi.
ZOMBIE
reap()
FREE
Potpuno oslobađanje
Slide 33
Linux niti (tasks)
fork()
signal
CREATE
STOP
ZOMBIE
signal
switch()
exec()
READY
exit()
RUNNING
preempt()
wake_up()
wait()
WAIT
uninterruptible
interruptible
Slide 34
Windows XP (threads)
Init
pick
preempt,
quantum end
preempt
initialize
resursi su
raspoloživi
Standby
switch
Ready
Running
terminate
unblock
resursi raspoloživi
Transition
unblock
resursi nisu
raspoloživi ali će
uskoro biti
switch
Terminated
Waiting
Slide 35
Vista, Server 2008, Windows 7
Ready
Init
pick
Standby
switch
preempt,
quantum end
preempt
initialize
resursi su
raspoloživi
Deferred
Ready
switch
terminate
unblock
resursi raspoloživi
unblock
resursi nisu
raspoloživi ali će
uskoro biti
Running
Transition
Terminated
Waiting,
Gate
Waiting
Slide 36
Konkurentno izvršavanje
Primer:
Pretpostavimo da je početna vrednost globalne deljene
celobrojne promenljive x = 0
Nit 1
(1) x = 1
Nit 2
(2) x = 2
Nit 3
(3) y = x
Raspoređivanje sa istiskivanjem.
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
Slide 37
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
Slide 38
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.
Slide 39
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.
Slide 40
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,eax
mov dword [hits],eax
;hits=0
Slide 41
Dve niti, jedan brojač
; Pocetak niti #1
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
Uspostavljena
konekcija 1
;hits=0
;hits=1
Uspostavljena
konekcija 2
; Pocetak niti #2
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
vreme
;hits=1
;hits=2
Slide 42
Stanje trke
; Pocetak niti #1
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
Uspostavljena
konekcija 1
;hits=0
;hits=1
Uspostavljena
konekcija 2
; Pocetak niti #2
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
iret
;hits=0
;hits=1
Trebalo bi da bude hits=2
Stanje trke je vremenski zavisna
greška. Da li će se javiti ili ne,
zavisi od raspoređivanja.
vreme
Slide 43
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).
Slide 44
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.
Slide 45
Zabrana prekida
; Pocetak niti #1
cli
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
sti
iret
Uspostavljena
konekcija 1
;hits=0
;hits=1
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.
Uspostavljena
konekcija 2
Prekid se tretira
kao nastupajući
(pending)
; Pocetak niti #2
cli
mov dword eax,[hits]
add eax,1
mov dword [hits],eax
sti
iret
vreme
;hits=1
;hits=2
Slide 46
Problem
; Pocetak niti #1
cli
jmp $
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.
vreme
Slide 47
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
Slide 48
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)
Slide 49
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
Slide 50
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.
Slide 51
XCHG
Svaki od ovih CPU mogao
bi da bude sa više jezgara
CPU
CPU
CPU
L1
L1
L2
CPU
...
L1
...
L1
L2
L2
xchg
Memorija
lock xchg
Više jezgara
SMP
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.
Slide 52
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 niti
uzimam_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
Slide 53
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.
Slide 54
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.
Slide 55
Spinlock primer
acquire:
xor eax,eax
spin: lock
xchg dword [edx],eax
test eax,eax
jz spin
ret
;edx - adresa spinlock promenljive
;ako je eax=0, postavljen je ZF flag
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.
Slide 56
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.
Slide 57
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.
Slide 58
Operacije i sintaksa
Semaforske operacije su opisane različitim imenima u različitim
okruženjima. Najčešće se koriste:
sem.up ( )
sem.down( )
sema_up(&sem )
sema_down (&sem )
sem.signal( )
sem.wait( )
sema_signal (&sem ) ili sema_post (&sem )
sema_wait(&sem )
sem.V( )
sem.P( )
sema_V(&sem )
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.
Slide 59
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);
}
}
Slide 60
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.
Slide 61
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.
Slide 62
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.
Slide 63
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
citaj
sema_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.
Slide 64
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.
Slide 65
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)); }
Slide 66
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.
Slide 67
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 N1 */
/* Nit N2 */
void N1(){
char znak;
FILE *f;
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);
f = fopen(“datoteka.txt“,“r“);
do {
znak = fgetc(f);
proc1(znak);
sema_signal(&s);
} while(znak!=EOF)
flose(f);
}
*/
*/
}
Slide 68
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
...
Slide 69
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.
Slide 70
Unix procesi
Kontrolni
blok
procesa
GID=1
GID=4
/home1
/home4
/root
/root
SID=12
SID=45
tty1
tty4
env1->
env4->
files1->
files4->
PID=123
PID=456
…
…
spreman
spreman
…
…
TSS123
TSS456
…
…
Adresni prostori ova dva taska su razdvojeni,
sem malog zajedničkog dela za komunikaciju
memorija za komunikaciju
stack
stack
heap
heap
BSS
BSS
data
data
text
text
Task 1 (PID = 123)
Task 2 (PID = 456)
Deo kontrolnog bloka procesa, koji nije User Area, čini jednu stavku u tabeli procesa
Slide 71
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.
Slide 72
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.
Slide 73
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
Slide 74
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 */}
Slide 75
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.
Slide 76
Konkurentno izvršavanje
#include
#include
#include
#include
int main(){
pid_t pid;
pid = fork();
if (pid ==0) {
printf(“A”);
fork();
printf(“B”);
}
else if (pid > 0){
wait(NULL);
printf(“C”);
}
}
int main(){
pid_t pid;
pid = fork();
if (pid ==0) {
printf(“A”);
fflush(stdout);
fork();
printf(“B”);
}
else if (pid > 0){
printf(“C”);
}
}
Problem serijalizacije:
ABABC ili ABCAB
ABBC ili ACBB
Slide 77
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.
Slide 78
Stanja Unix procesa
intr
ZOMBIE
exit
return
RUN
KERNEL
sleep
SLEEP
MEMORY
swap_ out
preempt
wakeup
syscall
schedule
READY
MEMORY
swap_ out
swap_ in
wakeup
READY
SLEEP
SWAPPED
SWAPPED
RUN
USER
return
preempted
new
CREATED
new
swapped
fork
Slide 79
Unix kernel
init
shell
editor
httpd
Unix procesi
...
API
C biblioteka
Korisnički
prostor
Interfejs za sistemske pozive
Podsistem datoteka
Upravljanje procesima
Međuprocesna komunikacija
Buffer cache
Znakovni U/I
Blok U/I
Raspoređivanje
Upravljanje
memorijom
Drajveri
Prostor
kernela
swapper
Upravljanje hardverom/dispečer prekida
hardver
Nivo
hardvera
Slide 80
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.
Slide 81
Solaris niti i procesi
Raspoređivanje korisničkih niti na
veći broj virtuelnih procesora
Tradicionalni
proces
Jedini model počev od Solarisa 9
Korisnički
prostor
Prostor
kernela
Daemon nit
Raspoređivanje kernel niti
na veći broj procesora
Hardver
= Nit
= LWP
= Procesor
Slide 82
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
Slide 83
Solaris kernel
Interfejs za sistemske pozive
TS
RT
Virtuelni sistem datoteka
IA
UFS NFS
SHR
Raspoređivanje
niti i upravljanje
procesima
Kernel
servisi
Sistem
virtuelne
memorije
Redovi
čekanja,
časovnici,
tajmeri
Umrežavanje
Upravljački programi
uređaja i magistrala
Translacija adresa
spec
FS
SD SDD
hardver
TCP
IP
soketi
Slide 84
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.
Slide 85
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.
Slide 86
Linux kernel
C biblioteka
Korisnički prostor
Interfejs za sistemske pozive
Kernel prostor
Umrežavanje
spec
Upravljački
programi
Virtuelni sistem datoteka
Sistemi datoteka
Modularni deo
Upravljanje memorijom
Upravljanje procesima
Monolitni deo
Platformski zavisan interfejs ka hardveru
hardver
Slide 87
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
klijent proces
klijent proces
server proces
Korisnički prostor
Prostor kernela
Sistem za prenos poruka
*
To ne znači da je napisan u nekom objektno-orijentisanom programskom jeziiku.
Slide 88
Windows niti i procesi
Tip objekta
Atributi
Servisi
Thread
Process
Client ID
Thread context
Dynamic priority
Base priority
Processor affinity
Execution time
Alert status
Suspension count
Impersonation token
Termination port
Exit status
Process ID
Access token
Base priority
Default processor affinity
Quota limits
Execution time
I/O counters
VM operation counters
Exception/debugging ports
Exit status
Create thread
Open thread
Query thread information
Set thread information
Current thread
Terminate thread
Get context
Set context
Suspend
Resume
Alert thread
Test thread alert
Register termination port
Create process
Open process
Query process information
Set process information
Current process
Terminate process
Allocate/free virtual memory
Read/write virtual memory
Protect virtual memory
Lock/unlock virtual memory
Query virtual memory
Flush virtual memory
Slide 89
Windows NT arhitektura
System Processes
Services
Environment
Subsystems
Applications
Service
Control Mgr.
SvcHost.Exe
LSASS
Task Manager
WinMgt.Exe
WinLogon
User
Mode
Explorer
SpoolSv.Exe
OS/2
User
Application
Services.Exe
Session Manager
Windows
Win32
POSIX
Subsystem DLLs
Windows DLLs
NTDLL.DLL
System
Threads
Kernel
Mode
System Service Dispatcher
Windows
USER,
GDI
(kernel mode callable interfaces)
I/O Mgr
Local
Procedure
Call
Hardware Abstraction Layer (HAL)
Configuration Mgr
(registry)
Kernel
Processes
&
Threads
Virtual
Memory
Security
Reference
Monitor
Power
Mgr.
Plug and
Play Mgr.
Object
Mgr.
File
System
Cache
Device &
File Sys.
Drivers
Graphics
Drivers
Slide 90
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
Slide 91
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.
Slide 92
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).
Slide 93
Mikrokernel
Monolitni kernel
aplikacija
Mikrokernel
sistemski poziv
VFS
korisnički
prostor
IPC, sistem datoteka
aplikacija
IPC
raspoređivač, virtuelna memorija
drajveri uređaja, dispečer, ...
hardver
prostor
kernela
UNIX
server
drajver server
uređaja datoteka
IPC, raspoređivač, virtuelna memorija
hardver
Problem može da nastane zbog kompleksnosti IPC
meganizma i česte promene nivoa privilegije
Slide 94
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).