10. Konkurentno programiranje Flashcards
Konkurentni programi
Sadrze vise izvrsnih delova koji mogu biti istovremeno aktivni. Konkurentnost moze biti fizicka i logicka. Postoje 4 nivoa konkurentnosti:
• Nivo instrukcija - razlicite masinske instrukcije se izvrsavaju istovremeno
• Nivo naredbi - naredbe visih programskih jezika se izvrsavaju istovremeno
• Nivo potprograma - razliciti potprogrami se izvrsavau istovremeno
• Nivo programa - vise programa se izvrsavaju istovremeno
Konkurentnost na nivou potprograma
Proces, nit (thread) ili task je deo programa koji se moze izvrsavati konkurentno sa drugim procesima. Razlika izmedju potprograma i procesa je sto se proces mora eksplicitno startovati. Kada neki program pokrene novi task, njegovo izvrsavanje se ne prekida vec se izvrsavaju zajedno. Kada se izvrsenje nekog procesa zavrsi, upraljanje ne mora da se vrati modulu koji ga je pokrenuo
Vrse sinhronizacije i metode za sinhronizaciju
Postoje dve vrste sinhronizacije:
• Vrsta sinhronizacije za pristup zajednickim resursima, za koju se koriste semafori i monitori
• Vrsta sinhronizacije za komunikaciju medju procesima za sta se koristi razmena poruka
Semafori
Semafori sluze za sinhronizaciju pristupa zajednickim resursima. Oni sadrze brojac (koji sadrzi broj procesa koji mogu da pristupe zajednickom resursu) i red deskriptora procesa koji cekaju pristup.
Postoje operacije cekaj i propusti (wait n release).
Binarni semafori regulisu samo pristup zajednickom resursu.
Moze doci i do producer - consumer problema koji podrazumeva da vise procesora kreira podatke i smesta ih u zajednicki bafer ili vise procesa uzima podatke iz bafera. Kao resenje ovog problema koriste se 2 semafora (jedan regulise dodavanje elemanta u bafer, drugi citanje) ili tri semafora (postoji i semafor koji regulise pristup baferu - u jednom trenutku samo jedan proces moze da mu pristupi)
Monitori
Monitor je modul koji objedinjuje podatke koji predstavljaju zajednicki resurs za vise procesa . Ako se neki od aktiviranih procesa obrati monitoru u trenutku kada neki drugi proces koristi procedure monitora, stavlja se u red cekanja. Kada neki proces napusta monitor, proverava se red cekanja i ukoliko u njemu ima procesa koji cekaju, prvi od njih se aktivira i dozvoljava mu se pristup podacima.
U implementacijama monitora se mogu koristiti i semafori i monitori su podrzani u programskim jezicima kao sto je Java, C#, Ada itd..
Niti u Javi
Procesi se u Java aplikacijama definisu pomocu niti (threads). Nit je jedan tok u izvrsenju programa i kada se kreira Java aplikacija pokrece se jedna nit - osnovna nit aplikacije. Ako zelimo da se izvrsni delovi izvrsavaju istovremeno kreiraju se nove niti.
Niti se kreiraju tako sto se prvo definise klasa koja ce predstavljati novu nit u programu ( treba da bude ili izvedena iz klase Thread ili da implementira interfejs Runnable). Nakon toga se kreiraju objekti ove klase i pokrece se izvrsenje niti.
Ukoliko je klasa izvedena iz klase Thread, pozivom metode start() nad kreiranim objektom ove klase se pokrece izvrsenje niti.
Ukoliko klasa implementira interfejs Runnable, kreira se objekat klase Thread cijem se konstruktoru prosledjuje objekat kreirane klase i nad tako kreiranim objektom se poziva metoda start.
PRIMERI
Bitnije metode klase Thread
- void sleep(int ms) - uspavljuje nit na odredjeno vreme
- void setDeamon(bool d) - postavlja indikator da li je nit demonska ili ne. Demonska nit moze da nastavi svoje izvrsenje i kada se nit koja ju je kreirala zavrsi. Moze da se pozove samo pre startovanja niti
- void join() - ceka se da se nit za koju je pozvana zavrsi
- void yield() - privremeno suspenduje nit - daje sansu da se izvrse niti koje cekaju na izvrsenje
- string getName() - vraca naziv niti. Ime niti moze biti postavljeno u konstruktoru, a ako se to ne desi dobijaju imena 0,1,2,…
Razmena poruka
Razmena poruka moze biti:
- Asinhrona - postoji bafer koji cuva pristigle podatke sve dok primalac ne bude bio spreman da ih primi
- Sihnrona (randevu) - randevu je koncept sihrone simetricke komunikacije. Procesi se izvrsavaju asinhrono sve dok jedan od njih ne dodje do tacke komunikacije koji zatim ceka da i drugi proces dodje do te tacke. Ovaj nacin sinhronizacije je podrzan u jeziku Ada.
Niti u Javi
Procesi se u Java aplikacijama definisu pomocu niti (threads) Nit je jedan tok u izvrsenju programa i kada se kreira Java aplikacija, pokrece se osnovna nit. Ako zelimo da se izvesni delovi izvrsavaju istovremeno, kreiramo nove niti.
Niti se kreiraju tako sto se definise klasa koja ce predstavljati novu nit u programu (mora ili da bude izvedena iz Threads ili implementira interfejs Runnable). Nakon toga se kreiraju objekti ove klase i pokrecu se niti.
Ukoliko je klasa izvedena iz Threads, pozivom metodes start() nad objektom kreirane klase se pokrece izvrsenje niti.
Ukoliko je klasa implementira Runnable, kreira se objekat klase Thread sa konstruktorom koji ima kao argument objekat kreirane klase, i onda se nad tako kreiranim objektom klase Thread poziva start().
Primeri
Bitnije metode klase Thread
- void sleep(int ms) – uspavljuje nit na odredjeno vreme
- void setDeamon(bool d) – postavlja indikator da li je nit demonska ili ne. Demonska nit moze da nastavi svoje izvrsenje i kada se nit koja ju je kreirala zavrsi. Moze da se pozove samo pre startovanja niti
- void join() – ceka se da se nit za koju je pozvana zavrsi
- void yield() – privremeno suspenduje nit – daje sansu da se izvrse niti koje cekaju na izvrsenje
- string getName() – vraca ime niti. Ime niti moze biti postavljeno u konstruktoru, a ukoliko nije, dobijaju imena 0,1,2…
Semafori u Javi
Klasa Semaphore je definisana u okviru paketa java.uti.concurent i kontstruktor klase izgleda kao Semaphore(int permits). Bitnije metode su void aquire() //wait void aquire(int permits) bool tryAquire() bool tryAquire(int permits) void release() void release(nt permits) int availablePermits()
Sinhronizovani metodi u Javi
Ispred definicije metoda nalazi se kljucna rec synchronized. Samo jedan sinhronizovani metod se moze izvrsavatiu datom trenutku nad zadatim objektom.
Proces sinhronizacije koristi interni “lock” koji je pridruzen uz svaki objekat. Svaki sinhronizovani metod koji se poziva za objekat proverava da li je neki drugi sinhronizovani metod postavio “lock” i ukoliko jeste stavlja se na cekanje dok se lock ne ukloni.
Istovremeno mogu da se izvrsavaju sinhronizovani metodi ali samo nad razlicitim objektima klase, tj kontrolise se konkurentni pristup samo jednom objektu. Metodi koji nisu synchronized mogu da se izvrsavaju uvek bez ikakvih ogranicenja.
Takodje, moguce je postaviti i lock samo na proizvoljan objekat samo za odredjeni blok naredbi. Kada se izvrsava blok koji je sinhronizovan za dati objekat, ne moze se izvrsavati ni jedan drugi sinhronizovan blok za taj objekat.
Metode wait(), notify i notifyAll() se mogu pozivati samo unutar sinhronizovane metode ili bloka (u suprotnom se javlja IllegalMonitorStateException)
- wait() - suspenduje tekucu nit sve dok se ne pozove notify() ili notifyAll() za objekat za koji je metod pozvan
- notify() - restartuje nit koja je pozvala wait() metod za objekat za koji je metod pozvan
Klasa Thread u C#-u
Najbitnija svojstva klase Thread su:
• static CurrentThread-nit koja se trenutno izvrsava
• IsAlive - indikator koji pokazuje da li je nit trenutno aktivna
• IsBackground - indikator koji pokazuje da li se radi o pozadinskoj niti
• Name - ime niti
• Priority - prioritet niti
• ThreadState - stanje niti
Najbitnije metode klase Thread su:
• Konstruktor
• Start ili Start(parametri) - pokrece izvrsenje niti
• static Suspend(thread) - suspenduje odredjenu nit
• static Resume(thread) - nastavlja izvrsenje niti
• Sleep(time) - nit uspavljuje sama sebe na neko vreme
• Abort() - obustavlja se izvrsenje niti
• Join() - ceka se dase metod za koji je pozvana nit zavrsi
Sinhronizacija pristupa zajednickim resursima u C#-u
Postize se zakljucavanjem resursa, koriscenjem monitora i koriscenjem semafora i binarnih semafora
• Sihnronizacija niti zakljucavanjem
Sinhronizacija niti zakljucavanjem se koristi kada neki deo koda moze da izvrsava samo jedna nit. Za zakljucavnaje se koristi sinhronizacioni objekat
lock (objekat) { … }
• Sihnronizacija niti koriscenjem monitora
Staticka klasa koja takodje koristi sinhronizacionog objekta.
Pre pocetka dela koda koji se zakljucava navodi se Monitor.Enter(objekat); try{ … } finally { Monitor.Exit(objekat); }
• Sinhronizacija niti pomocu mutexa i semafora
Mutex omogucava da odredjenoj kriticnoj sekciji koda pristupi samo jedna nit, dok semafori omogucavaju da odredjeni deo koda izvrsava N procesa
Kreira se staticki objekat tipa Mutex ili Semaphore i u svakoj niti kritican deo koda omedjivati metodama WaitOne(); i ReleaseMutex()/Release() nad tim objektom.