Niti i procesi

Download Report

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).