5. Predavanje - VTS NS
5. Predavanje - VTS NS
5. Predavanje - VTS NS
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
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