Professional Documents
Culture Documents
KiDS 2017 Jul Odgovori
KiDS 2017 Jul Odgovori
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.
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) {};
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.
Odgovor:
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.