13.07.2015 Views

5. Predavanje - VTS NS

5. Predavanje - VTS NS

5. Predavanje - VTS NS

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

V Sinhronizacija i kominikacijaizmeđu procesaUvodMonitoriRazmena porukaPriključnice (sockets)Poziv udaljene procedure (RPC)1


UvodModeli međuprocesne komunikacije (Inter ProcessCommunication, IPC):• deljena promenljiva (shared variable): objekat kome može pristupativiše procesa; komunikacija se obavlja razmenom informacija prekodeljene promenljive ili deljenih podataka (shared data)• razmena poruka (message passing): eksplicitna razmena informacijaizmeđu procesa u vidu poruka koje putuju od jednog do drugogprocesa preko nekog posrednikaModel komunikacije je stvar izbora – ne implicira načinimplementacije:• deljene promenljive je lako implementirati na multiprocesorima sazajedničkom memorijom, ali se mogu (teže) implementirati i nadistribuiranim sistemima• razmena poruka se može implementirati i na distribuiranimsistemima i na multiprocesorima sa deljenom memorijom• ista aplikacija se može isprogramirati korišćenjem oba modela, ali jepo pravilu neki model pogodniji za neku vrstu aplikacije2/285


UvodImplementacija komunikacije pomoću deljene promenljive nasistemu za deljenom memorijom, ali sa procesima kojinemaju isti adresni prostor:Process AShared MemProcess BKernelSistemska usluga(poziv): obezbeditipreslikavanje delaadresnog prostoradva procesa u istudeljenu memoriju3/285


UvodImplementacija komunikacije razmenom poruka:Na istom računaru:Process AMSistemskausluga (poziv):slanje porukeProcess BMKernelMSistemskausluga (poziv):prijem poruke4/285


UvodImplementacija komunikacije razmenom poruka:Na distribuiranom sistemu:MSistemskausluga (poziv):slanje porukeProcess ASistemskausluga (poziv):prijem porukeProcess BMKernelMKomunikacionamrežaMKernel5/285


MonitoriLoše strane semafora:• suviše jednostavan koncept niskog nivoa – nije logički povezan sakonceptima bližim domenu problema (resurs, kritična sekcija, ...)• kod složenijih programa lako postaje glomazan, nepregledan, težakza razumevanje, proveru i održavanje, jer su operacije nadsemaforima rasute• podložan je greškama – mora se paziti na uparenost i redosledoperacija wait i signalprocess P1; process P2;wait(S1);wait(S2);wait(S2);wait(S1);... ...signal(S2);signal(S1);signal(S1);signal(S2);end P1; end P2;6/285


MonitoriMonitor (monitor) je:• apstraktni tip podataka koji grupiše strukturu (podatke,promenljive) i ponašanje (operacije, procedure nad tim podacima)• podrazumevano enkapsulira (sakriva kao privatne) svoje podatke, aotkriva (kao interfejs) svoje operacije (procedure)• operacije (procedure) su podrazumevano međusobno isključiveAutori: Dijkstra (1968), Brinch-Hansen (1973) i Hoare(1974)Jezici koji podržavaju monitore: Modula 1,Concurrent Pascal, Mesa, Ada, Java, C#7/285


MonitoriPrimer: ograničeni bafer (bounded buffer)monitor buffer;export append, take;var ... (* Declaration of necessary variables *)procedure append (i : integer);...end;procedure take (var i : integer);...end;begin... (* Initialization of monitor variables *)end;8/285


MonitoriUslovna sinhronizacija u monitorima (Hoare, 1974)- uslovna promenljiva (condition variable) ječlan(promenljiva unutar) monitora sa dve operacije:• wait: proces koji je izvršio wait se (bezuslovno)suspenduje (blokira) i smešta u red čekanja pridruženovoj uslovnoj promenljivoj; proces potom oslobađa svojekskluzivni pristup monitoru i time dozvoljava da drugiproces uđe u monitor;• signal: kada neki proces izvrši ovu operaciju, sa redablokiranih procesa na ovoj uslovnoj promenljivojoslobađa se (deblokira) jedan proces, ako takvog ima;ako takvog procesa nema, onda ova operacija nemanikakvog efekta9/285


MonitoriPrimer: ograničeni bafer (bounded buffer)monitor buffer;export append, take;varbuf : array[0..size-1] of integer;top, base : 0..size-1;numberInBuffer : integer;spaceAvailable, itemAvailable : condition;procedure append (i : integer);beginwhile numberInBuffer = size dowait(spaceAvailable);end while;buf[top] := i;numberInBuffer := numberInBuffer+1;top := (top+1) mod size;signal(itemAvailable);end append;10/285


MonitoriPrimer: ograničeni bafer (bounded buffer), nastavakprocedure take (var i : integer);beginwhile numberInBuffer = 0 dowait(itemAvailable);end while;i := buf[base];base := (base+1) mod size;numberInBuffer := numberInBuffer-1;signal(spaceAvailable);end take;begin (* Initialization *)numberInBuffer := 0;top := 0; base := 0end;11/285


MonitoriRazlike između operacija wait i signal na semaforu i nauslovnoj promenljivoj:• Operacija wait na uslovnoj promenljivoj uvek blokira proces, zarazliku od operacije wait na semaforu• Operacija signal na uslovnoj promenljivoj nema efekta na tupromenljivu ukoliko na njoj nema blokiranih procesa, za razliku odoperacije signal na semaforuŠta se dešava kada se operacijom signal deblokira nekiproces - tada postoje dva procesa koja konkurišu zapristup monitoru (onaj koji je izvršio signal i onaj koji jedeblokiran), pri čemu ne smeju oba nastaviti izvršavanje?12/285


MonitoriRazličite varijante definisane semantike operacije signalkoje ovo rešavaju:• Operacija signal je dozvoljena samo ako je poslednja akcijaprocesa pre napuštanja monitora (kao u primeru ograničenogbafera)• Operacija signal ima sporedni efekat izlaska procesa iz proceduremonitora (implicitni return) - proces nasilno napušta monitor• Operacija signal koja deblokira drugi proces implicitno blokiraproces koji je izvršio signal, tako da on može da nastaviizvršavanje tek kada monitor postane slobodan; procesi koji sublokirani na ovaj način imaju prednost u odnosu na drugeprocese koji tek žele da uđu u monitor spolja• Operacija signal koja deblokira drugi proces ne blokira proceskoji je izvršio signal, ali deblokirani proces može da nastaviizvršavanje tek kada proces koji je izvršio signal napusti monitor13/285


MonitoriJedan od osnovnih problema vezanih za monitore: kakorazrešiti situaciju kada se proces koji je napravio ugnežđenipoziv operacije drugog monitora iz operacije jednogmonitora suspenduje unutar tog drugog monitora?Zbog semantike wait operacije, pristup drugom monitorubiće oslobođen, ali neće biti oslobođen pristup monitoru izkoga je napravljen ugnežđeni poziv. Tako će procesi kojipokušavaju da uđu u taj monitor biti blokirani, štosmanjuje konkurentnostMogući pristupi:• Spoljašnji monitor se drži zaključanim (Java, POSIX, Mesa)• Potpuno se zabranjuje ugnežđivanje poziva operacija monitora(Modula-1)• Obezbediti konstrukte kojima bi se definisalo koji monitori seoslobađaju u slučaju blokiranja na uslovnoj promenljivoj uugnežđenom pozivu14/285


MonitoriImplementacija monitora na jeziku C++ pomoću semafora:class Monitor {public:Monitor () : sem(1) {}void criticalSection ();private:Semaphore sem;};void Monitor::criticalSection () {sem.wait();//... telo kritične sekcijesem.signal();}15/285


MonitoriKako rešiti slučaj izlaska iz sredine operacije (sa return ili uslučaju izuzetka)?int Monitor::criticalSection () {sem.wait();return f()+2/x; // gde pozvati signal()?}Rešenje:class Mutex {public:Mutex (Semaphore* s) : sem(s){ if (sem) sem->wait(); }~Mutex () { if (sem) sem->signal(); }private:Semaphore *sem;};void Monitor::criticalSection () {Mutex dummy(&sem);//... telo kritične sekcije}16/285


Razmena porukaRazmena poruka (message passing) podrazumevakorišćenje jedinstvenog konstrukta i za sinhronizaciju i zakomunikaciju između procesaOsnovna ideja: jedan proces šalje poruku, a neki proces(i)prima(ju) porukuVarijacije u pogledu:• modela sinhronizacije• načina imenovanja• strukture poruke17/285


Razmena poruka: SinhronizacijaImplicitna sinhronizacija: primalac ne može da primiporuku pre nego što je pošiljalac poslao poruku (uporeditisa čitanjem i pisanjem deljene promenljive)Tipovi:• asinhrono ili bezčekanja/blokiranja(asynchronous, no-wait, nonblocking):pošiljalac nastavljasvoje izvršavanje odmah posleslanja poruke, bez čekanja daporuka bude primljena. Nekiprogramski jezici (npr. CONIC) iPOSIX. Analogija: slanje pisamaobičnom poštomSenderProcessSend MsgMsgReceiverProcessReceive Msg18/285


Razmena poruka: SinhronizacijaAsinhrono slanje podrazumeva postojanje bafera nenulte i teorijskineograničene veličine. Problem: baferi su uvek fizički ograničeni• sinhrono ili randevu (synchronous, rendez-vous): pošiljalac seblokira sve dok poruka nije primljena i tek tada nastavlja svojeizvršavanje. Neki programski jezici (npr. CSP i occam2). Ekv.asinhronom slanju sa baferima veličine 0. Analogija: telefonskipozivSenderProcessReceiverProcessSend MsgMsgReceive Msg19/285


Razmena poruka: Sinhronizacija• Poziv udaljene procedure ili prošireni randevu (remote procedurecall, RPC,extended rendez-vous): pošiljalac nastavlja izvršavanjetek kada je primalac obradio poruku i poslao odgovor. Neki jezici(npr. Ada, SR, CONIC) i neki operativni sistemiSenderProcessReceiverProcessSend MsgMsgReceive MsgSend ReplyReply20/285


Razmena poruka: SinhronizacijaVeze između ovih modela:• realizacija sinhrone pomoću asinhrone komunikacije:Sender process P1: Receiver process P2:async_send(msg);receive(msg);receive(ack);async_send(ack);• realizacija RPC pomoću sinhrone komunikacije:Sender process P1: Receiver process P2:sync_send(msg);receive(msg);receive(reply);construct reply;sync_send(reply);Sinhroni prijem: receive blokira primaoca dok poruka nestigneAsinhroni prijem: receive vraća poruku ako je ona utrenutku poziva već stigla, inače vraća null21/285


Razmena poruka: ImenovanjeDirektno imenovanje: proces direktno imenuje sagovornikasend(P2,msg); receive(P1,msg);Prednost: jednostavnost. Nedostatak: smanjena fleksibilnost- hardcoded namingIndirektno imenovanje: postoji međumedijum za prenosporuka između procesa; procesi imenuju ovaj medijum, a nesamog sagovornikaMedijumi: kanal (channel), poštansko sanduče (mailbox),veza (link), cevovod (pipe), vrata (port), priključnica (socket)P1 MB P2 P1P2Primer: poštansko sandučesend(msgBox,message); receive(msgBox,message);22/285


Razmena poruka: ImenovanjePrednost indirektnog imenovanja: veća fleksibilnost(nezavisnost učesnika od imenovanja) i bolja enkapsulacijaSimetrično imenovanje: sagovornici na isti način imenujujedan drugog; tipično: primalac imenuje pošiljaoca od kogaželi da primi poruku:send(P2,msg);receive(P1,msg);send(MBX,msg);receive(MBX,msg);Asimetrično imenovanje: pošiljalac imenuje primaoca,primalac ne imenuje izvor poruke (prima poruku od bilokoga); odnos klijent/server:send(P2,msg);receive(msg);send(MBX,msg);receive(msg);23/285


Razmena poruka: ImenovanjeFleksibilnost kod indirektnog imenovanja:P1P2P1P2P2 P2P1 P1P1P2P1P2P1P2P1 P1P1P2P2 P224/285


Razmena poruka: Struktura porukeOperativni sistemi uglavnom podržavaju prenos samonestrukturiranog niza bajtova određene dužine; korisničkiprocesi moraju da izgrade strukturu nad tim nizom bajtovaKada se poruka prenosi na drugi računar preko mreže,potrebno je izvršiti:• serijalizaciju: pretvaranje strukture podataka iz izvornogprogramskog jezika i adresnog prostora pošiljaoca u prosti nizbajtova za prenos, na strani pošiljaoca – marshalling• deserijalizaciju: pretvaranje prostog niza bajtova iz prenosnogbafera u strukturu podataka programskog jezika na strani primaoca– unmarshallingProblem kod prenosa strukturiranih podataka: mašinskakompatibilnost tipova podataka na različitim platformamaPristup rešavanju: konverzija u mašinski nezavisan format(niz znakova, npr. XML)25/285


PriključniceKoncept komunikacije preko priključnica (socket):• indirektno, simetrično imenovanje• asinhrono slanje, sinhroni prijemClientIP = 147.91.1.41Port1625InternetPort80Web ServerIP= 217.169.211.12226/285


PriključniceServerski proces koji se ne završava, već neprestano radi“u pozadini” (demonski proces, daemon), stalno“osluškuje” zahteve za uspostavljanjem komunikacije nasvojoj priključnici (“osluškivač”, listener)Portovi ispod 1024 su poznati, jer ih koriste standardniInternet servisi (telnet, ftp, http, ...)Korišćenjem API za određeni programski jezik (C, Java, ...),serverski proces može da:• kreira svoju priključnicu na zadatom portu, na kojoj će da primazahteve od klijenata• prihvati zahtev od klijenta i identifikuje njegovu priključnicu prekokoje je ovaj uspostavio vezu• komunicira preko klijentske priključnice• raskine vezu sa klijentom27/285


PriključniceKorišćenjem API za određeni programski jezik (C, Java, ...),klijentski proces može da:• kreira svoju priključnicu povezanu na zadatu serversku priključnicu(IP:port); za novu priključnicu OS odvaja uvek novi, jedinstveniport na klijentu >1024• komunicira preko svoje priključnice sa serverom• raskine vezu sa serveromServer Socket147.91.1.41:6013Client ProcessClient SocketServer ProcessCreate new socketand link it with147.91.1.41:6013Socket28/285


PriključnicePrimer (Java): serverimport java.net.*;import java.io.*;public class DateServer {public static void main (String[] args) {try {ServerSocket sock = new ServerSocket(6013);while (true) {Socket client = sock.accept(); // BlockingPrintWriter pout = newPrintWriter(client.getOutputStream(),true);pout.println(new java.util.Date().toString());client.close();}}catch (IOException ioe) {System.err.println(ioe);}}}29/285


PriključnicePrimer (Java): klijentimport java.net.*;import java.io.*;public class DateClient {public static void main (String[] args) {try {Socket sock = new Socket(“147.91.1.41”,6013);InputStream in = sock.getInputStream();BufferedReader bin = newBufferedReader(new InputStreamReader(in));String line;while ((line=bin.readLine()) != null)System.out.println(line);sock.close();}catch (IOException ioe) {System.err.println(ioe);}}}30/285


Poziv udaljene procedurePriključnice (socket) su efikasan i jednostavan koncept, alina suviše niskom nivou apstrakcije i zahtevaju mnogokodovanjaKoncept višeg nivoa apstrakcije: poziv udaljene procedure(remote procedure call, RPC)Ideja: obezbediti mehanizam da klijentski proces pozivaproceduru čiji se kod nalazi i izvršava na udaljenomračunaru, transparentno, na način kao da je obična(lokalna) proceduraRPC je mehanizam višeg nivoa koji se izgrađuje nakomunikacionim mehanizmima nižeg nivoa: priključnice(socket), klijentski i demonski (daemon) serverski procesiRPC obezbeđuje komunikaciju sa strukturiranim porukama– argumenti poziva procedure i povratni rezultat31/285


Poziv udaljene procedureClient processcall proc(args)ClientStub proc(args)DaemonServerproc(args)marshal argssend msg to server:RPC proc, argsunmarshal argscall proc(args)marshal resultunmarshal resultsend msg to slient:RPC ACK resultreturn result32/285


Poziv udaljene procedureProblem: obezbediti semantiku “tačno jednog” poziva, kaokod lokalne procedure:• otpornost na izgubljene poruke:• poruke za povratnu potvrdu prijema – “povratnice” (acknowledgement,ACK); šta raditi ako se izgubi povratnica?• vremenska kontrola čekanja na povratnicu; šta ako istekne vremenskakontrola?• ponavljanje poruke u slučaju isteka vremenske kontrole• otpornost na višestruke poruke: “vremenski pečati” (time stamp) uzporuke – server čuva istoriju poruka koje je već obradio i odbacujeponovljene porukeProblem: kompatibilnost mašinskog formata tipovapodataka na različitim platformama. Pristup rešavanju:konverzije u mašinski nezavisne prenosne formate33/285


Poziv udaljene procedureProblem: kako učiniti fleksibilnim vezivanje procedura uportove za komunikaciju?Pristup rešavanju:• server prima RPC zahteve na uvek istom portu (gde osluškujedemonski proces), statički definisanom; klijent šalje zahtev za RPCna taj port sa identifikacijom procedure• za svaki primljeni zahtev na ovom portu, server dinamičkipreslikava (vezuje) dati poziv procedure za svoj poseban portodvojen za tu proceduru i šalje klijentu odgovor sa brojem togporta• klijent otvara novu konekciju sa serverom na dobijenom portu• klijent šalje RPC zahtev na taj port; RPC se obavlja na tom paruportova34/285


Sinhronizacija i komunikacijaizmeđu procesaKooperativni procesiMehanizmi interakcijeMeđusobno isključenjeUslovna sinhronizacijaUposleno čekanjeSemaforiImplementacija semaforaUpotreba semafora35


Kooperativni procesiProcesi mogu biti međusobno• nezavisni, izolovani: nema interakcije niti razmene informacijaizmeđu njih, procesi se izvršavaju uporedo i nezavisno• kooperativni: procesi moraju da razmenjuju informacije ili da semeđusobno sinhronizuju - dele stanje (podatke)Međutim: u multiprocesnom OS izolovanih procesapraktično nema – svi oni dele resurse sistema (memoriju,fajlove, I/O uređaje)Čemu kooperativni procesi?• smanjiti troškove deobom resursa (jedan računar, više poslova;jedan autoput, mnogo vozila; jedna učionica, mnogo časova)• procesi zahtevaju informacije od drugih procesa da bi izvršili svojzadatak;• Zašto se uopšte dele na odvojene procese? - Modularnost• Zašto da se izvršavaju konkurentno? – Povećanje efikasnosti36/285


Kooperativni procesiPrimeri:• editor, prevodilac i linker:Y.objEditor X.cpp Compiler X.obj Linker• Web server:Z.objClient ProcessClient ProcessClient ProcessServer ProcessServer ProcessServer ProcessHTMLFiles• korisnički proces i proces koji upravlja nekim izlaznimuređajem:User ProcessBufferDevice DriverDevice37/285


Kooperativni procesiProblem proizvođač-potrošač (producer-consumer):• bez baferaproduceconsumeProduceracceptConsumerProblem: nepotrebna sekvencijalizacija (naizmeničnost),smanjena konkurentnost• sa baferomproduceconsumeProduceracceptBuffertakeConsumer38/285


Kooperativni procesiOgraničeni bafer (bounded buffer):tailconst int N = ...; // Capacity of the bufferclass Data;class BoundedBuffer {public:BoundedBuffer ();void append (Data*);Data* take ();private:Data* buffer[N];int head, tail, count;};head39/285


Kooperativni procesiBoundedBuffer::BoundedBuffer (): head(0), tail(0), count(0) {}void BoundedBuffer::append (Data* d) {while (count==N);buffer[tail] = d;tail = (tail+1)%N;count++;}Data* BoundedBuffer::take () {while (count==0);Data* d = buffer[head];head = (head+1)%N;count--;return d;}40/285


Kooperativni procesiMeđutim, konkurentnost i deljenje resursa uzrokujuprobleme; primeri: jedna saobraćajna traka-vozila koja iduu susretNezavisni procesi: rezultat izvršavanja procesa ne zavisi odredosleda izvršavanja i preplitanja sa drugim nezavisnimprocesima – ne zavisi od raspoređivanjaProcesi koji dele podatke: rezultat izvršavanja zavisi odredosleda izvršavanja i preplitanja – zavisi odraspoređivanja. Problemi: rezultat je nedeterminisan,uočavanje i ispravljanje grešaka veoma teško, jer su onečesto nereproducibilneOsnovni postulat konkurentnog programiranja: rezultat(logička ispravnost) programa ne sme da zavisi odredosleda izvršavanja i preplitanja, tj. od raspoređivanja41/285


Mehanizmi interakcijeVrste interakcija između procesa:• sinhronizacija (synchronization): zadovoljavanje ograničenja upogledu preplitanja akcija različitih procesa (npr. neka akcijajednog procesa mora da se dogodi pre neke akcije drugog procesai sl.); simultano dovođenje više procesa u predefinisano stanje• komunikacija (communication): razmena informacija izmeđuprocesaOvi pojmovi su povezani jer:• neki mehanizmi komunikacije podrazumevaju prethodnusinhronizaciju• sinhronizacija se može smatrati komunikacijom bez razmenesadržaja42/285


Mehanizmi interakcijeModeli međuprocesne komunikacije procesa (Inter ProcessCommunication, IPC):• deljena promenljiva (shared variable): objekat kome može pristupativiše procesa; komunikacija se obavlja razmenom informacija prekodeljene promenljive ili deljenih podataka (shared data)• razmena poruka (message passing): eksplicitna razmena informacijaizmeđu procesa u vidu poruka koje putuju od jednog do drugogprocesa preko nekog posrednikaModel komunikacije je stvar izbora – ne implicira načinimplementacije:• deljene promenljive je lako implementirati na multiprocesorima sazajedničkom memorijom, ali se mogu (teže) implementirati i nadistribuiranim sistemima• razmena poruka se može implementirati i na distribuiranim sistemimai na multiprocesorima sa deljenom memorijom• ista aplikacija se može isprogramirati korišćenjem oba modela, ali jepo pravilu neki model pogodniji za neku vrstu aplikacije43/285


Mehanizmi interakcijeImplementacija na sistemu za deljenom memorijom, ali saprocesima koji nemaju isti adresni prostor – IPC kao uslugaOS-a:Process AShared MemProcess BSistemskausluga (poziv):slanje porukeSistemskausluga (poziv):prijem porukeProcess AProcess BMMKernelSistemska usluga(poziv): obezbeditipreslikavanje delaadresnog prostoradva procesa u istudeljenu memorijuKernelM44/285


Međusobno isključenjePrimer 1: Šta se dešava ako dva procesa pristupaju uporedo istojdeljenoj promenljivoj x?x:=x+1Na većini procesora, ova naredba biće prevedena u (neatomičnu)sekvencu (atomičnih) instrukcija:load reg with xincrement regstore reg to xAko je x incijalno bilo 0, koji su mogući rezultati?Slučaj 1: Slučaj 2: ...P1 P2 P1 P2load x(0)load x(0)load x(0)incinc inc store x(1)store x(1)load x(0)store x(1) ...x=1 x=245/285


Međusobno isključenjePrimer 2: Policijski helikopter prati kriminalca-begunca i navodipolicijski automobil koji ga juritype Coord = record {x : integer;y : integer;};var sharedCoord : Coord;process Helicoptervar nextCoord : Coord;beginloopcomputeNextCoord(nextCoord);sharedCoord := nextCoord;end;end;process PoliceCarbeginloopmoveTo(sharedCoord);end;end;46/285


Međusobno isključenjeProces Helicopterupisuje usharedCoord:Vrednost usharedCoord:0,0x:=1 1,0y:=1 1,11,1 x=11,1 y=1x:=2 2,1y:=2 2,22,2 x=22,2 y=2x:=3 3,23,2 x=33,2 y=2y:=3 3,3Proces PoliceCarčita iz sharedCoord:Rezultat: kriminalac beži, iako ga helikopter dobro prati!47/285


Međusobno isključenjePrimer 3: Ograničeni bafer. Šta se može desiti ako dvaprocesa-proizvođača uporedo pozivaju append?Deo koda (sekvenca naredbi) procesa koji se moraizvršavati nedeljivo (indivisible) u odnosu na druge takvedelove koda drugih procesa naziva se kritična sekcija(critical section)Sinhronizacija koja je neophodna da bi se obezbedilaatomičnost izvršavanja kritičnih sekcija naziva semeđusobno isključenje (mutual exclusion, Dijkstra 196<strong>5.</strong>)Pretpostavlja se da je atomičnost operacije dodelevrednosti skalarnoj promenljivoj obezbeđena na nivouupisa u memoriju (instrukcija upisa vrednosti u skalarnupromenljivu je atomična)48/285


Uslovna sinhronizacijaUslovna sinhronizacija (condition synchronization):jedan proces želi da izvrši akciju koja ima smisla ilije sigurna samo ako je neki drugi proces preduzeoneku svoju akciju ili se nalazi u nekomdefinisanom stanjuUslovna sinhronizacija kod ograničenog bafera:• proizvođač ne sme da stavi podatak u bafer ukoliko jebafer pun• potrošač ne može da uzme podatak iz bafera ukoliko jebafer prazanZaključak: implementacija ograničenog baferatreba da obezbedi i međusobno isključenje iuslovnu sinhronizaciju49/285


Uposleno čekanjeUslovna sinhronizacija – opšti slučaj:process P1;(*Waiting*) process P2;(*Signalling*)beginbegin... ...while flag = false do flag:=true;null ...end; end P2;...end P1;Uslovna sinhronizacija – ograničeni bafer:void BoundedBuffer::append (Data* d) {while (count==N); // Waitbuffer[tail] = d;tail = (tail+1)%N;count++; // Signal}50/285


Uposleno čekanjeOvakva realizacija, gde proces koji čeka izvršava praznupetlju dok uslov nastavka ne bude zadovoljen, naziva seuposleno čekanje (busy waiting)Očigledan veliki nedostatak: proces koji uposleno čeka trošiprocesorsko vreme na “jalove” instrukcije, ne radeći ništakorisnoUslovna sinhronizacija je jednostavna, ali šta je sameđusobnim isključenjem?51/285


Uposleno čekanjePokušaj rešenja 1:process P1beginloopflag1 := true; (* Announce intent to enter *)while flag2 = true do null end; (* Busy wait *) (* Critical section *)flag1 := false; (* Exit protocol *)endend P1;Problem: živo blokiranje (livelock)process P2beginloopflag2 := true; (* Announce intent to enter *)while flag1 = true do null end; (* Busy wait *) (* Critical section *)flag2 := false; (* Exit protocol *)endend P2;52/285


Uposleno čekanjePokušaj rešenja 2:process P1beginloopwhile flag2 = true do null end; (* Busy wait *)flag1 := true; (* Critical section *)flag1 := false; (* Exit protocol *)endend P1;process P2beginloopProblem: ne obezbeđuje međusobnoisključenje zbog utrkivanja (racecondition)while flag1 = true do null end; (* Busy wait *)flag2 := true; (* Critical section *)flag2 := false; (* Exit protocol *)endend P2;53/285


Uposleno čekanjePokušaj rešenja 3:process P1beginloopwhile turn = 2 do null end; (* Busy wait *) (* Critical section *)turn := 2; (* Exit protocol *)endend P1;Problem: suvišna sekvencijalizacija(naizmeničnost) – slaba konkurentnostprocess P2beginloopwhile turn = 1 do null end; (* Busy wait *) (* Critical section *)turn := 1; (* Exit protocol *)endend P2;54/285


Uposleno čekanjeRešenje (Peterson 1981.):process P1beginloopflag1:=true; turn:=2; (* Announce intent to entry *)while flag2 and turn=2 do null end; (* Busy wait *) (* Critical section *)flag1 := false; (* Exit protocol *)endend P1;process P2beginloopflag2:=true; turn:=1; (* Announce intent to entry *)while flag1 and turn=1 do null end; (* Busy wait *) (* Critical section *)flag1 := false; (* Exit protocol *)endend P2;Problemi:neefikasnostsloženost, posebno za opšti slučaj višeprocesa55/285


SemaforiJednostavan koncept i mehanizam za programiranjemeđusobnog isključenja i uslovne sinhronizacije (Dijkstra1968.)Semafor je celobrojna nenegativna promenljiva nad kojomse, osim inicijalizacije, mogu vršiti samo dve operacije:• wait(S): (Dijkstra je originalno zvao P) Ako je vrednost semaforaSveća od nule, ta vrednost se umanjuje za jedan; u suprotnom,proces mora da čeka sve dok S ne postane veće od nule, a tada sevrednost takođe umanjuje za jedan• signal(S): (Dijkstra je originalno zvao V) Vrednost semafora seuvećava za jedanOperacije wait i signal su atomične – atomičnostimplicitno obezbeđuje implementacija => procesi kojiizvršavaju ove operacije ne interaguju56/285


Implementacija semaforaKada je vrednost semafora nula, proces koji je izvršio operacijuwait() treba da čeka da neki drugi proces izvrši operaciju signal().Kako ovo realizovati?• Uposlenim čekanjem? – Može, ali je neefikasno• Blokiranjem (ili suspenzijom, engl. blocking, suspension): PCB procesa zakoji nije zadovoljen uslov nastavka izvršavanja ne vraća se u red spremnih,već u red čekanja na semaforu – ne troši procesorsko vreme naizvršavanje sve dok uslov ne bude zadovoljenMoguća implementacija semafora:1) val>0: još val procesa može da izvrši operaciju wait a da se neblokira, nema procesa blokiranih na semaforu;2) val=0: nema blokiranih na semaforu, ali će se proces koji naredniizvrši wait blokirati;3) val


Implementacija semaforaprocedure wait(S)val:=val-1;if val


Implementacija semafora1: Proces gubi procesor, ali ostaje spreman:• eksplicitno sam zatražio preuzimanje (dispatch, yield)• isteklo dodeljeno CPU vreme (time exceeded)• preuzimanje jer je postao spreman neki drugi proces(preemption)• izvršio neblokirajući sistemski poziv2: Izabrani proces dobija procesor (raspoređivanje,scheduling)3: Proces gubi procesor i blokira se:• izvršio blokirajući sistemski poziv• zatražio I/O operaciju• suspendovao se na zadato vreme4: Proces se deblokira:• running proces je izvršio signal• završena I/O operacija• isteklo vreme suspenzijeReady1BlockedRunning24 359/285


Implementacija semaforaOperacije wait i signal treba da budu atomične – kritičnesekcije. Kako obezbediti međusobno isključenje?• Upotrebiti prikazano rešenje sa uposlenim čekanjem? – Moguće, alikako realizovati algoritam za nepoznat broj procesa?• Atomičnost (međusobno isključenje) na višem nivou mora da serealizuje konceptom nižeg nivoa koji obezbeđuje atomičnost –atomičnost se ne može stvoriti “ni iz čega”• Mora postojati podrška hardvera!void Semaphore::wait () {lock();if (--val


Implementacija semaforaImplementacija lock/unlock na jednoprocesorskomsistemu:1. Zabraniti (maskirati) prekide:• Prednost: radi, i to jednostavno i efikasno• Nedostatak (u opštem slučaju): prekide treba što manjemaskirati, jer je sistem “neosetljiv, mrtav”, dok su prekidimaskirani – ne reaguje na spoljašnje pobude; u slučaju otkaza ilibeskonačnog izvršavanja, sistem ostaje “hiberniran”; ovde jepogodnost to što je kod operacija wait i signal:• pod kontrolom OS (nema grešaka, nema otkaza)• konačnog, predvidivog i kratkog trajanja2. Zabraniti preuzimanje: prekidi su dozvoljeni, ali nijedozvoljeno preuzimanje; ako se dogodi prekid, samozabeležiti to za kasniju obradu, ne započinjatipreuzimanje, već se samo vratiti61/285


Implementacija semaforaImplementacija lock/unlock na multiprocesorskomsistemu: HW mora da obezbedi instrukciju zapodršku, npr.:1. Test-And-Set: atomična instrukcija koja postavljavrednost bita u zajedničkoj memoriji na 1, a vraćaprethodnu vrednost; atomičnost se obezbeđujehardverski, npr. zauzimanjem magistrale tokom celeinstrukcije:lock (L):while (test_and_set(L)) do null;unlock (L):L:=0;Uposleno čekanje? – Da, ali:• kod je pod kontrolom OS (nema grešaka, nema otkaza)• konačnog, predvidivog i kratkog trajanja62/285


Implementacija semafora2. Swap: atomična zamena vrednosti registra i memorijske lokacije;sličan mehanizam kao i Test-And-SetVarijanta 1:lock(L):for (int acquired = 0; !acquired; )swap(acquired,L);Swap instrukcije su obično skupe.Varijanta 2:lock(L):for (int acquired = 0; !acquired; ) {while (!L);swap(acquired,L);}Mogu li se ove instrukcije iskoristiti za implementacijulock/unlock i na jednoprocesorskom sistemu? – Zašto dane! U čemu je razlika?63/285


Implementacija semaforaclass Semaphore {public:Semaphore (int initValue=1) : val(initValue), lck(0) {}void wait ();void signal ();int value () { return val; };protected:void block ();void deblock ();private:int val;Queue blocked;int lck; // lock};64/285


Implementacija semaforavoid Semaphore::block () {if (setjmp(Thread::runningThread->context)==0) {// Blocking:blocked->put(Thread::runningThread);Thread::runningThread = Scheduler::get();longjmp(Thread::runningThread->context);} else return;}void Semaphore::deblock () {// Deblocking:Thread* t = blocked->get();Scheduler::put(t);}65/285


Implementacija semaforavoid Semaphore::wait () {lock(lck);if (--val


Implementacija semaforaMogu li se primitive lock/unlock koristiti i za međusobnoisključenje na nivou korisničkog programa? – Obezbeđujumeđusobno isključenje, ali:• Zabrana prekida ili preuzimanja:• sistem je neosetljiv na spoljašnje pobude, slaba reaktivnost• korisnički kod kritične sekcije ničim nije ograničen niti segarantovano završava u konačnom roku, pa može predugo ilivečno zadržati sistem u “hibernaciji” (npr. beskonačna petlja)• Uposleno čekanje: neefikasno, troši procesorsko vremena jalove instrukcije. – Da li je uvek tako?I blokiranje nešto “košta” – procesorsko vreme se opettroši na režijske (beskorisne) operacije (baratanjeredovima, promena konteksta), što nekad nijezanemarljivo. Nije li uposleno čekanje ponekadefikasnije? Kada? Vrteti se ili blokirati se (spin or block)?67/285


Implementacija semaforaIdeja: “vrteti se” (uposleno čekati) sve dok je to kraćenego vreme blokiranja, inače se blokirati?Kako znati koliko uposleno čekati, kada se blokirati?Neka je režijsko vreme blokiranja (uključujući i promenukonteksta) jednako b:• ako bi se uposleno čekalo za vreme t2b)Zaključak: sledeći postupak uvek garantuje režijsko vremedo 2b:• uposleno čekati dok se ne dobije ključ ili dok ne istekne b vremena• potom se blokirati68/285


Implementacija semaforaDa li je zaključavanje neophodno?Zašto biti “pesimista” u pogledu međusobnog isključenja?Kolika je stvarna šansa da više procesa uleti u konflikt ukritičnoj sekciji, posebno ako ih je malo? Zašto trošiti tolikorežijskog vremena na nešto što se možda retko ili nikad nedešava?Drugi pristup – optimistički pristup bez čekanja izaključavanja (optimistic concurrency control, wait-freesynchronization, lock-free synchronization):x:=x+11.Učitaj x u registar R12.Dodaj 1 na R1 i smesti u registar R23.Atomično uradi: ako je i dalje x=R1, smesti R2 u x,inače idi na 169/285


Implementacija semaforaMoguće uopštiti na proizvoljnu strukturu:• Napravi kopiju strukture na koju ukazuje dati pokazivač, modifikujkopiju• Atomično uradi: uporedi izvornu strukturu sa pročitanom, ako su istezameni pokazivač da ukazuje na kopiju• Ako je neki drugi proces izmenio polaznu strukturu, ponovi svePotrebna je podrška procesora – instrukcija za atomičnopoređenje i upisivanje. Moderni procesori to imaju (x86:CMPXCHG, CMPXCHG8B)Prednosti:• nema režijskog vremena zbog zaključavanja i blokiranja• bolje se ponaša u slučaju otkaza (npr. otkazao proces koji drži neštozaključano)Nedostatak: mnogo ponovnih pokušaja u slučaju velikogopterećenjaNeko je napisao ceo OS bez zaključavanja!70/285


Upotreba semaforaMeđusobno isključenje pomoću semafora:var mutex : Semaphore = 1; // Initially equal to 1process P1;loopwait(mutex);signal(mutex);endend P1;process P2;loopwait(mutex);signal(mutex);endend P2;Prednost: jednostavan kod,jednak za proizvoljan brojprocesaNedostatak: wait i signalmoraju biti upareni. Štaako se greškom ne upare?71/285


Upotreba semaforaOpšti slučaj sekcije u koju može da uđe N procesa:var mutex : Semaphore = N; // Initially equal to Nprocess P;loopwait(mutex);signal(mutex);endend P;72/285


Upotreba semaforaUslovna sinhronizacija pomoću semafora:var sync : Semaphore = 0; // Initially equal to 0process P1; // Waiting process...wait(sync);...end P1;process P2; // Signalling process...signal(sync);...end P2;73/285


Upotreba semaforaOpšti slučaj n procesa P koji se sinhronizuju pomoću n-1semafora S:• P(1) se izvršava i signalizira S(1)• P(k) čeka na S(k-1), izvršava se i signalizira S(k)(Veštački) primer: sinhronizovati procese koji zajednoobavljaju operaciju print(f(x,y))float x,y,z;Semaphore Sx(0), Sy(0), Sz(0);T1: T2: T3:x=...; Sx.wait(); Sz.wait();Sx.signal(); Sy.wait(); print(z);y=...; z=f(x,y); ...Sy.signal();Sz.signal();... ...74/285


Upotreba semaforaOgraničeni bafer pomoću semafora:const int N = ...; // Capacity of the bufferclass Data;class BoundedBuffer {public:BoundedBuffer ();void append (Data*);Data* take ();private:Semaphore mutex;Semaphore spaceAvailable, itemAvailable;Data* buffer[N];int head, tail;};75/285


Upotreba semaforaBoundedBuffer::BoundedBuffer () :mutex(1), spaceAvailable(N), itemAvailable(0),head(0), tail(0) {}void BoundedBuffer::append (Data* d) {spaceAvailable.wait();mutex.wait();buffer[tail] = d;tail = (tail+1)%N;mutex.signal();itemAvailable.signal();}Data* BoundedBuffer::take () {itemAvailable.wait();mutex.wait();Data* d = buffer[head];head = (head+1)%N;mutex.signal();spaceAvailable.signal();return d;}76/285


Upotreba semaforaPrikazani semafori nazivaju se još i n-arni ili brojački semaforiZa mnoge primene (npr. međusobno isključenje) dovoljni su binarnisemafori: najveća vrednost mu je 1Operacija wait blokira proces ako je semafor 0, odnosno postavljasemafor na 0 ako je bio 1Operacija signal deblokira proces ako čeka, a postavlja semafor na 1ako ga nemaPonegde se binarni semafor naziva i događaj (event) – samo signalizirada se neki događaj desio (logička, Bulova vrednost, desio se ili ne)U mnogim sistemima na događaj može čekati samo jedan proces(“vlasnik” događaja) i samo on može vršiti wait; signal može uraditibilo koji procesNeki sistemi podržavaju kombinovano čekanje na više događaja pouslovu “i” i “ili”Posebno pogodni za čekanje na spoljašnje događaje koji sesignaliziraju iz prekidne rutine: završena I/O operacija, isteklo vremesuspenzije procesa. Zato su veoma osetljivi za implementaciju77/285


Upotreba semaforaPogodnosti semafora:• jednostavan i efikasan koncept• generalan koncept niskog nivoa – pomoću njega semogu implementirati mnogi drugi, apstraktniji konceptiza sinhronizacijuLoše strane semafora:• suviše jednostavan koncept niskog nivoa – nije logičkipovezan sa konceptima bližim domenu problema(resurs, kritična sekcija, ...)• kod složenijih programa lako postaje glomazan,nepregledan, težak za razumevanje, proveru iodržavanje jer su operacije nad semaforima rasute• podložan je greškama – mora se paziti na uparenost iredosled operacija wait i signal78/285


Upotreba semaforaŠta je problem sa sledećim kodom (S1 i S2 su inicijalno 1)?process P1;wait(S1);wait(S2);...signal(S2);signal(S1);end P1;Moguća sekvenca:P1 - wait(S1);P2 - wait(S2);P1 - wait(S2);P2 - wait(S1);// S1:=0// S2:=0// P1 blocks on S2// P2 blocks on S1process P2;wait(S2);wait(S1);...signal(S1);signal(S2);end P2;Problem - mrtvo (ili kružno) blokiranje (deadlock):stanje sistema u kome je nekoliko procesasuspendovano (blokirano) međusobnimuslovljavanjem (čekanjem) - detalji u OS279/285

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!