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

Tema 01

Pojam konkurentnih i distribuiranih sistema


Pradigma konkurentnog programiranja
dr Nebojša Bačanin Džakula
nbacanin@singidunum.ac.rs
Tehnički fakultet, Univerzitet Singidunum
Konkurentno i distribuirano programiranje
2019/20
Korišćena notacija u nastavnim materijalima #1
▪ Radi lakšeg praćenja, materijali su u okviru svake teme (predavanja)
podeljeni na odgovarajuće sekcije (na primer 3), koje se dalje dele u
podsekcije (na primer 3.4).

▪ Ukoliko podsekcija obuhvata nekoliko slajdova, oni su redom numerisani


korišćenjem hashtag notacije (#1, #2,...,#n).

▪ Radi bolje čitljivosti koda, u pojedinim slučajevima, neke od naredbi su


prikazane fontom različite boje.

2
Korišćena notacija u nastavnim materijalima #2
▪ Pseudo-kod, sintaksa i delovi koda, prikazani su u ovakvom
okviru za tekst.

▪ Primeri Java i C kodova (u retkim slučajevima), dati su u ovakvom


okviru za tekst.

▪ Definicije pojmova i termina dati su u ovakvom okviru za tekst.


Hello

▪ Obzirom da je uz svaki pokazni kod koji, je prikazan u prezentacijama,


raspoloživ i odgovarajući Java projekat, koji se nalazi na stranici predmeta,
uz svaki pokazni kod pridružen je „callout“ sa nazivom odgovarajućeg Java
projekta.
Napomene

▪ Konačno, dodatne napomene prikazane su takođe „callout“-om, koji se


pridružuje odgovarajućem tekstu.
3
Sadržaj predavanja
1. Konkurentni i distribuirani sistemi
2. Uvod i terminologija
3. Paradigma konkurentnog programiranja
4. Zadaci, niti, procesi i komunikacija

4
1. Konkurentni i distribuirani sistemi

5
1.1 Pojam konkurentnih i distribuiranih sistema #1
• U literaturi može da se nađe nekoliko definicija konkurentnih i
distribuiranih sistema.

Konkurentni sistem predstavlja kolekcija procesora koji


komuniciraju putem čitanja i upisa u/iz deljene (zajedničke)
memorije.

Distribuirani sistem je kolekcija procesora koji komuniciraju


slanjem poruka preko komunikacione mreže.

6
1.1 Pojam konkurentnih i distribuiranih sistema #2
• Postoje brojni razlozi za implementiranje i korišćenje konkurentnih i
distribuiranih sistema.
• Prvo, sistem sa većim brojem procesora omogućava da se dati problem
reši brže i efikasnije u odnosu na jednoprocesorske sisteme.
• Drugo, različiti procesori mogu da dele resurse poput fajlova, diskova,
štampača, i slično.
• Treće, obzirom da su podaci distribuirani na veći broj lokacija, smanjuju se
uska grla u komuniciranju.

7
1.1 Pojam konkurentnih i distribuiranih sistema #3
• Pouzdanost u radu je jedan od osnovnih zahteva koje postavljaju aplikacije
konkurentnih i distribuiranih sistema.
• Tako na primer, sistem za kontrolu leta i avio-saobraćaju mora u svakom
vremenskom trenutku da budu funkcionalan. Slično je i sa sistemom za
kontrolu satelita.
• Takođe, mnoge globalne kompanije koje pružaju usluge „računarstva u
oblaku“ teže da imaju 100% vremensko funkcionisanje sistema (eng.
uptime). Primer je Amazon Web Services (AWS).
• Kako se veličina konkurentnih i distribuiranih sistema povećava, otpornost
na greške (eng. fault tolerance – FT) postaje jedan od glavnih ciljeva.
• Algoritmi koji se ugrađuju u mehanizam otpornosti na greške treba da
obezbede produžetak rada sistema u slučajevima kada je ograničen broj
komponenata tih sistema u kvaru.

8
1.2 Razvoj distribuiranih sistema #1
• Pojava jeftinijih personalnih računara (eng. personal computer – PC),
relativno skrome procesorske i memorijske snage, uz postojanje relativno
brzih lokalnih (eng. local area network – LAN) i širokopojasnih (eng. wide
area network – WAN) računarskih mreža omogućili su pojavu
distribuiranih sistema.
• Omogućeno je udruživanje nezavisnih sistema koje korisnici „vide“ kao
jedinstveni koherentni sistem sa velikom procesorskom i memorijskom
snagom i sa relativno niskom cenom.
• Potrebu za povezivanjem prostorno (geografski) udaljenih računara
nametnula je praksa.
• Prirodno je da računari, zbog svoje efikasnosti, budu na mestima svojih
primena, uz korisnike, u korporacijama, delovima industrijskih i drugih
postrojenja.

9
1.2 Razvoj distribuiranih sistema #2
• Međutim, obzirom da su u distribuiranim sistemima računari prostorno
dislocirani, a da postoji potreba da računari budu na mestima primene,
potrebno je da se omogući saradnja između prostorno udaljenih sistema,
na način da distribuirane sisteme korisnici „vide“ kao da su na mestima
primene i da izgledaju kao koherentna celina.
• Potrebno je da se obezbedi razmena podataka između udaljenih računara
koji su usmereni na zajednički zadatak: izvršavanje posla za svoje
korisnike, industrijske procese, i slično.
• Prostorno udaljeni računari se povezuju komunikacionim linijama, koje
omogućavaju prenos (razmenu) podataka organizovanih u poruke.
• Na ovaj način nastaje distribuirani računarski sistem (eng. distributed
computer system – DS).

10
1.2 Razvoj distribuiranih sistema #3

Slika 1: Arhitektura distribuiranog sistema


(Izvor: http://www.padakuu.com/article/181-distributed-
system)

11
1.3 Karakteristike distribuiranih sistema
• Najvažnije karakteristike koje distribuirani računarski sistem treba da ima
su:
➢ Transparentnost. Korisnik distribuiranog računarskog sistema sistem treba da „vidi“ kao
standardni centralizovani sistem, tj. ne sme da se primeti razlika u radu u odnosu na
klasičan sistem.
➢ Otpornost na greške. Distribuirani računarski sistem mora da ima sofisticirani
mehanizam otpornosti na greške. U slučaju prestanka rada (otkaza) nekog od računara,
distribuirani sistem mora da detektuje računar koji je prestao da radi i da neometano
nastavi sa radom.
➢ Skalabilnost. Distribuirani računarski sistem mora da omogući jednostavno dodavanja
novih računara i resursa.
➢ Deljenje resursa. Distribuirani računarski sistem mora da ima ugrađene mehanizme koji
omogućavaju jednostavno deljenje svih resursa između različitih čvorova u sistemu.
➢ Ubrzavanje izračunavanja i izvršavanje zadataka. Primenom tehnike deljenja
opterećenja (eng. load sharing), distribuirani računarski sistem treba da omogući
ubrzavanje izvršavanja zadataka. Na ovaj način, jedan proces (zadatak) može da se
podeli na veći broj manjih procesa (zadataka), koji će biti obrađivani na posebnim
računarima u sistemu.
12
1.4 Otklanjanje grešaka i oporavak #1
• U distribuiranim računarskim sistemima može da dođe do brojnih
hardverskih grešaka, kao na primer: otkaz nekog od računara u sistemu,
prekid veze između računara i gubitak poruke.
• Proces otkrivanja greške svodi se uglavnom na sledeće:
➢ Korišćenjem procedure usaglašavanja (eng. handshake) dolazi se do saznanja da li je
otkazao računar, ili veza (konekcija).
➢ Poruka (eng. message) se šalje alternativnom putanjom (rutom) i ako se računar, kome
je poruka poslata, „javi“, dolazi se do zaključka da je otkazala glavna veza (putanja).
➢ Međutim, ako se računar „ne javi“, onda se konstantuje da je otkazao računar, ili da su i
prva i druga ruta u prekidu, ili da je izgubljena poruka.
➢ Poruka onda može da se pošalje trećom putanjom, itd.

13
1.4 Otklanjanje grešaka i oporavak #2
• Procedura za oporavak od greške sastoji se uglavnom iz sledećeg:
➢ U slučaju da je otkaza veza između računara, informacija mora da se prenese svim
računarima, kako bi računari što pre ažurirali svoju tabelu rutiranja.
➢ Ako je otkazao računar, svi računari takođe moraju da se obaveste, kako uzalud ne bi
trošili vreme na pokušaje uspostavljanja veze sa računarom u kvaru.
➢ Kada se veza ili računar oporave, oni se vraćaju u sistem i svi ostali računari se
obaveštavaju.

14
2. Uvod i terminologija

15
• Za konkurentno programiranje je potrebna podrška na nivou hardvera,
operativnog sistema, u okviru programskog jezika, ili u okviru biblioteka.
• Kako bi se razumela i razmatrala podrška koja je potrebna, potrebno je
razumevanje osnovnih koncepata i principa konkurentnosti.
• Nažalost, terminologija u stručnoj literaturi koja se bavi principima
konkurentnog programiranja, programskih jezika i operativnih sistema nije
konzistentna i zbog toga će u ovom delu neki termini biti preciznije
definisani.

16
2.1 Uvod #1
• Danas se konkurentno programiranje koristi na najrazličitijim mestima i za
najrazličitinije namene - u velikom broju komercijalnih aplikacija i na
različitim računarskim platformama, od velikih računarskih klastera i
paralelnih računara, do manjih servera sa više procesora, do radnih
stanica i personalnih i prenosivih računara.
• Ovu široku primenu omogućio je razvoj lokalnih računarskih mreža i
interneta, mrežnih tehnologija i pojava novih računarskih i
mikroprocesorskih arhitektura.
• Danas veliki broj popularnijih operativnih sistema, poput Unix-a (u svim
varijantama, GNU/Linux, Sun Solaris, Andorid, itd.), Windows-a, i drugih
podržavaju različite oblike konkurentnog izvršavanja na raznim tipovima
računara.
• Takođe, razvojni alati konkurentnog programiranja i drugi softver su
dostigli visok nivo, tako da danas postoje veliki broj programskih jezika,
prevodilaca i biblioteka koji podržavaju konkurentno programiranje.
17
2.1 Uvod #2
• Takođe, ako se pogledaju aplikacije koje su danas dostupne, vidi se da
veliki broj klijentskih, serverskih i mrežnih aplikacija koriste principe
konkurentnog rada, bilo one koje su komercijalne, bilo one koje su
specijalizovane za naučne i inženjerske svrhe.
• Kao zaključak se navodi da se sve više ide od sekvencijalnog, ka
konkurentnom programiranju.
• S druge strane, razvojem višeprocesorskih i distribuiranih sistema i
računarskih mreža, razvijane su i programske metode koje omogućavaju
efikasnije iskorišćavanje raspoloživog hardvera.
• Od početka 60tih godina prošlog veka, kada je oblast konkurentnog
programiranja počela da se razvija, formulisan je veliki broj paradigmi
konkurentnog programiranja.

18
2.1 Uvod #3
• Postoji jaka veza između načina pisanja programa (programske
paradigme) i tipa izvršne platforme.
• Drugim rečima, programska paradigma zavisi od tipa izvršne platforme.
• Ovo je posledica činjenice da prevodioci programskih jezika nisu u stanju
da generišu efikasan mašinski kod za različite arhitekture računara na
osnovu izvornog koda pisanog pomoću jedne iste programske paradigme.
• Zbog toga su se sa razvojem novih arhitektura računara razvijale i nove
paradigme konkurentnog programiranja.
• I danas je programska paradigma vezana za izvršnu platformu.

19
2.1 Uvod #4
• Podrška za programske paradigme može da se realizuje na različitim
nivoima.
➢ Na nivou mašinskog jezika tako da određene arhitekture računara podržavaju hardverski
implementirane primitive, poput LOCK/UNLOCK.
➢ Na nivou operativnog sistema, gde na primer GNU/Linux u kernelu ima podršku a
preemptive multitasking, što omogućava efikasniju implementaciju višenitnih aplikacija.
➢ Na nivou prevodilaca za programske jezike, gde na primer Java prevodilac implementira
paradigmu monitora
➢ Na nivou programskih biblioteka.

• U zavisnosti od toga na kom je od pomenutih nivoa implementirana


podrška za programsku paradigmu zavise performanse i portabilnost
programa.
• Ako je na primer podrška implementirana na nivou mašinskog jezika,
dobija se efikasniji, ali manje prenosiv kod.
• Ako je podrška implementirana na nivou programskih biblioteka, manje
efikasan, ali je zato portabilniji.
20
2.2 Terminologija #1
• Obzirom da se u stručnoj literaturi sreće na razne pojmove vezane za
konkurentno programiranje koji su često nedovoljno i nejasno definisani i
razgraničeni, potrebno je definisati neke od osnovnih pojmova koji se
vezuju za konkurentno programiranje.
• Paralelno izvršavanje označava istovremeno izvršavanje više računarskih
operacija, sekvenci operacija, programa, ili delova jednog programa.
• Paralelni program je svaki računarski program koji koristi posebnu
sintaksu za označavanje delova programskog koda koji mogu da se
izvršavaju paralelno.
• Paralelni računarski sistem je svaki računarski sistem koji može da
izvršava istovremeno dva ili više delova jednog ili više programa.

21
2.2 Terminologija #2
• Sekvencijalno izvršavanje je izvršavanje, gde se sledeća računarska
naredba izvršava tek nakon što je prethodna završena (u redosledu koji je
u programu definisan).
• Sekvencijalni program je program kod koga postoji samo jedan
sekvencijalni tok izvršavanja u vremenu. Na kojoj god platformi da se
sekvencijalni program izvršava, uvek će da se izvršava istim redosledom
naredbi za iste ulazne podatke.
• Skup naredbi programa koje se izvršavaju određenim sekvencijalnim
redosledom naziva se tok izvršavanja programa (eng. execution flow),
programski tok (eng. program flow), instrukcijski tok (eng. instruction
flow), ili nit toka kontrole (eng. thread of control).
• Program može da ima jedan ili više programskih tokova.

22
2.2 Terminologija #3
• Sekvencijalni program može da ima samo jedan tok izvršavanja u
vremenu, ali može da ima više statičkih tokova izvršavanja (primer IF
naredba).
• Paralelni program može da ima više statičkih tokova izvršavanja i više
programskih tokova koji mogu istovremeno da se izvršavaju.
• Konkurentno izvršavanje podrazumeva izvršavanje više programskih
tokova jednog programa tako da oni napreduju u vremenu (bar dva od
njih), ali se oni ne moraju obavezno izvršavati istovremeno (slučaj
istovremenog izvršavanja je slučaj kod paralenog izvršavanja).

23
2.2 Terminologija #4
• Između termina paralelno i konkurentno izvršavanje postoje razlike.
• Paralelno izvršavanje podrazumeva da je izvršna platforma
multiprocesorski sistem, na kome zaista mogu u isto vreme da se
izvršavaju delovi paralelnog programa.
• S druge strane, konkurentno izvršavanje može da se primeni i na sisteme
sa samo jednim procesorom.
• Termin konkurentni program označava program kod koga se dva ili više
programskih tokova konkurentno izvršavaju.
• Ako se ne uzima u obzir izvršna platforma (način izvršavanja), termin
konkurentni program bi bio sinonim za paralelni program, jer se ne
sintaksa i semantika konkurentnog i paralelnog programa ne razlikuju.
• Slično, termin konkurentno programiranje bi bio sinonim za paralelno
programiranje ako se ne uzima u obzir izvršna platforma.
• Termin konkurentno programiranje je širi od paralelnog, jer on može da
podrazumeva bilo kakvu izvršnu platformu (i jedan i više procesora).
24
2.2 Terminologija #5
• Kada se posmatra hardver računara, postoji zabuna, jer su s razvojem
hardvera uvedeni novi termini u stručnoj literaturi.
• Koristeći instrukcioni paralelizam (eng. instruction parallelism), procesori
sa protočnom (eng. pipelined) arhitekturom omogućavaju istovremeno
izvršavanje više faza različitih mašinskih instrukcija. Međutim, u pitanju su
različite faze izvršavanja sekvencijalnih programa, tako da ovi procesori
nemaju direktan uticaj na paradigme konkurentnog programiranja. Ovi
procesori spadaju u tzv. SISD (Single Instruction Single Data) procesore,
gde svaka mašinska instrukcija sadrži i operande (podatke) i kod koji
operiše sa tim podacima.
• Drugi tip procesora su SIMD (Single Instruction Multiple Data), gde jedna
mašinska instrukcija specificira paralelno izvršavanje jedne operacije nad
skupom različitih podataka. U ovom slučaju, na nivou hardvera postoji
podrška za konkurentno programiranje i zbog toga postoji uticaj na
paradigme konkurentnog programiranja. Paradigma prilagođena ovoj
arhitekturi zove se data parallel programming. 25
2.2 Terminologija #6
• Procesori koji spadaju u kategoriju SMT (Simultaneous Multi-Threading)
mogu istovremeno da izvršavaju više programskih niti (tokova
izvršavanja), što implicira korišćenje i odgovarajućih paradigmi
konkurentnog programiranja. Ovi procesori koriste MIMD (Multiple
Instructions Multiple Data) arhitekturu.
• Danas se SMT procesori mogu naći na tržištu.

26
2.3 Kategorizacija konkurentnih i distribuiranih sistema #1
• Za konkurentno programiranje najznačajniji su sistemi sa MIMD
arhitekturom.
• Ovi sistemi se dele na sisteme sa deljenom memorijom (eng. Shared
memory systems), multikompjutere sa distribuiranom memorijom (eng.
Distributed memory multicomputers) i mreže računara (network of
workstations).
• Sistemi sa deljenom memorijom se dalje dele u nekoliko kategorija u
zavisnosti od načina povezivanja procesora i memorije: sistemi sa
uniformnim pristupom memoriji, sistemi sa neuniformnim pristupom
memoriji i sistemi sa distribuiranom zajedničkom memorijom.
• Sistemi sa uniformnim pristupom memoriji (eng. Uniform memory
access – UMA) imaju fizički jedinstvenu memoriju kojoj svi procesori
pristupaju preko interkonekcione mreže i tako je vreme pristupa svih
procesora memoriji isto (uniformno), a pritom procesori imaju sopstvene
keš memorije.
27
2.3 Kategorizacija konkurentnih i distribuiranih sistema #2
• Sistemi sa neuniformnim pristupm memoriji (eng. Non-uniform memory
access – NUMA) imaju fizički jedinstvenu memoriju koja je hijerarhijski
organizovana. Procesori u ovakvim sistemim nemaju isto vreme pristupa
memoriji, već brzina pristupa zavisi od lokacije podataka. Što je podatak
dublje u hijerarhijskoj memoriji, više vremena je potrebno za pristup do
takvog podatka.
• Sistemi sa distribuiranom zajedničkom memorijom (distributed shared
memory systems – DSM) imaju logički jedinstvenu, ali fizički distribuiranu
memoriju. Svaki procesor ima svoju privatnu memoriju koja je deo
zajedničkog logičkog memorijskog prostora.

28
2.3 Kategorizacija konkurentnih i distribuiranih sistema #3

Slika 2: Sistemi sa deljenom memorijom


Izvor: Jovanovic, Z., slajdovi sa predavanja, ETF
29
2.3 Kategorizacija konkurentnih i distribuiranih sistema #4

Slika 3: NUMA vs. UMA


Izvor: https://moinakg.wordpress.com/

30
2.3 Kategorizacija konkurentnih i distribuiranih sistema #5

Slika 4: DSM sistemi


Izvor: https://en.wikipedia.org

31
2.3 Kategorizacija konkurentnih i distribuiranih sistema #6

Slika 5: DSM sistemi


Izvor: Jovanovic, Z., slajdovi sa predavanja, ETF

32
2.3 Kategorizacija konkurentnih i distribuiranih sistema #7
• Multikompjuter sa distribuiranom memorijom je računarski sistem koji se
sastoji od procesora koji su međusobno povezani preko interkonekcione
mreže, gde svaki procesor ima svoju privatnu memoriju. Za razliku od DSM
sistema, privatna memorija procesora nije deo globalnog adresnog
prostora. Komunikacija između procesora vrši se prosleđivanjem poruka
kroz mrežu.
• Konačno, mreža računara se sastoji iz više nezavisnih računara koji su
povezani preko računarske mreže (npr. Ethernet, Wireless i slično).
Računari u mreži (čvorovi) komuniciraju prosleđivanjem poruka koristeći
odgovrajuće protokle.

33
2.4 Taksonomija paradigmi konkurentnog programiranja #1
• Različite paradigme (programski modeli) konkurentnog programiranja
formirane su na nižem nivou na osnovu različitih arhitektura računarskih
sistema i njihovih tipičnih parametara (broja procesora, tipu arhitekture
memorijskog podsistema, prosečno vreme kašnjenja prilikom pristupa
memoriji, itd.), a na višem nivou prema domenu primene (optimizacija,
veštačka inteligencija, naučno-istraživački proračuni, itd.).
• Zadatak paradigmi je da programeru omoguće formulisanje efikasnih
programa koji će postići željeni cilj.
• Postoji veliki broj kategorizacija paradigmi konkurentnog programiranja.
• Jedna podela odnosi se na podelu na osnovu interakcije između procesa,
gde se paradigme konkurentnog programiranja dele na dve velike grupe:
programiranje pomoću deljenih (zajedničkih) promenljivih (eng. shared
variable programming) i distribuirano programiranje (eng. distributed
programming).

34
2.4 Taksonomija paradigmi konkurentnog programiranja #2
• U slučaju paradigme pomoću deljenih promenljivih, svaki program sadrži
aktivne procese i zajedničke (deljene) promenljive (objekte). Procesi
komuniciraju i interaguju tako što čitaju i upisuju vrednosti u deljene
promenljive.
• S druge strane, kod distribuiranog programiranja, ne postoje deljeni
objekti, već se komunikacija između procesa zasniva na:
➢ Eksplicitnom slanju i primanju poruka pomoću komunikacionih primitiva (na primer send
i receive). Poruka je objekat koji jedan proces prosleđuje nekom drugom procesu.
➢ Udaljenim pozivima procedura (eng. remote procedure call – RPC, ili remote method
invocation – RMI), gde procedura koja poziva i pozvana procedura pripadaju različitim
procesima. Interakcija između udaljenih procedura je uvek potpuno sinhrona.
➢ Mehanizmom randevua (eng. rendezvous), gde prilikom poziva servisne procedure dva
procesa čekaju – proces koji poziva čeka da pozivajući proces dođe do tačke prihvatanja
randevua, dok pozvani proces čeka da pozivajući proces stigne do tačke poziva.

35
2.4 Taksonomija paradigmi konkurentnog programiranja #3
• Osim navedene taksonomije, postoje i druge podele paradigmi
konkurentnog programiranja.
• Još jedna od najopštijih podela je na osnovu modela koordinacije (eng.
coordination model).
• Podela prema modelu koordinacije polazi od toga da se sve aktivnosti
programa mogu podeliti na izračunavanje (eng. computation) i na
koordinaciju (eng. coordination).
• Svaki model koordinacije ima tri elementa:
➢ Entitete čiji se rad koordinira – gradivni delovi programa koji čine osnovni gradivni
elementi sistema, kao što su agenti, niti, procesi, itd.
➢ Koordinacioni medijum – medijum koji služi za koordinaciju programskih entiteta
(kanali, deljen promenljive, itd.)
➢ Pravila koordinacije, koja određuju kako entiteti koordiniraju rad korišćenjem
koordinacionog medijuma, na primer skup primitiva za upis i čitanje u prostor podataka,
itd.

36
2.4 Taksonomija paradigmi konkurentnog programiranja #4
• U praksi se najčešće sreću dva koordinaciona modela: model virtuelnih
prostora i programiranje pomoću programskih niti.
• Model virtuelnih prostora predstavlja vrstu proširenja modela
programiranja pomoću deljene promenljive.
• U slučaju programiranja pomoću programskih niti, koordinacioni model
se bazira na nezavisnim programskim tokovima koji se nazivaju niti (eng.
threads), koje međusobno mogu da komuniciraju primenom neke od
komunikacionih paradigmi. Ovakav način programiranja naziva se
višenitno programiranje (eng. multithreading).

37
3. Paradigma konkurentnog programiranja

38
3.1 Konkurentni programi #1
• Standardni računarski program se sastoji iz deklaracije podataka, naredbi
dodele, uslovnih naredbi i petlji, itd.
• Programski jezici „novijeg“ datuma koriste strukture poput procedura
(funkcija, metoda) i modula za organizovanje većih softverskih sistema
putem mehanizama apstrakcije i enkapsuliranja. Međutim, ove strukture i
dalje u sištini izvršavaju elementarne naredbe koje se koriste za
izračunavanje izraza, dodelu vrednosti, kopiranje podataka, menjanje toka
izvršavanja podataka, i slično.
• To su u suštini instrukcije koje postoje u mašinskom kodu koji se dobija
procesom kompajliranja izvornog koda (eng. source code).
• Računar mašinske instrukcije izvršava sekvencijalno (jedna za drugom), a
podaci se čuvaju u glavnoj ili sekundarnoj memoriji.

39
3.1 Konkurentni programi #2

Konkurentni program predstavlja skup programskih tokova


(sekvencijalnih programa), kod koga se dva ili više
programska toka konkurentno izvršavaju.

• U stručnoj literaturi se često pojam proces koristi da se ukaže na skup


sekvencijalnih programa koji su sastavni delovi konkurentnog programa, a
pojam program se koristi da ukaže na skup procesa.

40
3.1 Konkurentni programi #3
• Pretragom stručne literature mogu da se nađu i druge definicije
konkurentnog programa.
• Konkurentni program se sastoji iz skupa (sekvencijalnih) procesa. Procesi
se kreiraju pomoću konačnog skupa atomskih naredbi. Program se
izvršava pomoću sekvenci atomskih naredbi putem proizvoljnog
prepletanja (eng. interleaving) atomskih naredbi procesa. Izračunavanje
(eng. computation) predstavlja izvršivu sekvcencu koja moža da se javi kao
rezultat prepletanja. Izračunavanja se obično nazivaju scenarija. U toku
izračunavanja kontrolni pokazivač (eng. control pointer) svakog procesa
pokazuje na narednu naredbu koju dati proces treba da izvrši. Svaki proces
ima svoj kontrolni pokazivač. Za termin kontrolni pokazivač, koriste se i
termini pokazivač instrukcije (eng. instruction pointer) i pokazivač lokacije
(eng. location pointer).

41
3.1 Konkurentni programi #4
• Termin paralelan koristi se za sisteme kod kojih se izvršavanje nekoliko
programa vremenski preklapa (eng. overlap). Poklapanje je moguće zato
što se programi izvršavaju na posebnim procesorima.
• Termin konkurentan se odnosi na potencijalni paralelizam, zato što
izvršavanja mogu, ali i ne moraju da se preklapaju. S druge strane,
paralelizam je vidljiv kada se isti implementira deobom resursa na
manjem broju procesora
• Konkurentnost je važna apstrakcija, jer programeri razumevanjem
konkurentnosti mogu bolje da razumeju program, kod koga se teži da se
svi procesi konkurentnog programa izvršavaju paralelno na nekoliko
procesora.

42
3.2 Konkurentna paradigma #1
Konkurentnu paradigmu karakterišu više procesa koji se
izvršavaju u istom vremenskom periodu i koji su usmereni na
ostvarivanje istog cilja.

• Konkurentna paradigm datira još iz 60tih godina prošlog veka. Tako je na


primer još programski jezik Algol 68 imao ugrađenu podršku za
konkurentno programiranje.
• Međutim, relativno skoro se interesovanje za konkurentno programiranje
povećalo.
• Neki od razloga za povećano interesovanje uključuje sledeće: porast broja
veb, multimedijalnih i drugih višenitnih (eng. multithreading) aplikacija
koje koriste konkurentne niti, pad cene višeprocesorskih računara i
potreba za umrežavanjem računara i deljenjem resursa.

43
3.2 Konkurentna paradigma #2
• Na osnovu definicije, konkurentnost izgleda kao relativno jednostavan
koncept, ali je pisanje konkurentnih programa značajno teže nego pisanje
sekvencijalnih programa.
• Kako bi koncepti konkurentnog programiranja bili praktično
implementirani, potrebna je adekvatna podrška u programskim jezicima
koji se koriste za implementaciju.
• Osnovni problemi konkurentnog programiranja odnose se na načine za
pristup zajedničkim (deljenim) podacima, kao i na pitanja komunikacije i
sinhronizacije procesa.
• Zbog navedenog, konkuretno programiranje predstavlja veliki izazov za
programere i projektante programskih jezika i operativnih sistema.
• Veliki deo podrške za konkurentnost obezbeđuje sam operativni sistem,
i zbog toga ćemo tokom ovog kursa da se koristimo brojnim konceptima
koji su preuzeti iz teorije operativnih sistema.

44
3.3 Odnos konkurentne, paralelne i distribuirane paradigme
• Odnos između konkurentne, paralelne i distribuirane paradigme najbolje
je posmatrati hijerarhijski.
• Tako da, hijerarhijski posmatrano, konkurentna paradigma predstavlja
najširi pojam, i nju označava više procesa koji se izvršavaju u istom
vremenskom periodu (ne znači u isto vreme).
• Paralelna paradigma je specijalizacija konkurentne paradigme, koja
obuhvata više procesora (posmatra se izvršna platforma).
• Distribuirana paradigma je specijalizacija paralelne paradigme, gde su
procesori i fizički (geografski) razdvojeni (dislocirani).
• Konkurentna paradigma bi bila isto što i paralelna paradigma (i obrnuto),
ukoliko se ne posmatra izvršna platforma.

45
3.4 Razlozi za korišćenje konkurentnog programiranja #1
• Među razlozima za korišćenje konkurentnog programiranja ističu se
sledeći:
➢ Podrška logičkoj strukturi problema,
➢ Poboljšanje brzine izvršavanja i
➢ Rad sa fizički nezavisnim uređajima.

• Konkurentnost na nivou jedinica (zadataka) koristi se kao podrška logičkoj


strukturi problema.
• „Priroda“ savremenih aplikacija je takva da aplikacije istovremeno
izvršavaju više od jednog zadatka, koji su u velikoj meri nezavisni jedni od
drugih, pa je logično da se u takvim scenarijima zadaci raspodele u
različite kontrolne niti.

46
3.4 Razlozi za korišćenje konkurentnog programiranja #2
• Kao jedan od primera takvih aplikacija može da se uzme veb pregledač
(eng. web browser). Veb pregledači izvršavaju više različitih zadataka
istovremeno, kao na primer, slanje i primanje podataka od strane veb
servera, čitanje i prikaz HTML (HyperText Markup Language), reagovanje
na akcije korisnika (interpretacija JavaScript koda), i slično.
• Kao još jedan primer može da se navede proces veb servera (eng. veb
server daemon). Veb server istovremeno „sluša“ pristizanje zahteva (eng.
requests) od strane klijenata, obrađuje te zahteve (eng. process) i šalje
odgovore (eng. responds) klijentima u vidu obrađenih zahteva.
• U navedenim primerima, konkurentnost može da se odnosi i na
konkurentnost u užem smislu, koja obuhvata jedan procesor, a gde se
konkurentno izvršavanje ostvaruje isprepletanim izvršavanjem različitih
procesa ili niti.

47
3.4 Razlozi za korišćenje konkurentnog programiranja #3
• U slučaju da sistem ima više procesora, oni mogu bolje da se iskoriste
primenom konkurentnosti i na taj način se dobija na brzini.
• Slučaj kada se koristi više procesa odgovara paralelnom programiranju.
• Termin paralelno programiranje može da se odnosi i na više procesora na
različitim računarima, ali se najčešće misli na jednu višeprocesorsku
mašinu.
• U slučaju jedne višeprocesorske mašine, procesi međusobno komuniciraju
preko zajedničke memorije (eng. shared memory), dok u slučaju
procesora na različitim računarima, procesi međusobno komuniciraju
slanjem poruka (eng. massage passing).
• Poboljšanje brzine može da se ostvari i kod jednoprocesorskog računara
konkurentnim izvršavanjem (jedan program ne mora da bude u
potpunosti sekvencijalan, što može da se iskoristi za poboljšanje
performansi).

48
3.4 Razlozi za korišćenje konkurentnog programiranja #4
• Korišćenjem distribuiranog programiranja, mogu da se napišu
distribuirane aplikacije koje koriste različite računare, koji su povezani, ili
lokalnom mrežom, ili Internetom. Na ovaj način omogućava se rad sa
fizički nezavisnim uređajima.
• U ovom slučaju, procesi međusobno komuniciraju slanjem poruka.
• Postoje programski jezici koji su dizajnirani posebno za distribuirano
programiranje.

49
3.5 Ciljevi konkurentnog programiranja #1
• Neki od glavnih ciljeva konkurentnog programiranja je kreiranje
portabilnih (eng. portable) i skalabilnih (eng. scalable) programa.
• Pojam skalabilnost odnosi se na ubrzavanje izvršavanja instrukcija sa
porastom broja procesora.
• Skalabilnost je važna, jer cene procesora opadaju i na taj način se
dostupnost višeprocesorksih sistema poboljšava.
• Međutim, sa skalabilnošću treba biti oprezan, jer porast broja procesora
iznad određene granice ne mora da ima pozitivan efekat i potrebno je
sprovesti neke vrste korist-troškovi analize (eng. cost-benefit analysis).
• Idealni koncept bi bila linearna skalabilnost, ali se u praksi to retko dešava.

50
3.5 Ciljevi konkurentnog programiranja #2
• Kada se govori o skalabilnosti, korisno je da se pomene i Amdahlov zakon.

Mali delovi programa (koda) koji ne može da se paralelizuje


ograničiće mogućnost ukupnog ubrzavanja izvršavanja
paralelizacijom.

• Prateći Amdahlov zakon, ako na primer 10% koda ne može da se


paralelizuje (α=10%), onda je maksimalno ubrzavanje izvršavanja 10 puta
u ovom slučaju (1/ 0.1 = 10), bez obzira na broj procesora koji se dodaju u
sistem.
• Kada se računa ukupno ubrzavanje sistema dodavanjem novih procesora,
mora se uzeti u obzir i usporenje koje nastaje usled komunikacije između
procesora.

51
3.5 Ciljevi konkurentnog programiranja #3
• Portabilnost programa se odnosi na nezavisnost od konkretne
arhitekture.
• Životni vek i upotrebna vrednost hardvera su relativno kratki, jer usled
tehnoloških promena kontinuirano izlaze nove i unapređene verzije
hardvera i pojavljuje se softverska podrška za novi hardver.
• Dobar program ili algoritam treba da ima karakteriste portabilnosti, tj. ne
sme da zavisi od aktuelnog hardvera.

52
3.6 Nivoi konkurentnosti
• Postoje četiri osnovna nivoa konkurentnosti:
1. Nivo instrukcije. Na ovom nivou se dve ili više instrukcija izvršava u isto vreme.
2. Nivo naredbe. U ovom slučaju se dve ili više naredbi programskog jezika izvršava
istovremeno.
3. Nivo jedinica. Izvršavanje dve ili više jedinica (potprograma) u isto vreme.
4. Nivo programa. Izvršavanje dva ili više programa istovremeno.
• Potrebno je da se naglasi da prvi i četvrti nivo konkurentnosti ne utiču na
dizajn programskog jezika.

53
3.7 Vrste konkurentnosti
• Postoje dve osnovne vreste konkurentnosti:
1. Logička konkurentnost
2. Fizička konkurentnost
• Fizička konkurentnost podrazumeva postojanje više procesora.
• S aspekta dizajna programskog jezika i programera, fizička konkurentnost
je ista kao i logička konkurentnost.
• Implementacija programskog jezika korišćenjem funkcija operativnog
sistema preslikava (mapira) logičku konkurentnost u fizičku (odgovarajući
hardver).

54
3.8 Razumevanje osnovnih pojmova iz operativnih sistema
• Za bolje razumevanje konkurentnosti, potrebno je razumevanje nekih od
osnovnih pojmova iz operativnih sistema:
➢ Mutiprogramiranje (eng. multiprogramming)
➢ Multiprocesiranje (eng. multiprocessing)
➢ Multitasking (eng. multitasking)
➢ Više niti (eng. multithreading)
➢ Deljenje vremena (eng. time sharing)
➢ Sistemi koji rade u realnom vremenu (eng. real time systems – RTS)
• Pojmovi multiprogramiranje, multitasking, više niti, deljenje vremena i
sistemi u realnom vremenu odnose se na raspoređivanje procesa prilikom
izvršavanja na procesoru.
• Termin multiprocesiranje odnosi se na broj procesora, ili jezgara koji su u
sistemu.

55
4. Zadaci, niti, procesi i komunikacija

56
4.1 Zadaci, niti, procesi #1
• Takođe, radi boljeg razumevanja konkurentnosti i konkurentnog
programiranja, potrebno je razumevanje pojmova zadaci, niti i procesi.
• Zadatak ili posao (eng. task) je jedinica programa koja može da bude
izvršena konkurentno sa drugim jedinicama istog programa.
• Na osnovu date definicije, dolazi se do zaključka da je zadatak sličan
potprogramu.
• Međutim, postoje razlike između zadataka i potprograma, koje se
ogledaju u:
➢ Zadaci mogu implicitno da počnu, ne moraju eksplicitno da budu pozvani kao što je to u
slučaju potprograma.
➢ Kada program pokrene neki zadatak, ne mora uvek da čeka da se zadatak završi, pre
nego što nastavi sa svojim izvršavanjem.
➢ Kada se izvršavanje zadataka završi, kontrola ne mora da se vrati na ono mesto u
programu, odakle je izvršavanje zadataka počelo.
• Izvršavanje svakog zadatka u programu može da bude podržano od strane
jedne kontrolne niti (eng. thread), ili procesa (eng. process).
57
4.1 Zadaci, niti, procesi #2
• U opštem smislu, zadaci se dele na dve kategorije:
➢ Teški zadaci (eng. heavyweight) i
➢ Laki zadaci (eng. lightweight).

• Teški zadaci poseduju sopstveni adresni prostor (eng. address space), dok
laki zadaci dele zajednički prostor sa drugim zadacima.
• Teški zadaci odgovaraju procesima, dok laki zadaci odgovaraju nitima.
• Teškim zadacima upravlja operativni sistem, gde obezbeđuje deljenje
procesorskog vremena, pristup fajlovima i adresnom prostoru.
• Stanje teškog zadatka se sastoji od:
➢ Podataka o izvršavanju teškog zadatka (težak zadatak u svakom trenutku može da bude
– spreman, radi, čeka, itd), brojač instrukcija i vrednosti registara.
➢ Informacija o upravljanju resursima (memorija, I/O (input output) uređaji, korišćene
datoteke, itd.)

58
4.1 Zadaci, niti, procesi #3
• Prelazak s jednog na drugi teški zadatak takođe se vrši posredstvom
operativnog sistema putem mehanizma promene konteksta (eng. contex
switch).
• Promena konteksta je promena stanja procesora, koje je neophodno
izvršiti kada se sa izvršavanja jednog teškog zadatka prelazi na izvršavanje
drugog teškog zadatka. Potrebno je da se u memoriji računara zapamti
stanje zadatka koji se prekida, dok se na osnovu stanja u memoriji vrši
rekonstrukcija zadatka koji nastavlja da se izvršava.
• Promena konteksta je skupa operacija koja se dešava relativno često (do
nekoliko stotina puta u sekundi). Osim toga, stanja teškog zadatka koji se
čuvaju, zauzimaju memorijske resurse, što takođe mora da se uzme u
obzir.

59
4.1 Zadaci, niti, procesi #4
• S druge strane, laki zadaci egzistiraju u okviru jednog težeg zadatka i ne
zahtevaju posebne računarske resurse.
• Koncept lakih zadataka je uveden da bi se omogućio lak prelazak s jednog
na drugi zadatak.
• Svi laki zadaci u okviru težeg zadatka dele zajedničke podatke na nivou
težeg zadatka.
• Prelazak s jednog na drugi laki zadatak vrši se promenom sadržaja radnih
registra i pamćenja brojača instrukcija i stanja zadatka, što je relativno brz
i jednostavan proces.
• Na primer, u programskom jeziku C, teški zadaci su procesi, koji imaju svoj
adresni prostor, dok su laki zadaci niti, koje imaju zajednički adresni
prostor.
• Upravljanje nitima ostvaruje se preko korisničkih biblioteka, a neke od
najpoznatijih su: POSIX Pthreads, Java Threads, Win32 Threads.

60
4.1 Zadaci, niti, procesi #5
• Odnos između niti i procesa ilustrovan je na Slici 6.

Slika 6: Odnos između niti i procesa


61
4.2 Pralelizacija zadataka i podataka #1
• Prilikom pisanja paralelnog programa, jedan od osnovnih zadataka
programera je da izabere adekvatan način za podelu posla.
• Najšire upotrebljavana strategija je da se za svaki zadatak, ili funkciju
programa koriste različite niti.
• Tako na primer, u slučaju programa za obradu teksta (eng. word
processing) jedan zadatak (nit) bi mogao da bude zadužen za prelamanje
teksta, drugi zadatak (nit) za korekciju pravopisnih grešaka, treći za
usklađivanje tabela i slika, itd.
• Ovakva strategija se u literaturi naziva pralelizam zadataka.
• Međutim, veliki nedostatak ove strategije je taj što ne skalira dobro u
uslovima velikog broja procesora.

62
4.2 Pralelizacija zadataka i podataka #2
• Za dobro skaliranje na velikom broju procesora, potrebno je da se koristi
paralelizacija podataka.
• U slučaju paralelizacije podataka, sve operacije se primenjuju
konkurentno na elemente nekog velikog skupa podataka.
• Tako na primer aplikacije računarske igre može da koristi posebnu nit za
svaki objekat koji pokreće.
• Program koji je dizajniran da koristi paralelizaciju podataka najčešće se
zasniva na paralelizaciji petlji, tako što svaka nit izvršava isti kod, ali
korišćenjem različitih podataka.
• Za ovu vrstu paralelizma, najčešće se koristi paralelizam na nivou naredbi.
• Paralelizacija na nivou podataka pogodna je za neke vrste problema, ali
nije za sve. Na primer: množenje matrica, pronalaženje prostog broja u
nizu brojeva, skalarni proizvod i proizvod komponenti dva vektora, i slično.

63
4.3 Osnovne operacije sa nitima
• Kao što je rečeno, niti odgovaraju lakim zadacima.
• Niti su zadaci koji se istovremeno izvršavaju u okviru jednog procesa
(teškog zadatka).
• Sve niti jednog procesa imaju isti imenski prostor, koriste zajedničku
memoriju i tabele otvorenih datoteka (fajlova).
• Osnovne operacije sa nitima su:
➢ Kreiranje niti. Niti se prave na nivou operativnog sistema. Operacija kreiranja niti
podrazumeva i početak izvršavanja niti.
➢ Završavanje niti. Ova operacija se izvršava kada nit završi svoje izvršavanje, i tada se
oslobađaju resursi koje je nit zauzimala. Ostaje samo rezultat izvršavanja.
➢ Suspendovanje i nastavljanje niti. Ove operacije odnose se na situaciju kada nit
privremeno prekine da se izvršava, a zatim se izvršavanje nastavlja. Ove operacije nisu
uvek podržane – problem nastaje ako suspendovana nit drži neke resurse.
➢ Prekidanje niti. Jedna nit može da prekine izvršavanje druge niti. Međutim, ova
operacija može da dovede do niza problema koji mogu da ugroze integritet podataka
koje niti dele.
➢ Čekanje. Jedna nit čeka da druga nit završi sa radom.
64
4.4 Stanja i operacije sa nitima u Javi #1
• U multitasking okruženju, kao što su okruženja novijih operativnih
sistema, programima upravlja operativni sistem.
• U okviru jednog programa, na primer Java programski jezik upravlja
nitima.
• Osnovna stanja niti u Javi su: početno, izvršno, blokirano i umrtvljeno.
• Java koristi klasu Thread za rad sa nitima.
• Klasa Thread sadrži niz metoda za rad sa nitima.
• U nastavku će biti prikazane neke od metoda klase Thread.
• Metoda start() pokreće novu nit i počinje izvršavanje metode run()
u novoj niti.
• Metoda run() obezbeđuje izvršavanje niti.
• Metoda sleep() uspavljuje nit za određeni broj milisekundi.
• Metoda stop() zaustavlja izvršavanje niti – izbegavati.
• Metoda suspend() suspenduje izvršavanje niti - izbegavati
65
4.4 Stanja i operacije sa nitima u Javi #2
• Metoda resume() nastavlja izvršavanje suspendovane niti – izbegavati.
• Metoda yield() daje šansu drugoj niti sa istim prirotetom da bude
izvršena.
• Metoda join() obezbeduje izvršavanje nekog koda (niti) nakon što neka
druga nit završi svoje izvršavanje, na primer u slučaju kada se izvršavanje
run() metoda završi.
• Metoda wait() suspenduje tekuću nit (nit koja se trenutno izvršava) dok
se ne pojavi metod notify() ili notifyAll() za objekat koji je
pozvao metodu wait().
• Metoda notify() restartuje nit koja je pozvala metod wait() za
objekat kojem pripada metod notify(). Ako je nekoliko niti pozvalo
metod wait() za neki objekat, ne može da se zna koja je nit obaveštena.
Ako ne postoji wait() metoda, metoda notify() nema efekta.
• Metoda notifyAll() restartuje sve niti koje su pozvale metod wait()
za objekat kojem pripada metoda notifyAll().
66
4.5 Komunikacija između zadataka #1
• Zadaci moraju da komuniciraju jedan sa drugim.
• U ovom kontekstu, komunikacija se odnosi na svaki mehanizam koji
omogućava razmenu informaciju između zadataka, tj. omogućava da
jedan zadatak dobije informacije od drugog zadatka.
• Komunikacija može da se realizuje preko zajedničke memorije (u slučaju
da zadaci dele memoriju), ili pomoću mehanizma za slanje poruka.
• Ako zadaci dele memoriju (eng. shared memory), oni pristupaju izabranim
promenljivama u zajedničkoj memoriji i na taj način komuniciraju (ovo se
pre svega odnosi na lake zadatke). Jedan zadatak jednostavno upiše
vrednost promenljive, a drugi tu vrednost pročita.
• Međutim, u ovom slučaju potrebno je voditi računa, jer je redosled čitanja
i pisanja vrednosti promenljivih bitan i pri čitanju i pisanju može da dođe
do konflikata.

67
4.5 Komunikacija između zadataka #2
• Slanje poruka (eng. message passing) koristi se u scenarijima kada zadaci
nemaju zajedničku memoriju.
• Komunikacija putem slanja poruka realizuje se najčešće u slučaju teških
zadataka (procesa).
• U ovom slučaju, kako bi dva zadatka komunicirala, jedan zadatak mora da
eksplicitno pošalje podatak drugom zadatku.
• Za slanje poruka mogu da se koriste brojni mehanizmi međuprocesne
komunikacije, kao što su signali, cevi, soketi, tokovi, kanali i slično.
• Ukoliko se komunikacija između zadataka slanjem poruka realizuje u
okviru istog računara, onda se uglavnom takvo slanje smatra pouzdanim.
• Međutim, slanje poruka u distribuiranim sistemima ne može da se smatra
pouzdanim, jer podaci putuju kroz mrežu, gde mogu da se izgube.
• Zbog toga su u slučaju distribuiranih sistema potrebni dodatni mehanizmi i
protokoli, koji imaju cilj da osiguraju da poruka neće da se izgubi.
68
4.6 Sinhronizacija zadataka #1
• Pojam sinhronizacija (eng. synchronization) se odnosi na mehanizme koji
omogućavaju programeru da kontroliše redosled po kojem se operacije
izvršavaju o okviru različitih zadataka.
• Kada zadaci komuniciraju mehanizmom slanja poruka, sinhronizacija je
implicitna zato što poruka prvo pora da se napiše i da se pošalje, pre nego
što se primi. Zadatak može da primi samo onu poruku koja je poslata.
• Međutim, kada zadaci komuniciraju mehanizmom deljene memorije,
sinhronizacija nije implicitna.
• U slučaju deljena memorije (podataka), postoje dva osnovna vida
sinhronizacije: saradnja (eng. cooperation) i takmičenje (eng. contention).
• Zadaci X i Y koriste sinhronizaciju saradnjom, ako na primer zadatak X
mora da završi neku operaciju, kako bi zadatak Y počeo ili nastavio sa
radom.
• Primer ove vrse sinhronizacije je problem proizvođača i potrošača
(proizvođač prvo mora da proizvede, kako bi potrošač trošio).
69
4.6 Sinhronizacija zadataka #2
• Sinhronizacija takmičenjem je neophodna u situacijama kada dva zadatka
zahtevaju isti resurs koji ne mogu istovremeno da koriste.
• Na primer, ako zadatak Y treba da prisupa deljenom podatku data, u
vreme dok zadatak X pristupa podatku data, tada zadatak Y mora da
sačeka da zadatak X završi sa obradom podatka data.
• Uzmimo u razmatranje sledeći primer: neka postoji zajednička
promenljiva x,čija je početna vrednost 2, a koju dele zadaci A i B, gde A
treba da poveća vrednost promenljive x za jedan, dok B treba da vrednost
promenljive poveća tri puta.

x=2;
A=x+1; B=3*x;

70
4.6 Sinhronizacija zadataka #3
• Na mašinskom nivou imamo tri instrukcije: uzimanje vrednosti
promenljive, izmena vrednosti i upisivanje nove vrednosti promenljive.
• Bez mehanizma sinhronizacije, mogući su sledeći ishodi:
➢ 9 – ako A prvo izvrši, pa zatim B.
➢ 7 – ako B prvo izvrši, pa zatim A.
➢ 6 – ako A i B istovremenu uzmu vrednost, ali je A prvo upiše, pa je B posle prepiše.
➢ 3 – ako A i B istovremeno uzmu vrednost, ali je B prvo upiše, pa je A posle prepiše.

• Situacija koja vodi do ovih problema naziva se uslov takmičenja (eng. race
condition), jer se dva ili više zadataka takmiče ko će prvi da koristi deljenje
resurse i ponašanje programa (rezultat) zavisi od toga ko će da pobedi (ko
će da stigne prvi do deljenje promenljive).
• Uslov takmičenja se u domaćoj literaturi naziva još uslov trke niti.

71
4.6 Sinhronizacija zadataka #4
• U navedenom primeru, instrukcije x+1 i 3*x nazivaju se kritična sekcija
(eng. critical section).
• Osnovni cilj sinhronizacije je da obezbedi da se kritična sekcija izvrši
atomično (nedeljivo), tj. da se sve instrukcije koje čine kritičnu sekciju
izvrše bez prekidanja.
• Pojmom kritična sekcija i mogućim rešenjima, bilo hardverskim, bilo
softverskim bavi se dobar deo stručne literature koji se odnosi na
konkurentnost i na teoriju operativnih sistema.
• Pojam kritična sekcija je važan i biće detaljno izučavan u narednim
predavanjima.

72
4.7 Semafori i monitori #1
• Za kontrolisanje pristupa deljenim resursima koriste se mehanizmi
zaključavanja (eng. locking) i uzajamnog isključivanja (eng. mutual
exlcusion).
• Za uzajamno isključivanje mogu da se koriste semafori (eng. semaphores)
ili monitori (monitors).
• Semafori su prvi mehanizmi sinhronizacije i implementirani su već u
programskom jeziku Algol 68.
• Semafori su i dalje implementirani u Java programskom jeziku.
• Semafori imaju dve moguće operacije, P i V (ili wait i release ili wait i
signal).
• Kritična sekcija se ograđuje sa P i V, gde je P ulazak u kritičnu sekciju
(zadatak ulazi i sa sobom zatvara vrata, kako niko drugi ne bi mogao da
uđe), a V je izlazak iz kritične sekcije (kada zadatak završi sa izvršavanjem
koda u kritičnoj sekciji, on izlazi).

73
4.7 Semafori i monitori #2
• P i V su „nesrećne“ oznake i teško se pamte. Uvedene su još 60tih godina
prošlog veka i od tada se koriste u stručnoj literaturi.
• Semafori su i dalje koriste, ali se smatraju da su kontrola niskog nivoa i
takvi su nepogodni za dobro strukturian i lako održiv kod.
• Korišćenje semafora može da dovede do grešaka u izvršavanju i do
uzajmnog blokiranja.
• Drugi mehanizmi su montiori koji enkapsuliraju deljene strukture
podataka sa njihovim operacijama, tj. čine deljene podatke apstraktnim
tipovima sa specijalnim ograničenjima.
• Monitori se koriste u Javi (modifikator synchronized), C# (klasa Monitor),
kao i u drugim programskim jezicima.
• Semafori i monitori biće detaljnije prikazani na narednim predavanjima.

74
4.8 Muteksi i katanci
• Reč mutex potiče od pojma uzajamno isključivanje na engleskom jeziku
(eng. mutual exclusion)
• Mutex postoji na primer u C++-u, ali ne postoji u Javi.
• Semantika katanca osnovni način bezbednog deljenja podataka u
konkurentnom okruženju.
• Koristi se koncept atomičnog zaključavanja – samo jedna nit može da
zaključa podatak, a ako je mutex već zaključan, nit koja želi da ga zaključa
mora da sačeka na njegovo otključavanje.
• O mutex-u će biti više reči na narednim predavanjima.

75
4.9 Implementacija sinhronizacije
• Bilo da dva zadatka komuniciraju mehanizmom deljene memorije, ili
mehanizmom slanja poruka, sinhronizacija može da se implementira na
dva način: zauzetim čekanjem (eng. busy-wait synchronization) i
blokiranjem (eng. blocking synchronization).
• Kod sinhronizacije zauzetim čekanjem, zadatk se vrti u petlji i proverava
da li je neki uslov ispunjen, na primer, da li je poruka stigla, ili da li deljena
promenljiva ima određenu vrednost. Tek kada je uslov ispunjen, zadatak
izlazi iz petlje.
• Sinhronizaciju zauzetim čekanjem nema smisla implementirati na sistemu
sa jednim procesorom.
• Kod sinhronizacije blokiranjem, zadatak svojevoljno oslobađa procesor, ali
pre toga ostavlja poruku u nekom mestu u kodu koji je zadužen za
sinhronizaciju. Zadatak koji kasnije pronađe tu poruku vrši akciju, da bi se
zadatak koji je ostavio poruku odblokirao i nastavio sa radom.

76
4.10 Napredovanje #1
• U konkurentnim sredinama, na koncept napredovanja (eng. liveness)
treba obratiti posebnu pažnju, jer može da dođe do problema.
• Sekvencijalni program ima karakteristiku napredovanja ukoliko izvršavanje
dovodi do kraja rada programa u nekom trenutku.
• Dakle, koncept napredovanja ukazuje na to da ukoliko neki događaj treba
da se desi (na primer kraj izvršavanja programa), da će on da se desi u
nekom trenutku i da se stalno pravi progres.
• Međutim, u konkurentnim okruženjima može da se desi da se zadatak
blokira i da ne može da nastavi sa radom, što dovodi do toga da zadatak
neće da se završi.

77
4.10 Napredovanje #2
• Kako bi se koncept napredovanja bolje razumeo, razmotrićemo sledeći
primer.
• Imamo dva zadatka, zadatak A i zadatak B i imamo dva resursa, resurs x i
resurs y. Zadatak A trenutno „drži“ resurs x, a zadatak B trenutno „drži“
resurs y. Međutim, kako bi zadatak A završio operaciju sa resursom x,
potreban mu je resurs y, koji se nalazi kod zadatka B. Slično, kako bi
zadatak B završio operaciju sa resursom y, potreban mu je resurs x, koji
se nalazi kod zadatka A. Na ovaj način, oba procesa, i A i B čekaju ovaj
drugi proces da oslobi resurs i na ovaj način, oba zadatka gube napredak i
program ne može da se završi normalno.
• Ovakav način gubitka progresa nalazi se uzajamno blokiranje, odnosno
smrtonosno blokiranje (eng. deadlock).
• Smrtonosno blokiranje je ozbiljan problem i zahteva stručna i ozbiljna
razmatranja u programskim jezicima.

78
4.10 Napredovanje #3
• Kada se govori o napredovanju, potrebno je još da se pomenu sledeće
situacije:
➢ Živo blokiranje (eng. live lock) – svi zadaci nešto rade, ali nema napredovanja.
➢ Individualno izgladnjivanje (eng. lockout, individual starvation) – kada jedan zadatak
sprečava izvršavanje drugog zadatka.
• Kako bi se osiguralo da će uslov napretka biti ispunjen, potrebno je
obezbediti uzajamno isključivanje kritičnih sekcija, pristup resursima i
poštenost u izvršavanju.
• O ovim i drugim konceptima biće reči na narednim predavanjima.

79
Dodatne teme za razmatranje
• SISD, SIMD i MIMD arhitekture
• Podrška programskih jezika za konkurentno programiranje (istorijski
aspekt)
• Multiprogramiranje, multitasking i deljenje vremena (eng. time sharing)

80
PITANJA?

81
Korišćena literatura
1. Radivojević, Z., Ikodinović, I., Jovanović, Z., Konkurentno i distribuirano
programiranje, drugo izdanje, Akademska misao, 2018., p. 395.
2. Jovanović, Z., Konkurentno i distribuirano programiranje, prezentacije sa
predavanja, ETF, 2015.
3. Vujošević Janičić, M., Programske paradigme (konkurentna paradigma),
prezentacije sa predavanja, Matematički fakultet, 2015.
4. Scott, M. L., Programming Language Pragmatics, 3rd Edition, Elsevier,
2009., p. 910.
5. Sebesta, R. W., Concepts of Programming Languages, 10th Edition,
Pearson Publishing, 2014., p. 816.
6. Goetz, B. et al., Java Concurrency in Practice, 1st Edition, Addison Wesley,
2015., p. 405.

82
Napomene uz literaturu
• Okosnicu za poglavje 2 (Uvod terminologija) činile su reference [1] i [2].
• Okosnicu za poglavlje 3 (Konkurentna paradigma) činila je referenca [3].

83
Napomena za studente
• Poštovane koleginice/kolege, slajdove koje ste uprvo pročitali namenjeni
su za prvo predavanje.
• Cilj prvog predavanja je da se upoznate sa osnovnim terminima,
pojmovima i paradigmom konkurentnog programiranja.
• Mnogi navedeni koncepti će biti mnogo jasniji nakon ostalih predavanja i
zbog toga savetujem da se obavezno vratite i da pročitate ponovo prvo
predavanje, već nakon prvog dela kursa (do kolokvijumske nedelje).
• Želim vam srećan rad i uspešno savladavanje gradiva.

84
VAŽNO!
Ova prezentacija je nekomercijalna.
Slajdovi mogu da sadrže materijale preuzete sa Interneta, stručne i naučne
građe, koji su zaštićeni Zakonom o autorskim i srodnim pravima. Ova
prezentacija se može koristiti samo privremeno tokom usmenog izlaganja
nastavnika u cilju informisanja i upućivanja studenata na dalji stručni,
istraživački i naučni rad i u druge svrhe se ne sme koristiti –
Član 44 - Dozvoljeno je bez dozvole autora i bez plaćanja autorske naknade za nekomercijalne svrhe nastave:
(1) javno izvođenje ili predstavljanje objavljenih dela u obliku neposrednog poučavanja na nastavi;
- ZAKON O AUTORSKOM I SRODNIM PRAVIMA ("Sl. glasnik RS", br. 104/2009 i 99/2011)
.................................................................................................................................................................................
Nebojša Bačanin Džakula
nbacanin@singidunum.ac.rs

85
Tema 01
Pojam konkurentnih i distribuiranih sistema
Pradigma konkurentnog programiranja

HVALA NA PAŽNJI
dr Nebojša Bačanin Džakula
nbacanin@singidunum.ac.rs
Tehnički fakultet, Univerzitet Singidunum
Konkurentno i distribuirano programiranje
2018/19

You might also like