Kako obezbediti isključenje istovremenog pristupa kritičnom regionu ako precesi rade asinhrono i ako ne želimo da vodimo računa o brzini njihovog rada?
a) Signalizacija (sinhronizacija)
P ::
Q ::
s11;
s21;
Čekaj na signal iz Q;
Signaliziraj P da može da nastavi;
s12;
s22;
b) Primo - predaja podataka (Producer - Consumer Relation)
P ::
Q ::
gde je:
P - proces davač (Producer),
Q - proces prijemnik (Consumer) i
b - bafer za razmenu podataka (bafer može da bude jednostruki ili višestruki)
Jednostruki bafer (Single buffer)
prostor bafera
Operacija stavljanja podataka u bafer.
Operacija uzimanja podataka iz bafera.
Višestruki bafer (Bounded Buffer) - Konačni bafer
Tehnika višestrukog bafera koristi se kod problema pristupa zajedničkoj memoriji i problema obaveštavanja.
prostor bafera
ukazatelj kraja bafera
brojac bafera
Operacija stavljanja podataka u bafer.
Operacija uzimanja podataka iz bafera.
Proces P proizvodi podatke za proces Q. P ne sme da pošalje nove podatke u bafer sve dok Q ne uzme prethodne podatke iz bafera.
P čeka da Q “isprazni” bafer.Q čeka da P “napuni” bafer.
Q treba da obavesti P da je ispraznio bafer.P treba da obavesti Q da je napunio bafer.
Ovo je problem isključenja uzajamnog pristupa kombinovan sa problemom sinhronizacije.
Arhitektonska sredstva za kontrolu pristupa kritičnom regionu
a) Zabrana prekida
P
zabrana prekida kritični region ukidanje zabrane prekida
Q
Aplikacioni programer mora da pazi da kritične regione obavezno "opkoli" parom mašinskih naredbi DISABLE/ENABLE.
1) Metod je neprihvatljiv u slučaju “dugih” kritičnih regiona (krajnje je opasno zabraniti prekide na duže vreme jer onemogućava multiprocesuiranje.)
2) Aplikacioni programer mora da se spušta na nizak jezički nivo (Assembler).
3) Metod nije dovoljan u slučaju višeprocesorskih sistema (zabrana prekida je na nivou jednog procesora.)
Čekanje u petlji (Busy Wait)
gde su:
l - logički indikator:
l = true - kritični region zauzet,
l = false - kritični region slobodan,
w1/2 - jalova naredba koja zadržava procesor za neko vreme.
P ::
Q ::
TEST-AND-SET naredba
Ova funkcija predstavlja jednu mašinsku naredbu (koja ne može da se prekine)
P ::
Q ::
U slučaju višeprocesorskog sistema (sa zajedničkom memorijom) potrebno je obezbediti isključivost istovremenog pristupa zajedničkoj memoriji. To se takođe postiže hardverski:
4) Metod čekanja u petlji dovodi do bespotrebnog “traćenja” vremena procesora (procesor bi mogao da radio nešto korisnije dok se čeka na dozvolu pristupa).
5) Varijabla l je vidljiva u aplikacionom programu, to je opasno: opterećuje aplikacionog programera. Takođe važi nedostatak 2.
6) Metod ne zadovaoljava sistem sa prijemnicom (A -> R)(Running -> Ready): Neka P ima niži prioritet od Q i neka Q prekine P u trenutku dok se nalazi u kritičnom regionu, tada će Q beskonačno čekati u petlji, a P nikada neće moći da nastavi sa radom.
Zato treba kombinovati a) i b):
P ::
Q ::
Ipak ostaju nedostaci: 1), 2), 4) i 5).
Sistemska sredstva za komunikaciju i sinhronizacija procesa
Primitivni koncepti (1970-ih godina):
a) Regioni (Regions),
b) Semafori (Semaphores),
v) Događaji (Events) i
g) Uslovi (Conditions).
Strukurni koncepti (1980-ih godina):
d) Monitori (Monitors).
a) Regioni (Regions)
Baza podataka:
jedan logički indikator:
busy = true - kritični region zauzet i
busy = false - kritični region slobodan
jedna procesna lista (B) - lista procesa koji čekaju na ulaz u kritični region.
Primitivne operacije:
Enter - zahtev za ulaz u kritični region i
Exit - izlaz iz kritičnog regiona.
Početno stanje:
busy = false i
B prazan.
Semantika primitivnih operacija:
Primena:
P ::
Q ::
gde je:
reg - ime (identifikacioni broj) objekta tipa “region” koji je dodeljen kritičnom regionu cr1 i cr2.
Ovim su uklonjeni nedostaci 1) - 6).
Aplikacioni programer je dužan da:
locira kritične regione koji imaju pristup zajedničkim podacima/resursima,
svim takvim kritičnim regionima dodeli po jedan objekat tipa “region” i
sve kritične regione opkoli odgovarajućim parom primitiva Enter/Exit.
b) Semafori (Semaphores)
(1968. G. Diijkstra “Cooperating Sequential Processes”)
Semafori su objekti operativnog sistema sa sledećim karakteristikama:
Baza podataka:
semafor varijabla (se{0, 1, 2, …, N}),
jedna procesna lista (B) - lista procesa blokiranih na semaforu).
Primitivne operacije:
P (Probeer - pokušaj) - dekrementiranje semafor varijable i
V (Verhoog - inkrementiraj) - inkremetiranje semafor varijable.
Početno stanje:
S - može da se inicijalizuje na bilo koju vrednost između 0 i N (N može da predstavlja broj jedinica nekog resursa) i
B - prazna.
Semantika P i V operacija:
P ::
V ::
Ukoliko je N = 1, tj. se {0, 1} takav semafor je binarni semafor.
Primer kritičnog regiona
P ::
Q ::
gde je:
sem - ime (identifikacioni broj) semafora koji je dodeljen kritičnom regionu. Ovde se koristi binarni semafor koji je inicijalizovan sa s = 1.
Primer signalizacije:
P ::
Q ::
Ako je proces P prvi počeo sa radom izvršiće naredbu s11 i preći će u blokirano stanje. Čekaće sve dok mu proces Q ne pošalje signal preko semafora sem.
Ovde se takođe koristi binarni semafor koji je inicijalizovan sa s = 0.
Primer primo-predaje preko jednostrukog bafera:
P ::
Q ::
gde su:
sem1 i sem2 binarni semafori inicijalizovani sa:
sem1 -> 1 i
sem2 -> 0.
Svakom jednostrukom baferu treba, u operativnom sistemu, pridružiti po 2 binarna semafora za 2 uslova:
bafer nije pun (sem1) i
bafer nije prazan (sem2)
Primer primo-predaje preko konačnog bafera
P ::
Q ::
Svakom konačnom baferu treba, u operativnom sistemu, pridružiti 3 semafora:
1 binarni semafor (mutex) za kontrolu pristupa baferu (proverava da li je kritični region zauzet) i
2 celobrojna semafora za signalizaciju:
semafor čija semafor varijabla broji prazna mesta u baferu (space) i
semafor čija semafor varijabla broji zauzeta mesta u baferu (count).
Kada vrednost varijable space padne na 0 to znači da je bafer pun i da u njega ne može da se piše. Kada vrednost varijable count padne na 0 to znači da je bafer prazan i da iz njega ne može da se čita.
Inicijalizacija semafora:
mutex -> 1,
space -> N i
count -> 0.
Za domaći: Realizovati primo-predaju konačnog bafera samo pomoću binarnih semafora, s tim da se brojač punih mesta u baferu eksplicitno pojavi u aplikacionom programu.
v) Događaji (Events)
(tehnika koja se koristi za sinhronizaciju i koordinaciju procesa u DEC-OS familiji (VMS OS) operativnih sistema)
Događaji su objekti operativnog sistema kojima se vrši:
Kontrola kritičnog regiona
Signalizacija
Baza podataka:
logički indikator događaja (eflg - Event Flag) - kada je eflg = true događaj je nastupio i proces nastavlja sa radom, u suprotnom se blokira i čeka na događaj i
jedna procesna lista (B) - lista procesa koji čekaju na događaj.
Primitivne operacije:
WAITEVENT - čekanje na događaj,
SETEVENT - signalizacija događaja i
CLREVENT - brisanje događaja.
Početno stanje:
Logička indikacija događaja eflg = false i
B prazan.
Semantika primitivnih operacija:
Ako nije nastupio događaj aktivan proces se stavlja u listu blokiranih procesa, a neki drugi proces koji je do tada bio u listi spremnih procesa se aktivira.
Primer primo-predaje preko jednostrukog bafera
Svakom jednostrukom baferu treba pridružiti po dva objekta tipa “događaj”:
empty - bafer prazan i
full - bafer pun.
P ::
Q ::
SETEVENT(empty) - signalizira se da je bafer prazan
WAITEVENT(empty) - čeka se na događaj da bafer postane prazan
CLREVENT(empty) - poništava se čekanje na događaj prazan bafer
SETEVENT(full) - signalizira se da je bafer pun
WAITEVENT(full) - čeka se na događaj da je bafer pun
CLREVENT(full) - poništava se čekanje da bafer postane pun
Generalizacija događaja (kombinovani događaji)
Konjukcija događaja: WAITAND(e1, e2, …, en)(Wait for logical AND) - čeka se na događaj koji nastupa ako se dese svi događaji e1, e2, …, en.
Disjunkcija događaja: WAITOR(e1, e2, …, en))Wait for logical OR) - čeka se da nastupi bilo koji od događaja e1, e2, …, en.
P može da pošalje u bafer podatke tek pošto svi prijemnici uzmu prethodni podatak iz bafera (B je jednostruki bafer).
P ::
Q ::
Ako jednostruki bafer ima n prijemnika potrebno je koristiti 2 x n objekta tipa “događaj”.
g) Uslovi (Conditions)
(Brinch-Hansen, Hoare, 1972.-1974.)
Uslovi su objekti operativnog sistema.
Baza podataka:
jedna procesna lista (B) - lista procesa koji čekaju na uslov.
Primitivne operacije:
WAIT - čekanje na uslov (blokiraj proces).
SIGNAL - signalizacija uslova (odblokiraj proces).
Početno stanje:
B prazna.
Semantika primitivnih operacija:
Za aplikativne programere ovo nije zgodan metod.
Monitori (strukturna sredstva)
(Brinch-Hansen, 1972.-73., Hoare, 1974.)
a) Ugnježdavanje regiona i uslova
Direktnom primenom regiona (Enter/Exit) i uslova (Wait/Signal) na konačni bafer dobija se sledeće rešenje za predajnik i prijemnik:
Rešenje 1.
P ::
Q ::
Deo koda u kome su vidljive varijable count, last i B predstavlja kritični region procesa P i Q. Oni se štite primitivama Enter i Exit.
Početne vrednosti:
count = 0,
last = 0 i
B - nedefinisano.
Konačni bafer traži 3 objekta u operativnom sistemu:
1 region (mutex) za kontrolu pristupa u kritičnom regionu,
1 uslov (nonfull) - bafer nije pun i
1 uslov (nonempty) - bafer nije prazan.
Uslovi nonfull i nonempty su lokalni za kritični region.
Rešenje 1. nije ispravno!
Operacije WAIT(nonfull) i WAIT(nonempty) ne oslobađaju kritični region. Zato treba kombinovati operacije WAIT i EXIT.
Ako je proces blokiran na operaciji WAIT protrebno je osloboditi kritični region kako bi drugi procesi mogli da pristupe u kritični region i eventualno ostvare uslov na koji čeka prvi proces.
Ukoliko je SIGNAL zadnja operacija u kritičnom regionu, a neposredno ispred operacije EXIT, moguće je kombinovati SIGNAL i EXIT kao jednu jedinstvenu operaciju.
Ovakvo kombinovanje objekata predstavlja “ugnježdavanje” regiona i uslova.
Br - lista blokiranih procesa koji čekaju dozvolu za ulazak u kritični region r i
B c - lista blokiranih procesa koji čekaju da se ostvari (signalizuje) uslov c.
P ::
Q ::
Nedostaci rešenja 2.:
zajedničke varijable count, last i B su vidljive u aplikacionom programu,
aplikacioni programer je nepotrebno opterećen mehanizmom bafer i
aplikacioni programer je prinuđen da koristi relativno veliki broj sinhronizacionih primitiva (ovde: ENTER, WAIT, SIGNAL).
Rešenje: Konačni bafer treba realizovati kao novi objekat operativnog sistema.
Baza podataka:
B - prostor za smeštanje podataka,
count - broj “porcija” podataka koje se nalaze u baferu i
last - ukazatelj kraja bafera.
Primitivne operacije:
SEND(b, x) - slanje podataka x u bafer B i
RECEIVE(b, x) - uzimanje podataka x iz bafera B.
Početno stanje:
count = 0 i
last = 0.
Semantika primitivnih operacija:
SEND(b, x) ::
RECEIVE(b, x) ::
Ako je bafer pun pozivni proces biće blokiran i čekaće sve dok se u baferu ne stvori mesto barem za jednu porciju podataka
Ako je bafer prazan pozivni proces biće blokiran i čekaće sve dok se u baferu ne pojavi barem jedna porcija podataka.
Ovakav objekat zove se monitor (monitor tipa “konačni bafer”).
Monitor je objekat sa hijerarhijskom strukturom. Njemu su podređeni objekti tipa “uslov” i objekti tipa “region”. Aplikacioni programer od monitora vidi samo primitive SEND i RECEIVE.
Primo-predaja preko monitora tipa “konačni bafer”:
P ::
Q ::
b) Opšta definicija monitora
Monitor je pasivni objekt koji objedinjuje u jednu jedinstvenu funkcionalnu celinu tri stvari:
podatke (varijable monitora),
operacije nad podacima (procedure) i
inicijalnu operaciju (inicijalni kod).
Varijable monitora:
lokalne su za monitor (nisu vidljive za druge objekte (procese i monitore)),
permanentne su za konkurentni program (punovažne su sve dok egzistira monitor),
njima mogu direktno da pristupe samo procedure monitora i
drugi objekti mogu da pristupe varijablama monitora samo preko procedura monitora.
Procedure monitora:
procesi (i drugi monitori) mogu da pristupe monitoru samo preko njegovih procedura (pristup u monitor = izvršavanje njegove procedure),
dva procesa ne mogu istovremeno da pristupe u isti monitor (mutual exclusion) i
ako je neki proces P pristupio u monitor i ako drugi proces Q želi da pristupi u isti monitor tada će proces Q biti automatski blokiran, sve dok proces P ne napusti monitor.
Inicijalni kod:
sekvencijalni program (jedna ili više naredbi) pomoću koga se definišu početne vrednosti varijabli monitora i
inicijalni kod izvršava se u trenutku uvođenja (kreiranja) monitora u konkurentni program.
v) Deklaracija monitora
Operativni sistem može u sebi da ima ugrađen određeni broj standardnih tipova monitora. Ukoliko to nije slučaj, tada monitore mora da definiše sam aplikacioni programer, kao i svaku drugu varijablu ili
proceduru. Način definicije i deklaracije monitora zavisi od jezika na kome se piše aplikacioni program. Ovde će se koristiti notacija HOARE-a, koja je predložena po uzoru na klase O.J.DAHLA (jezik SIMULA).
Zaglavlje deklaracije monitora.
Deklaracija varijabli monitora.
Deklaracija procedura (funkcija) monitora.
Inicijalni kod monitora.
gde su:
M - ime monitora,
vi - imena varijabli monitora,
ti - tipovi varijabli monitora i
pk - imena procedura monitora.
Pozivi monitorove procedure iz procesa ili nekog drugog monitora (M.pk):
P ::
Q ::
Ista notacija se koristi za poziv primitiva WAIT i SIGNAL u okviru monitorovih procedura:
C.WAIT
C.SIGNAL
gde je C ime uslova.
Uslovi koji su lokalni za monitor takođe mogu da se tretiraju kao varijable monitora (varijable tipa “condition”) - var c : condition;
Predpostavljaće se da jezgro operativnog sistema u sebi sadrži objekte tipa uslov i region (tj. da operativni sistem podržava objekte tipa monitor).
g) Primeri primene monitora
Konačni bafer
Resursni monitor
Dinamička alokacija prostora
Primo-predaja velikih količina podataka
Ukoliko se razmenjuju veće količine podataka (datotetke za pseudo U/I, itd.) tada konačni bafer, postaje neracionalan. Treba omogućiti da predajnik i prijemnik istovremeno vrše prenos podataka.
Konačni bafer služi za prenos adrese podataka, a podaci se razmenjuju preko blokova iz POOL-a.
Traži i rezerviše blok. I nakon što napuni blok javlja procesu Q da je dobio podatke (tj. šalje mu adresu bloka u kome su podaci.)
Uzima adresu bloka. I nakon što isprazni blok oslobađa prostor (vraća blok u POOL)
Jedan alokator može da opslužuje veći broj primo-predajnih parova (information stream).
Da li FIFO strategija dodele prostora (objekat tipa uslov monitora A) zadovaoljava u slučaju da se brzine primo-predajnih parova znatno razlikuju?
Ovaj problem zahteva generalizaciju objekta tipa “uslov”: uvođenje priorioteta c.wait(p).
Sistem za rezervaciju karata
L letova. Svakom letu odgovara slog u datoteci letova. W1 , W2 , …, Wm su procesi koji ažuriraju slogove letova (WRITERS), a R1 , R2 , …, RM su procesi koji samo čitaju slogove letova (READERS).
Da bi se izbegla zbrka neophodno je uvesti kontrolu pristupa datoteci letova. Usvajaju se sledeća pravila:
novi R ne može da započne čitanje ako neki W vrši ažuriranje ili ako neki W čeka na pristup slogu leta i
svi R koji čekaju kraj ažuriranja sloga leta imaju prvenstvo nad sledećim W koji želi da ažurira isti slog leta.
Rešenje: Svakom slogu leta dodeljuje se po jedan monitor istog tipa sa 4 procedure:
startw - hoću da ažuriram,
endw - završio sam ažuriranje,
startr - hoću da čitam i
endr - završio sam čitanje.
Wi ::
Rj ::
Za ovaj problem potrebno je objekte tipa “uslov” proširiti sa još jednom
primitvnom operacijom - c.empty, gde je:
c - ime uslova,
empty - funkcija koja vraća vrednost true ako u listi blokiranih procesa koji čekaju na uslov c nema niti jedan proces (lista prazna). Ako čeka barem jedan proces (lista nije prazna) tada empty vraća vrednost false.