Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

Konkurentni i distribuirani sistemi

Odgovori julski ispitni rok 2017


1. Koliko procesora treba dodati u jednoprocesorski računar na kome se izvršava višenitni web server
(npr. Apache HTTP 2.4) koji može da prihvati maksimalno 20 istovremenih konekcija, ukoliko ga
je potrebno ubrzati za 50%? Klijenti zahtevaju isti sadržaj koji je keširan u memoriji web servera.
Odgovor:
Opisani web server je u stanju da izvršava sve niti paralelno i istovremeno, jer klijenti zahtevaju isti
sadržaj, pa je trajanje izvršavanja po konekciji približno isto. Odatle sledi da je sekvencijalni deo
izvršavanja zanemarljiv, pa je dovoljno dodati još jedan procesor da bi se postiglo traženo ubrzanje.

2. Obasniti razliku između muteksa i binarnog semafora.

Odgovor:
Osnovna razlika je u vlasništvu niti nad muteksom ili semaforom. Nit je vlasnik muteksa, što znači
da, ako ga je ona preuzela (zaključala), samo ona može da i ga oslobodi (otključa). Zbog toga se
ovaj mehanizam dobro koristi kod uzajamnog isključivanja. Semafor nema vlasnika, tj. svaka nit
može da zaključa ili otključa binarni semafor. Zbog toga se ovaj mehanizam dobro koristi u
sinhronizaciji. Binarni semafor uvek može da se koristi kao muteks, ali se to ne isplati zbog većeg
implementacionog koda, kao i zbog drugih probema koje muteks može da reši a semafor ne može
(npr. rešavanje inverzije prioriteta). Međutim, obratno ne važi - muteks nikada ne može da bude
binarni semafor.

3. Pretpostavimo da se kod nekog multiprocesorskog sistema za raspodelu opterećenja koristi algoritam


sa krađom poslova. Kada nit istroši sve poslove u lokalnom redu čekanja, ona pokušava da ukrade
posao iz reda neke druge niti. Međutim, kada niti istroše sve poslove svojih lokalnih redova, one će
se izvršavti zauvek, stalno pokušavajući da ukradu tuđe poslove, kojih nema. Kako se može rešiti
ovaj problem?

Odgovor:
Da se to ne bi dešavalo, uvešćemo barijeru sa detekcijom završetka, tako da se sve niti završe onog
trenutka kada su odradile svoje poslove. Svaka nit je ili aktivna (ima posao koji treba da izvrši) ili
je nekativna (nema poslova). Svaka neaktivna nit može da postane aktivna sve dok je neka druga
nit aktivna, jer neaktivna nit može da ukrade posao od aktivne niti. Kada sve niti postanu neaktivne,
tada nijedna nit više ne može da postane aktivna. Detekcija da je izračunavanje kao celina završeno
svodi se na određivanje da u nekom vremenskom trenutku više nema aktivnih niti.

4. Navesti prednosti softverske transakcione memorije (STM) nad hardverskim rešenjem (HTM).
Odgovor:
HTM zahteva upotrebu dodatnog hardvera, koji omogućava da keš-koherentni protokol izvršava
transakcije. STM nema nikakvih hardverskih zahteva, tj. može se implementirati na svakom
računaru.
Kod HTM, veličina transakcije ograničena je veličinom keša.Većina operativnih sistema čisti keš
kada se nit istiskuje sa procesora, tako da trajanje transakcije može da bude ograničeno dužinom
vremenskog kvantuma na određenoj platformi. Odatle sledi da je upotreba HTM najbolja kod
kratkih i malih transakcija. Softverska transakciona memorija nema ovih ograničenja.
Menadžer konflikta postoji kod STM, dok ga HTM ne poseduje, što znači da transakcije HTM
mogu da izgladnjuju jedna drugu.
Konkurentni i distribuirani sistemi
5. Koji problem može da se javi u sledećem delu kôda, gde metoda enq() koristi monitor za
signalizaciju kod upotrebe bafera u problemu proizvođač-potrošač? Kako se ovaj problem rešava?
public void enq(T x) {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[tail] = x;
if (++tail == items.length)
tail = 0;
++count;
if (count == 1) { // problem
notEmpty.signal();
}
} finally {
lock.unlock();
}
}

Odgovor:
Metoda enq() signalizira notEmpty samo ako je prva koja stavlja stavku u prazan bafer. Ukoliko
više potrošača čeka, ali se samo prvi probudi, nastaje problem propuštenog buđenja. Problem se
može rešiti na dva načina: 1) uvek signalizirati svim nitima koje čekaju na uslov, a ne samo jednoj i
2) zadati vreme čekanja (tajmaut).

6. Na sledećem listingu data je jedna implementacija ključa prema Petersonovom algoritmu. Ovaj
algoritam garantuje uzajamno isključivanje dve niti na idealnom sistemu. Koji problem može da se
javi na realnom sistemu? Kako taj problem može da se reši?
class Peterson implements Lock {
private boolean[] flag = new boolean[2];
private int turn;
public void lock() {
int i = ThreadID.get(); // dve niti (ili je 0 ili 1)
int j = 1-i;
flag[i] = true;
turn = i;
while (flag[j] && turn == i) {}; // spin
}
}

Odgovor:
Savremeni multiprocesori tipično ne obezbeđuju sekvencijalno konzistentnu memoriju, niti nužno
garantuju programski redosled između operacija čitanja-pisanja za neku nit. Prvi problem prave
kompajleri koji preuređuju instrukcije da bi poboljšali performanse.Većina programskih jezika
zadržava programski redosled za svaku pojedinačnu promenljivu, ali ne i između promenljivih.
Zbog toga je moguće da će kompajler preokrenuti redosled npr. upisivanja u flag[B] i turn od
strane niti B. Drugi problem je multiprocesorski hardver. Upisivanja u multiprocesorsku memoriju
se ne obavljaju odmah nakon zadavanja instrukcije, jer u većini programa najveći broj upisivanjana
u deljenu memoriju nema takvu potrebu. Umesto toga, na većem broju multiprocesorskih
arhitektura, stavke koje se upisuju prethodno se stavljaju u specijalni bafer (write buffer ili store
buffer), pa se zatim upisuju u memoriju po potrebi. Ukoliko je upisivanje niti A u turn zakašnjeno
zbog zadržavanja u ovom baferu, može se pojaviti u memoriji nakon što A pročta flag[B].

Rešenja ovog problema ima više, ali je kod svih osnovni cilj da se instrukcije
flag[i] = true;
turn = i;
while (flag[j] && turn == i) {};

izvršavaju u programskom redosledu.


Konkurentni i distribuirani sistemi
7. Posmatrajmo dve transakcije T1 i T2 koje se izvršavaju konkurentno sa nezaštićenim blokom U1:
// T1 // T2 // U1
r1 = u; u++; unprotected {
r2 = v; v++; r1 = x;
if (r1 != r2) { }
x = 123;
}

Na prvi pogled, bilo koji redosled serijalizacije T1 i T2 održava invarijantu u==v, tako da uslov
r1!=r2 nikada nije zadovoljen. Odatle sledi da T1 nikada ne upisuje u x, pa prema tome, nikada ne
dolazi u stanje trke sa U1 koji čita vrednost x.

Međutim, u jednoj relizaciji softverske transakcione memorije, T2 može u celosti da se izvrši


između čitanja T1 iz u i v, omogućujući da T1 upiše vrednost u x pre nego što ovaj konflikt bude
otkriven. Bez obzira na to što je menadžer konflikta prekinuo transakciju i izvršio odgovarajći roll-
back, U1 je mogao da vidi operaciju upisivanja u x.

Zbog čega nastaje i kako može da se izbegne ovakva situacija?

Odgovor:

U sistemu transakcione memorije nije dozvoljena upotreba mešavine transakcionog i


netransakcionog pristupa istim objektima. U suprotnom, može doći do stvaranja nekonzistentnih
stanja, pojave zombi transakcija, itd. Zbog toga je rešenje da U1 takođe bude transakcija.

8. Da li su preseci globalnih stanja, koji su prikazani na slici kao C1 i C2, dosledni ili nedosledni?
Obrazložiti odgovor.

Vreme
Odgovor:

Presek C1 nije dosledan jer ima jednu poruku koja počinje u budućnosti a završava se u prošlosti
(poruka od događaja e12 ka događaju e22 ). Presek C2 jeste dosledan jer nema takvih poruka.
Konkurentni i distribuirani sistemi
9. Šta je to statički a šta dinamički RMI (Remote Method Invocation)? Navesti primere.

Odgovor:
• Kada je klijent vezan na objekat, on može u svakom trenutku da pozove metode upotrebom
proksija. Ovaj RMI liči na standardni poziv udaljene procedure i naziva se statički RMI. U
statičkom RMI potrebno je poznavanje interfejsa objekata tokom razvoja aplikacije.
Primer: robject.append(x)
• Dinamički RMI dozvoljava da aplikacija vrši izbor metode čije će izvršavanje tražiti od
udaljenog objekta. Nije potrebno poznavanje interfejsa objekata tokom razvoja aplikacije.
Primer: invoke(robject, append, x). Napomena: ovde je metoda append već poznata.

10. Posmatrajmo dve vrste interakcija klijent−server između para procesa p1 i p2.
a) Upiti koji se šalju serveru i njegovi odgovori klijentu nastaju u striktno naizmeničnim
sekvencama.
b) Procesi p1 i p2 se izvršavaju tako da svaki ond njih šalje poruku onom drugom pre nego što
dobije odgovor. Dva događaja slanja poruke su konkurentna, što važi i za događaje prijema.
Koju vrstu časovnika je dovoljno koristiti u ovim situacijama da bi se pouzdano odredila
kauzalnost među događajima slanja ili među događajima prijema?

Odgovor:
a) Iako je broj procesa 2, svi događaji su striktno uređeni tako da postoji samo jedno linearno
uređenje svih događaja koje je konzistentno sa “parcijalnim” uređenjem. Pošto je dimenzija
ovog “parcijalnog uređenja” jednaka jedan, bio bi dovoljan skalarni časovnik.
b) U ovom slučaju nije dovoljno koristiti jednu celobrojnu promenljivu (skalarni časovnik).
Drugim rečima, potreban je vektorski časovnik dimenzije 2.

You might also like