2. Predavanje

Download Report

Transcript 2. Predavanje

III Upravljanje procesima
Jezgro
Procesi i niti
Sinhronizacija i komunikacija između procesa
1
Jezgro operativnog sistema i upravljanje
procesima
Jezgra (nukleus ili kemel) osnovni je deo svakog operativnog sistema. U
hijerarhijskom (slojevitom) modelu, jezgro je najbliže hardveru i predstavlja vezu, tj.
interfejs između hardvera i ostalih slojeva operativnih sistema. Jezgro se može
definisati i kao deo operativnog sistema koji omogućava programima da na siguran
način pristupe hardveru.
Proces je jedan od najvažnijih koncepata operativnih sistema. To je program ili deo
programa u stanju izvršavanja, zajedno sa svim resursima potrebnim za rad
programa.
2
JEZGRO
Osnovna funkcija jezgra je upravljanje procesima, tj. stvaranje okruženja u kome mogu
postojati procesi, dodeljivanje procesora procesima i obezbeđivanje mehanizama za
interprocesnu komunikaciju.
Na nivou hardvera postoje komponente koje omogućavaju nadogradnju hardvera
jezgrom.
U te komponente spadaju:
1) Mehanizam prekida (obezbeđuje izvršenje upravljačkog programa, to jest
prebacivanje kontrole izvršavanja s korisničkog na upravljački program)
2) Zaštitni mehanizam adresiranja memorije (sprečava pogrešno adresiranje, tj.
onemogućava da jedan proces upiše svoje prateće podatke u deo memorije koji je
dodeljen drugom procesu)
3) Skup privilegovanih instrukcija (čine sve instrukcije koje su dostupne
operativnom sistemu, ali ne i korisničkim programima)
4) Časovnik realnog vremena (pomoću satnog mehanizma realnog vremena
kontroliše se i evidentira potrošnja resursa računara za sve pojedinačne procese)
3/285
Delovi jezgra
Moze se podeliti na tri osnovne celine:
1) Prvi nivo obrade prekida (čine rutine za određivanje izvora prekida i iniciranje
servisa, tj. opsluživanje pojedinih vrsta prekida)
2) Dispečer sistema -planer poslova niskog nivoa (dispečer je deo jezgra koji
dodeljuje procesor procesima)
3) Rutine za ostvarivanje interprocesne komunikacije (deo jezgra operativnog
sistema koji obezbeđuje komunikaciju među procesima)
4/285
Procesi i niti
Pojam procesa
Operacije nad procesima
Implementacija procesa
Pojam niti
Implementacija niti
5
PROCESI
Računarski sistem koji ima samo jedan procesor može da izvršava samo jednu
instrukciju u jednom trenutku.
Proces predstavlja jedan od najvažnijih koncepata operativnih sistema. Proces je
program ili deo programa u stanju izvršavanja, zajedno sa svim resursima koji
su potrebni za rad programa.
Svaki proces ima tri fundamentalna memorijska dela, tj. sekcije:
1) programska ili tekstualna sekcija, koja se ne menja (eng. read only) i
koji sadrži programski kod;
2) stek sekcija (eng. stack section), koja sadrži privremene podatke
(parametre za procedure, povratne adrese, lokalne promenljjive);
3) sekcija podataka (eng. data section), koja sadrži globalne promenljive.
6/285
PREDSTAVLJANJE PROCESA
Za razliku od programa, proces je dinamička struktura i najjednostavnije se može opisati
kao program u stanju izvršenja, tj. kao niz aktivnosti koje su posledica izvršenja programa.
Kontrolni blok je deo radne memorije, to jest memorijska struktura sa osnovnim
informacijama o procesu, koje operativni sistem koristi za upravljanje tim procesom.
U informacije iz kontrolnog bloka spadaju:
- ime ili jedinstveni identifikator procesa (PIO);
- kontekst (okruženje) procesa;
- prioritet procesa;
- informacije o memoriji procesa;
- lista otvorenih datoteka;
- status zauzetih ulazno-izlaznih resursa;
- trenutno stanje procesa.
7/285
Dijagram stanja procesa
Proces se može naći u nekoliko stanja (pet ili sedam,
zavisno od konačnog automata koji je korišćen
za opisivanje stanja) a sledeća tri su
najznačajnija:
o Stanje izvršavanja (RUN, RUNNING) Procesor
izvršava instrukcije ovog procesa.
o Stanje čekanja na procesor (READY,
RUNNABLE) Proces je dobio sve potrebne
resurse osim procesora, spreman je za rad i čeka
da mu se dodeli procesor.
o Stanje
čekanja
na
resurs
(WAIT,
UNRUNNABLE) Proces čeka na neki događaj
(na primer, da se završi štampanje), jer su za
dalje izvršavanje procesa potrebni resursi koji
trenutno nisu na raspolaganju. Takođe, proces
može ući li stanje WAIT ukoliko čeka završtak
neke ulazno-izlazne operacije ili rezultat nekog
drugog procesa.
8/285
Prošireni dijagram stanja procesa
Ovaj model automata karakterističan je
za operativne sisteme UNIX.
Osnovna pretpostavka je da korisnik
koji inicira proces ima pravo da
privremeno zaustavi njegovo
izvršenje (eng!. suspend).
Izvršenje procesa se može prekinuti samo
ustanjima WAIT i READY. Na taj
način, formiraju se dva dodatna stanja
:
1. SUSPENDED - READY (u ovo stanje
proces dolazi ukoliko je suspendovan u
stanju čekanja na procesor)
2. SUSPENDED - WAIT (u ovo stanje
proces dolazi ukoliko je suspendovan u
stanju čekanja na resurs)
9/285
RASPOREĐIVANJE PROCESA
Podela vremena (engl. time-sharing) poseban je oblik multiprograrniranja
koji omogućava da svaki korisnik radi interaktivno na računaru preko
posebnog terminala kome pripada dodeljeno procesorsko vreme. Posle
isteka vremenskog kvantuma, tj. dodeljene količine procesorskog
vremena, procesor se dodeljuje drugom terminalu.
Operativni sistem treba da obezbedi odgovarajući mehanizam za dodelu
procesora različitim procesima. Delovi tog mehanizma su redovi
čekanja na procesor i planeri poslova.
10/285
Redovi čekanja na procesor
 Svi procesi koju su spremni za rad i nalaze se u radnoj memoriji čuvaju se u redu
čekanja na procesor, to jest u redu čekanja spremnih procesa.
 Redovi čekanja na procesor po pravilu se realizuju kao povezane liste, formirane
od kontrolnih blokova procesa sa definisanim redosledom izvršenja procesa.
 Proces koji se nalazi u stanju izvršavanja može:
- ostati bez procesora kada mu istekne vremenski kvantum;
- napraviti nov proces i čekati u blokiranom stanju da se novi proces izvrši;
- ostati bez procesora kada se dogodi prekid;
- postaviti U/I zahtev, nakon čega se prebacuje u red čekanja na ulazno-izlazni
uređaj, to jest postaje blokiran.
11/285
Planer poslova i dispečer sistema
Planer poslova obavlja sledeće funkcije:
- deli poslove na procese;
- na osnovu određenih algoritama dodeljuje prioritete procesima;
- dovodi procese u red čekanja na procesor.
Planer poslova se poziva samo kada se pojave novi procesi ili kada jedan ili više
procesa završi aktivnosti. Reguliše stepen multiprogramiranja, tj. broj
simultanih procesa u memoriji. Od njega se očekuje da pravi dobru selekciju
procesa koji će dobiti memoriju kako bi sistem što efikasnije funkcionisao.
Zadatak dispečer sistema je da dodeljuje procesor procesima koji se nalaze u
procesorskom redu.Dispečer dodeljuje procesor kad god tekući proces pređe iz
stanja RUN u stanje WAIT ili READY.
Najjednostavnije rečeno, dispečer odlučuje koji će proces dobiti procesor, kada će
ga dobiti i koliko dugo.
12/285
Zamena konteksta procesa
Prilikom dodele procesora drugom procesu, to jest zamene procesa koji se trenutno
izvršava, dispečer:
- pamti stanje procesa koji se prekida, kako bi se proces mogao kasnije nastaviti;
- puni memoriju stanjem novog procesa kome se dodeljuje procesor.
Konteks procesa čine podaci koji se čuvaju prilikom oduzimanja procesora, a
koji omogućuju nastavak izvršenja procesa, kao što su registri procesora,
memorijske sekcije i lista otvorenih datoteka.
13/285
OPERACIJE NAD PROCESIMA
Ranije opisani koncept jezgra, uz korišćenje kontrolnih blokova procesa,
dozvoljava operativnom sistemu da nad procesima izvrši sledeće operacije:
- izrada novog procesa (pravijenjem kontrolnog bloka i ažuriranjem procesne
liste);
- izrada veza proces - proces roditelj;
- uništenje procesa (brisanjem kontrolnog bloka iz proces ne liste);
- promena stanja procesa (obavljanje tranzicija u dijagramu stanja, kao što je
dodela procesora);
- promena prioriteta procesa.
14/285
Izrada procesa
Proces koji pravi nove procese jeste roditeljski
proces (eng!. parent process), dok se proces
koji je roditelj napravio naziva dete proces
(eng!. child process). Svaki proces koji je
dete drugog procesa može dalje stvarati nove
procese - na taj način se formira hijerarhijska
struktura procesa, tj. stablo aktivnih procesa.
Odnos proces – proces roditelj može se opisati na
osnovu načina deljenja resursa i načina
izvršavanja.
Prema deljenju resursa, procesi roditelj i dete
mogu se naći u sledećim relacijama:
- procesi roditelj i dete dele sve resurse;
- procesi roditelj i dete dele podskup resursa
roditeljskog procesa;
- procesi roditelj i dete ne dele resurse.
15/285
RUTINE ZA INTERPROCESNU KOMUNIKACIJU
Rutine za interprocesnu komunikaciju moraju se implementirati u jezgru kako bi
bile dostupne svim procesima i kako bi imale direktan pristup dispečeru.
Interprocesna komunikacija se može ostvariti na više načina, semaforskim
tehnikama, slanjem poruka, korišćenjem deljive memorije (na primer, bafera) i
imenovanih cevi.
16/285
Nezavisni i kooperativni procesi
U odnosu na međusobnu zavisnost toka izvršavanja, procesisemogu podeliti na:
- nezavisne procese;
- kooperativne;
Proces je nezavisan ukoliko ne utiče direktno na izvršenje drugih procesa i ukoliko na
njegovo izvršenje direktno ne utiču drugi procesi.
Kooperativni procesi su oni koji jedni na druge utiču, a to su svi procesi koji dele podatke
ili bilo kakve resurse. Kooperativni procesi zahtevaju specijalan tretman i okruženje iz
sledećih razloga:
- Deljenje informacija ( mora se obezbediti okruženje koje će omogućiti pravilan
konkurentni pristup podacima )
- Ubrzavanje rada ( ukoliko i se neki posao podelio na više delova, i ako bi se ti delovi
izvršavali konkurentno, poboljšale bi se performanse)
- Modularnost (sistemske funkcije mogu modularno da se podele na odvojene procese i
niti)
- Pogodnost (korisnik može da obavlja više stvari istovremeno)
Konkurentno izvršavanjre kooperativnih procesa zahteva mehanizam koji će dozvoliti
procesim da komuniciraju između sebe i da sinhronizuju svoje akcije.
17/285
Slanje poruka
Procesi mogu komunicirati i slanjem poruka, čime se omogućava sinhronizacija aktivnosti bez upotrebe
deljive memorije. Ovaj način komunikacije je veoma podesan u distribuiranim okruženjima gde se
procesi odvijaju na različitim računarima.
Da bi procesi mogli da komuniciraju slanjem poruka, neophodno je u jezgro implementirati sledeće dve
osnovne operacije:
- slanje poruke
- prijem poruke
Poruke koje se razmenjuju između procesa mogu biti fiksne ili promenljive veličine.
Postoje različite šeme za realizaciju ovih osnovnih operacija, a ove dve operacije su dominantna:
- sinhrono ili blokirajuće slanje i primanje poruka
- asihrono ili neblokirajuće slanje i primanje poruka
Da bi dva procesa mogla da razmenjuju poruke, između njih mora postojati komunikaciona veza
- direktna komunikacija
- indirektna komunikacija preko poštanskih sandučića
Bilo da je u pitanju direktna iliindirektna komunikacija, poruke koje se razmenjuju čuvaju se u
privremenim redovima čekanja.
18/285
Direktna komunikacija
U direktnoj šemi, procedure za slanje i primanje moraju eksplicitno da sadrže ime
procesa s kojim žele da komuniciraju. Postoji i asimetrična varijanta
adresiranja, u kojoj pošiljalac mora da navede ime primaoca, dok primalac ne
mora da navede ime pošiljaoca.
Pravila direktne komunikacije su sledeća:
- veza se automatski uspostavlja između para procesa koji žele da komuniciraju;
- jedna veza se uspostavlja samo za dva procesa
Nedostatak direktne komunikacije je ograničena modularnost definicija procesa,
pri čemu promena imena procesa povlači ispitivanje svih procesnih definicija.
19/285
Indirektna komunikacija
Pri indirektnoj komunikaciji, poruke se šalju ili primaju preko sandučića ili
priključaka. Svako sanduče ima svoju identifikaciju. U indirektnoj šemi
proces može komunicirati s procesom preko više različitih sandučića.
U indirektnoj šemi, osobine komunikacije su:
- veza se uspostavlja između para procesa koji dele sanduče
- vezi se mogu pridružiti više od dva procesa
- između svakog para procesa može postojati više različitih veza, gde svaka
veza odgovara jednom sandučetu.
Sandučići mogu biti vlasništvo procesa ili operativnog sistema.
Da bi se indirektno komuniciralo slanjem poruka, operativni sistem mora
obezbediti mehanizme za pravljenje novog sandučeta za svaki par
procesa koji želi da komunicira, te omogući slanje i primanje poruka
kroz sanduče i brisanje sandučeta.
20/285
Semafori
Semafor je celobrojna nenegativna promenljiva, čija vrednost štiti neki resurs i
omogućava komunikaciju između procesa.
Vrednost semafora određuje da li je resurs koji taj semafor štiti slobodan ili zauzet.
Svaki semafor ima svoju početnu vrednost, a nad njim se mogu izvršiti dve
nedeljive operacije, koje su radi jednostavnosti predstavljene kao signal (s) i
wait(s).
Operacije signal (s) i wait (s) ne mogu se podeliti na više ciklusa, tako da dva
procesa ne mogu istovremeno izvršavati ove operacije nad semaforom.
Vrednost semafora s se u svakom trenutku može odrediti formulom val(s) = c (s)
+ ns(s)- nw(s).
Vrednost semafora kojim je zaštićen resurs koji istovremeno može koristiti N
procesa, nalazi se u intervalu [0,N-1].
21/285
Pojam procesa
Proces (process) je izvršavanje programa nad datim
podacima:



program: statičan zapis intrukcija
proces: jedno izbršavanje (instanca, “inkarnacija”) datog programa
za dati skup podataka – sa jednim adresnim prostorom
moguće je kreirati više procesa nad istim programom, svaki radi
nad svojim podacima – svaki ima svoj adresni prostor
Svaki proces odlikuje:


pozicija u izvršavanju – mesto u programu dokle je izvršavanje
stiglo (Program Counter)
stanje – podaci nad kojima proces radi – adresni prostor
Pojam posao (job) u suštini znači isto što i proces, samo
što je arhaičan (paketni sistemi)
Pojam zadatak (task) ima različito značenje u različitim
sistemimam i programskim jezicima, ali uglavnom znači
isto što i proces
22/285
Operacije nad procesima
Kreiranje procesa: roditeljski (parent) proces kreira procesdete (child) sistemskim pozivom
Varijante dozvoljavanja korišćenja resursa:


proces-dete može da traži bilo koji resurs od OS
proces-dete može da koristi samo podskup resursa roditelja
Varijante izvršavanja:


kada kreira potomka, roditeljski proces se suspenduje (zaustavlja
izvršavanje) sve dok se svi potomci ne završe
kada kreira potomka, roditeljski proces nastavlja izvršavanje
uporedo sa svojim potomcima
Varijante formiranja adresnog prostora:


potomak dobija kopiju adresnog prostora roditelja – “kloniranje”
potomak ima nezavisan program i (novi, prazan) adresni prostor
(uključujući i prazan stek)
23/285
Operacije nad procesima
Primer – Unix:






ID procesa – jedinstveni int
sistemski poziv za kreiranje procesa: fork()
proces-dete dobija kopiju adresnog prostora roditelja i kompletan
kontekst, pa nastavlja izvršavanje od istog mesta kao i roditelj
fork() vraća 0 u procesu-detetu, a ID deteta (!=0) u roditelju
sistemski poziv wait() vrši sinhronizaciju procesa – proces-roditelj
čeka da se proces-dete završi da bi nastavio dalje
primer: koliko ukupno procesa kreira sledeći kod?
int pid[N];
for (int i=0; i<N; i++) {
pid[i] = fork();
}
...wait(...)...;
24/285
Operacije nad procesima

sistemski poziv execlp() zamenjuje program pozivajućeg procesa
drugim programom – učitava programski kod iz fajla u adresni
prostor procesa pozivaoca i počinje njegovo izvršavanje:
char* programName = “...”;
void main () {
int pid = fork();
if (pid<0) { // Error
printf(“Fork failed.\n”); exit(-1);
}
else if (pid==0) // Child process
execlp(programName);
else { // Parent process
wait(NULL);
printf(”Child complete.\n”);
exit(0);
}
}
25/285
Operacije nad procesima
MS Windows podržava oba načina:


roditeljski adresni prostor se klonira
roditelj specifikuje ime programa nad kojim se kreira nov proces
Gašenje procesa:



kada završi izvršavanje glavnog programa (main() u jeziku
C/C++)
kada sam proces to eksplicitno zatraži, npr. sistemski poziv exit()
jedan proces gasi (“ubija”) neki drugi proces; moguća su
ograničenja, npr. to može da uradi samo roditeljski proces; mogući
razlozi:
 potomak je iscrpeo svoje resurse
 nije više potreban
 roditelj treba da se ugasi, a OS ne dozvoljava da njegovi potomci dalje
rade (kaskadno gašenje)

OS gasi proces zbog neke nedozvoljene operacije
Primer – Unix: wait() vraća ID završenog potomka
26/285
Implementacija procesa
Trenutno se
izvršava – ima
procesor
Stanja procesa tokom životnog veka:
New
Admitted
Interrupt or
Non-blocking
system call
Ready
I/O completed or
Event occurred
Terminated
Exit
Running
Dispatch
I/O or Event wait
Blocked
Spreman na
izvršavanje, čeka
da dobije
Čeka na I/O ili događaj
(Suspended, Waiting,
Blocked)
27/285
Implementacija procesa
Kontekst procesa (process context): sve
informacije potrebne da OS nastavi izvršavanje
procesa, kao i da ga kontroliše i ugasi:







ID – interna identifikacija procesa unutar OS
kontekst procesora (PC, SP, programski dostupni registi)
memorijski parametri: veličina i pozicija dodeljenog
memorijskog bloka ili PMTP/SMTP itd.
informacije o I/O resursima: spisak otvorenih fajlova,
zauzetih resursa itd.
podaci potrebni za raspoređivanje: prioritet, dodeljeno
CPU vreme, itd.
podaci potrebni za obračunavanje
...
Struktura podataka u kojoj se čuvaju ove
informacije za svaki poces unutar OS – Process
Control Block (PCB)
PCB
ID
Processor
context
Memory
params
I/O info
Scheduling
params
Accounting
params
...
28/285
Implementacija procesa
X
running
Ready
queue
PCB2
X
ready
PCB1
PCB4
PCB5
X
Disk waiting
PCB7
Device
queue
PCB9
X
Event X waiting
PCB0
PCB3
PCB6
PCB8
Event
queue
29/285
Implementacija procesa
Promena konteksta (context switch):
Process A
Process B
Interrupt or system call
Lock
Save context to
running.PCB
Select other
running
Restore context from
running.PCB
Unlock and Return
30/285
Implementacija procesa
Promena konteksta:
PCB0
running
X
Lock
PCB1
Save context to
running.PCB
PCB2
Select other
running
ready
Kako?
Problem
raspoređivanja!
Interrupt or
System call
Restore context from
running.PCB
PCB3
Unlock and Return
X
PCB4
31/285
Implementacija procesa
Promena konteksta:
X
running
PCB31
X
ready
PCB23
PCB02
PCB40
PCB14
32/285
Implementacija procesa
Zašto su potrebne lock/unlock primitive?



Da li se sme dozvoliti da se tokom promene konteksta
prekine izvršavanje i procesor preuzme neko drugi?
Šta bi se dogodilo ako se dogodi prekid i počne da se
izvršava isti sistemski kod za preuzimanje?
Šta bi se dogodilo sa strukturama podataka OS-a?
Kako implementirati lock/unlock?


Na jednoprocesorskom sistemu, jednostavno maskirati
prekide – prekid je jedini izvor asinhronog preuzimanja
procesora!
Na multiprocesorskim sistemima, HW mora da obezbedi
odgovarajuću podršku! (Detalji kasnije)
33/285
Implementacija procesa
Promena konteksta je čist režijski trošak – sistem
ne radi ništa korisno za aplikacije? Ali koliko
“košta”?



Zavisi od procesora: šta treba sačuvati kao kontekst i
kakva je HW podrška (instrukcije, registri); primer: Sun
UltraSPARC sadrži više registarskih fajlova i instrukciju
za promenu tekućeg
Zavisi od OS: koliko informacija treba čuvati kao
kontekst procesa i šta još treba uraditi
od 1 do 1000 mikrosekundi
Kako smanjiti ove troškove? Umesto procesa na
nivou OS, kad god je moguće koristiti niti
34/285
Pojam niti
Nit (thread) predstavlja jedno izvršavanje nekog dela koda
programa unutar adresnog prostora nekog procesa
kreiranog unutar OS-a


Proces na nivou OS-a (teški proces, heavyweight process): jedno
izvršavanje jednog programa sa sopstvenim adresnim prostorom
Nit (laki proces, lightweight process): jedno izvršavanje dela koda
programa unutar adresnog prostora “okružujućeg” procesa
Više niti može biti kreirano unutar istog procesa:



svaka ima svoj tok kontrole (thread of control) – svoju poziciju
izvršavanja u programskom kodu
sve niti dele isti adresni prostor i resurse – otvorene fajlove,
globalne podatke programa
svaka ima svoje lokalne podatke za pozive potprograma
Obično se kreiraju nad pozivom jednog potprograma (i
svim ugnježdenim pozivima)
35/285
Pojam niti
Primer – Java:



Nit se kreira kao objekat klase izvedene iz bibliotečne klase
Thread
Nit se pokreće pozivom operacije start()
Telo niti (programski kod) predstavlja polimorfna operacija run()
public class UserInterface {
public int newSetting (int Dim) { ... }
...
}
public class Arm {
public void move(int dim, int pos) { ... }
}
36/285
Pojam niti
public class Control extends Thread {
private int dim;
UserInterface ui = new UserInterface();
Arm robot = new Arm();
public Control(int dimension) {
super();
dim = dimension;
}
public void run() {
int position = 0;
int setting;
while(true) {
robot.move(dim,position);
setting = ui.newSetting(dim);
position = position + setting;
}
}
}
37/285
Pojam niti
int xPlane = 0;
int yPlane = 1;
int zPlane = 2;
Control c1 = new Control(xPlane);
Control c2 = new Control(yPlane);
Control c3 = new Control(zPlane);
c1.start();
c2.start();
c3.start();
Primeri upotrebe - ista aplikacija, isti proces, isti program,
ali više uporednih aktivnosti-niti:



tekst-procesor: snima dokument u pozadini, proverava gramatiku u
pozadini, uporedo obrađuje pritiske tastera i druge akcije korisnika
Web Browser: dovlači slike ili drugi sadržaj, prikazuje dohvaćeno,
obrađuje akcije korisnika
server: po jedna nit nad istim programom za svaki zahtev klijenta
38/285
Pojam niti
Koristi:



Bolji odziv interaktivne aplikacije: duge aktivnosti se
mogu raditi “u pozadini”, a uporedo prihvatati akcije
korisnika
Deljenje resursa: niti dele memoriju (adresni prostor) i
otvorene fajlove
Ekonomičnost: kreiranje procesa, promena konteksta,
alokacija memorije i ostalih resursa je skupo; niti te
režijske troškove ili eliminišu, ili drastično smanjuju; npr.
Solaris: kreiranje 30:1, promena konteksta 5:1
39/285
Implementacija niti
Podrška nitima može biti:


na nivou korisničkog programa (user threads): niti podržava izvršno
okruženje ili biblioteka programskog jezika, OS nema koncept niti;
prednosti: efikasnost i jednostavnost
mane: kada se jedna nit blokira na sistemskom pozivu, ceo proces
se blokira
na nivou OS-a (jezgra, kernel threads): OS direktno podržava
koncept niti
Ako su podržane na oba nivoa, modeli preslikavanja:



više u jedan (many-to-one): više korisničkih implementira jedna
sistemska nit ili proces
jedan na jedan (one-to-one): jednu korisničku nit implementira
jedna sistemska nit
više u više (many-to-many): više korisničkih implementira isti ili
manji broj sistemskih niti
40/285
Implementacija niti
Niti u okviru istog procesa imaju zajedničko:



adresni prostor – globalne podatke
programski kod
resurse – fajlove i druge sistemske resurse
Niti u okviru istog procesa imaju sopstveno:


poziciju u izvršavanju – PC i trag izvršavanja – stek (SP)
podatke lokalne za potprograme – stek (SP) i
promenljive alocirane u registe
Sledi: kontekst niti svodi se na kontekst procesora
– PCB (TCB) je jednostavniji, promena konteksta
je jednostavnija
41/285
Implementacija niti
Primer niti na jeziku C++ - “Školsko jezgro”:



korisničke niti implementirane bibliotekom za dati jezik
semantika i upotreba slična nitima u Javi
može se izvršavati i bez OS-a, na “goloj” mašini
#include "kernel.h" // uključivanje deklaracija Jezgra
#include <iostream.h>
void threadBody () {
for (int i=0; i<3; i++) {
cout<<i<<"\n";
dispatch(); // Eksplicitno preuzimanje - yield
}
}
void userMain () {
Thread* t1=new Thread(threadBody);
Thread* t2=new Thread(threadBody);
t1->start();
t2->start();
dispatch();
}
42/285
Implementacija niti
Mana ovakvog “proceduralnog” stila kreiranja niti: niti nad istim kodom
(istom funkcijom) ne mogu se razlikovati jer polazna funckija nema
argumente
Moguće rešenje: omogućiti argument funkcije, ali unapred definisanog
tipa (npr. void* na strukturu argumenata). Problem: nije tipizirano i
nije u duhu OOP
Objektno rešenje – poput Jave:
class Thread {
public:
Thread ();
Thread (void (*body)());
void start ();
protected:
virtual void run () {}
};
43/285
Implementacija niti
Promena konteksta na način nezavisan od
procesora i prevodioca:




zaglavlje <setjmp.h> sadrži potrebne deklaracije
tip jmp_buf predstavlja PCB za nit (TCB), tako da
sadrži sve programski dostupne registre koje koristi dati
prevodilac na datoj mašini (obavezno PC i SP)
int setjmp(jmp_buf context): smešta kontekst
procesora u TCB dat kao argument i vraća 0
void longjmp (jmp_buf context, int value):
restaurira kontekst dat kao argument, a koji je snimljen
pomoću setjmp(); pošto se time skače unutar
setjmp(), tada setjmp() vraća vrednost value
koja mora biti !=0
44/285
Implementacija niti
Promena konteksta:
void Thread::dispatch () {
lock ();
if (setjmp(runningThread->context)==0) {
Scheduler::put(runningThread);
runningThread = Scheduler::get();
longjmp(runningThread->context,1);
} else {
unlock ();
return;
}
Problem: da li je ovaj pristup moguć kod asinhronog
preuzimanja (zbog prekida)? Šta onda?
45/285