ࡱ> %'"#$q`8bjbjqPqP i::  lll4555h06l6<7<7<7<7d7CCC____=P_!h!$hlCC|CCC <7d7 mb%X%X%XC" <7(ld7_%XC_%X%X:],hli^d707 0z5L ^ _ϢH^R?Wi^li^CC%XCCCCCWXCCCCCCC$D4D4  Sinkronizacijski problemi L. Jelenkovi, D. Jakobovi, M. Golub Zavod za elektroniku, mikroelektroniku, ra unalne i inteligentne sustave Fakultet elektrotehnike i ra unarstva, Sveu iliate u Zagrebu Unska 3, 10000 Zagreb, Hrvatska Telefon: 016129 935 {leonardo.jelenkovic, domagoj.jakobovic, marin.golub}@fer.hr Sa~etak  U radu su razmatrana dva osnovna mehanizma sinkronizacije: semafori i monitori. Svaki je mehanizam najprije ukratko opisan te je kasnije primijenjen na rjeaavanje sinkronizacijskog problema. Problemi koji su rijeaeni semaforima su  problem puaa a cigareta i  problem barijere , dok je s monitorom rijeaen  problem starog mosta . Prikazano je nekoliko rjeaenja svakog problema. Ukazano je na nedostatke pojedinih rjeaenja te kako se oni mogu otkloniti. Prije prikaza rjeaenja svaki je problem analiziran te je ustanovljeno ato svaki proces mora ispitati prije koriatenja nekih sredstava, a ato mora na initi po zavraetku koriatenja istih. Takvim na inom prikaza ~eli se ukazati na mogui pristup za rjeaavanje sinkronizacijskih problema. I. UVOD Gotovo svaki ra unalni sustav upravlja s viae aktivnosti koje se esto odvijaju paralelno. Najjednostavnije ostvarenje upravljanja takvim sustavom jest da se za svaku nadgledanu aktivnost koristi po jedan proces ili dretva [1]. Aktivnosti u istom sustavu mogu dijeliti ista sredstva, ali pristup tim sredstvima treba nekako kontrolirati, tj. sinkronizirati, zbog moguih problema pri istovremenom koriatenju.  Istovremeni pristup mo~e biti stvarno istovremeni u viaeprocesorskim sustavima, dok je kod jednoprocesorskih sustava on samo prividno istovremen a nastaje zbog unaprijed nepredvidljivog rasporeivanja dretvi na jednom procesoru. Problem ispravne sinkronizacije openito je vrlo slo~en i esto je uzrok neo ekivanim ispadima razli itih programa. Jedan primjer koji mo~e ilustrirati slo~enost problema je dogaaj koji se dogodio u upravlja kom sustavu robotske letjelice  Mars Pathfinder za vrijeme njene misije na Marsu [2]. Previdom odreenih moguih stanja dretvi u sustavu, koja su se upravo i dogodila, sustav je do ispravka tih greaaka bio neupotrebljiv. Za ostvarenje kontrole pristupa sredstvima koriste se funkcije operacijskih sustava, takozvane funkcije sinkronizacije. Iako se sinkronizacija mo~e obavljati s pomou velikog broja mehanizama operacijskog sustava, naj eae koriateni mehanizmi sinkronizacije su semafori i monitori, detaljnije objaanjeni u slijedeem poglavlju. Problem sinkronizacije dretvi izlo~en je u okviru predmeta  Operacijski sustavi jer se u tom predmetu prikazuje koncept izgradnje jezgrinih funkcija operacijskih sustava, pa tako i funkcija sinkronizacije. Na nekoliko se razli itih problema sinkronizacije studentima prikazuju neka mogua rjeaenja. Svako se rjeaenje analizira, ukazuje se na prednosti i nedostatke, usporeuje s drugim moguim rjeaenjima, primjenjuju se drugi mehanizmi sinkronizacije i sli no. Meutim, unato  znatnom trudu u prikazu problema, rijeaenost zadataka pokazuje da studentima to podru je treba joa viae objaanjavati i mo~da koristiti i druk ije pristupe. Cilj ovog rada je prikazati postupak rjeaavanja nekih problema sinkronizacije, na kojima su pokazani mogui pristupi rjeaavanju problema kao i dodatne poteakoe koje se javljaju prilikom sinkronizacije te kako ih se rijeaiti ili barem otkriti. Rad mo~e poslu~iti predava ima za pripremu predavanja i studentima kao dodatak predavanjima za dodatne upute pri rjeaavanju sinkronizacijskih zadataka. II. MEHANIZMI SINKRONIZACIJE Naj eae koriateni mehanizam sinkronizacije su semafori. Oni se mogu koristiti kao mehanizam meusobnog isklju ivanja  binarni semafori, ili kao brojila proizvoljnih sredstava ili dogaaja  opi semafori. Uz svaki se semafor ve~e vrijednost semafora. Za binarni su to vrijednosti  prolazan ili  neprolazan , eae ozna avano s 1 i 0. Opi semafor mo~e imati viae vrijednosti. S obzirom na razne izvedbe opih semafora, u ovom radu koristit e se semafor koji mo~e poprimiti samo nenegativne vrijednosti, ato je naj eae koriaten oblik semafora [7]. Jezgrine funkcije za rad sa semaforom su: ekajBSem(i), PostaviBSem(i) za binarni semafor te ekajOSem(j), PostaviOSem(j) za opi, gdje indeksi i i j ozna avaju o kojem se semaforu radi. Ukratko, funkcije s prefiksom  ekaj e pokuaati smanjiti vrijednost semafora za 1 a da njegova vrijednost ne postane negativna, a funkcije  postavi poveavaju vrijednost semafora za 1. Izuzetak je funkcija PostaviBSem(i) koja ne smije dopustiti da se vrijednost semafora povea iznad 1. U prakti nim ostvarenjima binarnog semafora mo~e se umjesto vrijednosti 1 uzeti najvea vrijednost koju semafor mo~e poprimiti (npr. MAXSHORT) te na taj na in osigurati da semafor ima samo dvije vrijednosti, 0 koja je neprolazna i najveu moguu (MAXSHORT), koja ozna ava prolaznu vrijednost. Drugi, konceptualno druk iji mehanizam sinkronizacije su monitori. Monitori su zapravo skup funkcija (monitorskih funkcija) s posebnim svojstvima, koje su ostvarene s pomou funkcija jezgre operacijskog sustava. Za svaki monitor uvijek vrijedi sljedee: ukoliko je neka dretva aktivna u nekoj od funkcija koje pripadaju doti nom monitoru (odnosno, za dretvu se ka~e da je unutar monitora), svim ostalim dretvama nije dopuaten ulazak u monitorsku funkciju. Poziv monitorske funkcije zaustavit e pozivajuu dretvu, ako se trenutno neka druga dretva ve nalazi u monitoru. Kako u pojedinoj monitorskoj funkciji mo~e biti uvijek aktivna samo jedna dretva, ona mo~e pristupati nekim dijeljenim podacima, mijenjati te podatke, ispitivati uvjete koji su toj ili nekoj drugoj dretvi potrebni za nastavak rada. Kada dretva unutar monitorske funkcije ustanovi da joj uvjeti za nastavak rada nisu ispunjeni, koristei posebne jezgrine funkcije dretva se svrstava u red ekanja (red uvjeta). Pritom privremeno izlazi iz monitora i time omoguava da neka druga dretva ue u monitor. U redu ekanja dretva e biti dok joj neka druga dretva, posebnom jezgrinom funkcijom, ne signalizira da mo~e nastaviti s radom. S obzirom na nekoliko moguih ostvarenja monitora, u ovom radu e se koristiti ostvarenje koje se i naj eae ostvaruje u operacijskim sustavima [8] iako e se funkcije nazvati sli no onima koriatenim u [1]. Jezgrine funkcije za ostvarenje monitora ozna avat e se sa: Ui_u_monitor(m), Izai_iz_monitora(m), Uvrsti_u_red_uvjeta(m, k), Oslobodi_iz_reda_uvjeta(m, k). Prve dvije funkcije slu~e dretvi za ulazak i izlazak iz monitorske funkcije, dok zadnje dvije blokiraju dretvu kada prethodno izra unati uvjeti za nastavak rada nisu ispunjeni, te za oslobaanje jedne dretve iz reda ekanja. Sve osim prve funkcije u ispravnom koriatenju moraju se pozvati jedino unutar monitorske funkcije, tj. nakon poziva Ui_u_monitor(m) kako je to i prikazano na sl. 1. Iako se monitorske funkcije nazivaju funkcijama one to ne moraju izri ito i biti, ve to mo~e biti i samo dio programa u jednoj funkciji, za koji vrijedi da je prva naredba ulazak u monitor, a zadnja izlazak iz njega. Funkcija za stavljanje dretve u red ekanja osim blokiranja pozivajue dretve istovremeno i oslobaa monitor, tj. privremeno izlazi iz monitora, kako bi neka druga dretva mogla ui u monitor i pritom eventualno ispuniti uvjete na koje prva dretva eka te joj i signalizirati da mo~e nastaviti s radom. Meutim, kako se ne bi dogodilo da tada obje dretve budu unutar monitora, dretva koja je osloboena iz reda uvjeta ne nastavlja odmah s radom ve mora ponovo  ui u monitor. U nekom jednostavnijem ostvarenju jezgrina funkcija Uvrsti_u_red_uvjeta mogla bi se sastojati od dva djela. U prvom dijelu se oslobaa monitor i pozivajua se dretva premjeata u zadani red ekanja. Nakon ato joj neka druga dretva signalizira da mo~e nastaviti s radom funkcijom Oslobodi_iz_reda_uvjeta, u drugom dijelu funkcije Uvrsti_u_red_uvjeta dretva treba ponovo ui u monitor. Zapravo, u ostvarenju funkcije Oslobodi_iz_reda_uvjeta mo~e se prva dretva iz zadanog reda odmah premjestiti u red u kojem dretve ekaju na ulazak u monitor, a ne u red pripravnih dretvi, pa bi ovaj drugi dio funkcije Uvrsti_u_red_uvjeta bio nepotreban. Ostali mehanizmi sinkronizacije koje pru~aju operacijski sustavi, kao ato su to komunikacija porukama, cjevovodima, datotekama i sli no nee se razmatrati u ovom radu jer je njihova primarna namjena razmjena podataka meu dretvama, a ne sinkronizacija. III. PROBLEM PU`A A CIGARETA  Problem puaa a cigareta predstavio je Patil [3] kako bi ukazao na problem sinkronizacije koriatenjem semafora. U ovom radu koristi se isti problem, ali razli ito rjeaenje radi ilustracije nekih problema sa semaforima. U ovom slu aju sustav se sastoji od tri dretve koje predstavljaju puaa e te jedne dretve trgovca. Svaki od  puaa a ima kod sebe u neograni enoj koli ini jedan od tri sastojka potrebnih da se napravi i zapali cigareta: papir, duhan ili aibice. Svaki puaa  ima razli iti sastojak, tj. jedan ima samo papir, drugi duhan i trei samo aibice. Trgovac ima sve tri komponente u neograni enim koli inama. Trgovac nasumice odabire dvije razli ite komponente, stavlja ih na stol te signalizira puaa ima da su sastojci na stolu. Jedino puaa  kojemu nedostaju sastojci stavljeni na stol, smije uzeti oba sastojka, signalizirati trgovcu te potom saviti cigaretu i popuaiti ju. Trgovac tada stavlja nova dva sastojka na stol i postupak se ponavlja. Prilikom rjeaavanja problema treba prvo uo iti da je postupak stavljanja sastojaka na stol i njihovo uzimanje kriti ni odsje ak kojeg treba zaatititi. Budui samo trgovac stavlja sastojke na stol, problema sa stavljanjem nema, ali bi dretvama puaa a trebalo zabraniti da gledaju na stol dok trgovac neato ne postavi. Kada na stolu neato ima, puaa i bi, u opem slu aju, trebali provjeravati pojedina no, kako se ne bi dogodilo da istovremeno pokuaaju uzeti sastojke sa stola. Najjednostavnije rjeaenje je zaatititi svaki sastojak na stolu s jednim binarnim semaforom. Trgovac bi tada nakon postavljanja dva sastojka na stol postavio ta dva semafora i ekao da se stol isprazni. Svaki od puaa a eka na dva sastojka, pa s dva uzastopna poziva funkcije ekajBSem eka na dodjelu oba sastojka. Opis dretvi koje simuliraju rad trgovca i puaa a prikazan je pseudokdom u nastavku. dretva Trgovac() { ponavljaj { (s1, s2) = odaberi_dva_razli ita_sastojka PostaviBSem(s1) PostaviBSem(s2) ekajBSem(stol) } do ZAUVIJEK } dretva Puaa (p) { (r1, r2) = sastojci_koje_puaa _nema(p) ponavljaj { ekajBSem(r1) ekajBSem(r2) PostaviBSem(stol) smotaj_zapali_puai() } do ZAUVIJEK } Ve i jednostavnija analiza navedenog koda pokazat e da se u takvom sustavu mo~e dogoditi potpuni zastoj, situacija u kojoj niti jedna dretva ne mo~e nastaviti s radom zbog zahtjeva za nekim sredstvom koji je zauzet od strane neke druge dretve. Naime, mo~e se dogoditi da jedan puaa  uzme jedan sastojak, a drugi puaa  drugi sastojak, tj. svaki od njih proe prvi poziv funkcije ekajBSem(r1), budui za svakog od njih r1 mo~e atititi drugi sastojak. Drugi poziv ekajBSem(r2) uzrokovat e blokiranje tih dretvi. Trgovac nee staviti nove sastojke jer mu nitko nee signalizirati da je stol prazan te tako svi stoje. U nekakvom pokuaaju popravljanja ovog rjeaenja moglo bi se dodatnim varijablama ozna avati stanje stola te bi npr. dretva puaa a nakon prolaska jednog semafora (dobivanja jednog sastojka) a~urirala stanje na stolu. Ako bi stol bio prazan tada bi signalizirala dretvi trgovca i prije nego ta dretva ima na raspolaganju oba sastojka. To, meutim, nije rjeaenje zadanog problema, u kojem se o ekuje da nakon ato trgovac stavi dva sastojka na stol jedan od puaa a zajam eno mo~e smotati i zapaliti cigaretu. Rjeaenje koje koristi samo semafore nije dobro, ako na raspolaganju stoje samo navedene funkcije za rad sa semaforima. Postojanje tog problema je davno uo eno te su ubrzo u jezgru dodane i funkcije koje mogu obaviti nekoliko operacija nad skupom semafora i to nedjeljivo: ako se bilo koja operacija ne mo~e obaviti, nee se obaviti niti jedna. Tako bi se gornji problem rijeaio kada bi umjesto dva uzastopna poziva funkcije ekajBSem imali samo jednu funkciju koja bi zauzela oba sredstva odjednom ili niti jedno, ako je samo jedno na raspolaganju. Uz pretpostavku da jezgrine funkcije koje mogu obavljati viae operacija nad skupom semafora nisu dostupne, jedno od moguih rjeaenja za zadani problem bila bi dodjela jednog semafora skupu sredstava. Tako bi mogli za svaku kombinaciju sastojaka {(papir, duhan), (papir, aibice), (duhan, aibice)} imati po jedan binarni semafor. Svaki puaa  bi ekao na samo jedan binarni semafor, a trgovac bi postavljao samo jedan od tri, ovisno o tome koje je sastojke odabrao i stavio na stol. Ovo je rjeaenje najprikladnije za zadani problem i ako se ~eli rjeaenje za njega tada dalje ne treba tra~iti. Meutim, ovo rjeaenje pretpostavlja da trgovac posjeduje znanje o tome koji semafor povezati s odgovarajuim parom sastojaka. Stvarni problemi koji se rjeaavaju u praksi raspola~u s viae sredstava kod kojih to nije jednostavno ili nije uope mogue na initi. Zato je u nastavku tra~eno drugo rjeaenje koje bi moglo biti primjenjivo na cijelu klasu sli nih problema. Slijedee rjeaenje pretpostavlja da se osim semafora mogu koristiti i neke pomone varijable koje e ozna avati stanje sredstava (sastojke na stolu). Pomone varijable moraju biti u dijelu spremnika koje je dohvatljivo svim dretvama u sustavu (npr. zajedni ki spremni ki prostor za dretve razli itih procesa ili globalne varijable za dretve unutar istog procesa). Ideja je da se dretvama puaa a jednoj po jednoj omogui uvid u sadr~aj stola. Dretva koja na stolu nae oba sastojka, uzeti e sastojke i signalizirati trgovcu da stavi dva nova sastojka, dok e dretva, koja ne pronae odgovarajue sastojke, stol prepustiti drugoj dretvi, a sama ponovno ui u red za pregled stola. Rjeaenje koje koristi navedena svojstva prikazano je u nastavku. dretva Trgovac() { ponavljaj { (s1, s2) = odaberi_dva_razli ita_sastojka stavi_sastojke_na_stol(s1, s2) PostaviBSem(stol_pun) ekajBSem(stol_prazan) } do ZAUVIJEK } dretva Puaa (p) { (r1, r2) = sastojci_koje_puaa _nema(p) ponavljaj { ekajBSem(stol_pun) ako (na_stolu_sastojci(r1, r2) = DA ) { uzmi_sastojke(r1, r2) PostaviBSem(stol_prazan) smotaj_zapali_puai() } ina e { PostaviBSem(stol) } } do ZAUVIJEK } Pomone varijable koriste se u pomonim funkcijama te one nisu izravno prisutne u pseudokdu. Ako su u po etnom stanju pri pokretanju dretvi oba binarna semafora neprolazna, trgovac stavlja sastojke na stol, puaa i redom provjeravaju sadr~aj stola te dretva koja ima trei sastojak uzima sastojke sa stola, signalizira trgovcu, i postupak se ponavlja. Na prvi pogled sve izgleda ispravno. Meutim, zamislimo slijedei slijed dogaaja u sustavu: trgovac stavlja dva sastojka na stol, jedan puaa  uzima sastojke i signalizira trgovcu, trgovac na stol stavlja opet iste sastojke. Budui je trgovac i drugi puta stavio iste sastojke na stol, ponovno ih jedino isti puaa  mo~e uzeti. Puaa  koji je uzeo sastojke potom prelazi u stanje  puaenja i u tom stanju mo~e ostati odreeno vrijeme (u rjeaenju nije navedeno koliko dugo). Preostala e dva puaa a cijelo to vrijeme naizmjence ispitivati sadr~aj stola iako se on nee mijenjati dok god prvi puaa  ponovo ne uzme sastojke sa stola. Iako se koriste semafori, u ovom se rjeaenju u nekim moguim stanjima sustava pojavljuje takozvano  radno ekanje . Dretve koje nemaju uvjete za nastavak rada i dalje optereuju sustav neprestanim provjerama stanja sustava. Iako se takvo stanje javlja rijetko u normalnom radu sustava, takvo rjeaenje openito nije prihvatljivo. Mnogo ozbiljniji problem mo~e nastati ako dretve puaa a nemaju isti prioritet, a redovi binarnih semafora su prioritetno organizirani. U takvom se sustavu mo~e dogoditi da upravo puaa  s najmanjim prioritetom ima trei sastojak, ali on nikada nee pristupiti stolu jer se druga dva puaa a s veim prioritetom u tome izmjenjuju. U takvom slu aju opet govorimo o potpunom zastoju iako se zapravo dvije dretve neprestano izmjenjuju u ispitivanju sadr~aja stola, ali niti jedna zapravo ne napreduje. Rjeaenje kojim mo~emo otkloniti gornja dva problema, je da svaki puaa  eka na svom binarnom semaforu, a trgovac pri stavljanju novih sastojaka postavlja sve semafore. Puaa  e tada samo jednom pogledati ato ima na stolu, dok e u slijedeem pokuaaju biti blokiran dok god trgovac ne stavi nove sastojke. dretva Trgovac() { ponavljaj { (s1, s2) = odaberi_dva_razli ita_sastojka stavi_sastojke_na_stol(s1, s2) PostaviBSem(p1) PostaviBSem(p2) PostaviBSem(p3) ekajBSem(stol_prazan) } do ZAUVIJEK } dretva Puaa (p) { (r1, r2) = sastojci_koje_puaa _nema(p) ponavljaj { ekajBSem(p) ako (na_stolu_sastojci(r1, r2) = DA ) { uzmi_sastojke(r1, r2) PostaviBSem(stol_prazan) smotaj_zapali_puai() } } do ZAUVIJEK } Rjeaenje je sli no ve spomenutom kada se za dva sredstva koristi isti semafor. Ipak, razlika je u tome ato dretva trgovca ne mora uspostavljati vezu izmeu sastojaka i dretvi puaa a ve im svima javlja da su novi sastojci na stolu. Puaa i pregledavaju sadr~aj stola pomou varijabli koje ozna avaju stanje na stolu, a ne izravno koriatenjem vrijednosti semafora. Zbog toga je ovaj pristup neato openi46 " d t x z RV^dfh$,f#j#t####L(}}oaUhm h4I5OJQJhm h4I5OJQJaJhm h4I5CJOJQJhsOJQJh4IhBfOJQJh4IOJQJ h4I5h4I5OJQJ h4I5CJ h4I5CJh4I5CJOJQJh"5OJQJh-<CJOJQJh"CJOJQJh"OJQJh"CJOJQJ h"5CJh_?;h"OJQJ 46 t v x z RTVfhVf#h#j# *$`gd4I $a$gd4I $da$gd4I "d$`gd4I"$da$ $dHHa$d(6B68j###-t99998:H=GIIIIIKhQ U@XBXDXFXgd4I & F r*$^`rgd4I *$`gd4I $da$gd4I $a$gd4IL(T(V(d(h((((((((()) )")+,+.+6+,,--t9v9x9999999994:6:8:<<<==<=>=H=CDCDٺٺٍٍٍٍٍٍٞٞم}ٍhhOJQJh2OJQJ hjh4ICJOJQJ^JaJ h8h4ICJOJQJ^JaJh8h4IOJQJ hbh4ICJOJQJ^JaJh_xCJOJQJ^JaJh4IOJQJh4ICJOJQJ^JaJ hZNh4ICJOJQJ^JaJ1DEFElEE"FjGGIIIIIIIII UFWXW@XBXFXXnYYYYҹ痄vhZZLZh@CJOJQJ^JaJh"CJOJQJ^JaJhDCJOJQJ^JaJhA)CJOJQJ^JaJ%h"CJOJQJ^JaJmHnHuh"OJQJjhA)UmHnHuh#fJh4I5OJQJh#fJh4I5OJQJaJh5CJOJQJh#fJh4I5CJOJQJ h4I5CJh4IOJQJ hjh4ICJOJQJ^JaJFXlXXXYBYnYYYYYZ,ZTZ|ZZ($d%d&d'dNOPQgdD,$d%d&d'dNOPQ`gdD&$d%d&d'dNOPQgdDYYZ Z,ZZ[ [^^R^V^^^n__``Vahaaag0gTgfghhjfjmnbuduuvvvww\wbwwxx&y6y\y^yûѻѻѻ仫тт%h@CJOJQJ^JaJmHnHuh<"CJOJQJ^JaJhOJQJ|&}}WS & F rEƀr&^`rS & F rEƀr&^`r}}|&Њ}PPP,$d%d&d'dNOPQ`gdD&$d%d&d'dNOPQgdDgd<"S & F rEƀr&^`r Њ(Tڋ.LrΌ P($d%d&d'dNOPQgdD,$d%d&d'dNOPQ`gdDč,.T$&Lk*$d%d&d'dNOPQ`gdD`$a$$da$DC$EƀR& `gd<" tiji i primjenjiviji na viae slu ajeva. U ovom rjeaenju se mo~e dogoditi da viae puaa a istovremeno gleda sadr~aj stola, ato je za konkretni slu aj i dozvoljeno. Kada to ne bi smjeli raditi bilo bi potrebno koristiti dodatni binarni semafor. Samom konstrukcijom ovo rjeaenje jako podsjea na rjeaenja s monitorima, koji su i napravljeni da rjeaavaju slo~ene probleme sinkronizacije. IV. PROBLEM BARIJERE Opi semafori se koriste kao brojila dogaaja ili slobodnih sredstava. Kod  problema proizvoa a i potroaa a koji komuniciraju preko ograni enog meu-spremnika, jedan opi semafor broji prazna mjesta u meuspremniku, a drugi puna. Proizvoa  eka na prvi semafor, tj. na prazno mjesto, a potroaa  na drugi semafor, tj. na barem jedno popunjeno mjesto. Po etna vrijednost prvog semafora treba odgovarati broju poruka koje stanu u meuspremnik, dok je po etna vrijednost drugog semafora nula, jer je u po etku meuspremnik prazan. Drugi problem sinkronizacije koji se esto javlja, a koji se rjeaava opim semaforom, jest problem barijere [5]. Treba sinkronizirati skupinu aktivnosti (dretvi) tako da sve aktivnosti dretvi stignu do odgovarajue to ke prije nego bilo koja od njih ide dalje. Jednostavan primjer za taj problem mo~e biti ukrcavanje skijaaa u kabinu ~i are. Mo~e se zahtijevati da se kabina pokree tek kada se napuni do posljednjeg mjesta. Jedan on moguih rjeaenja tog problema prikazan je u nastavku. dretva skijaa () { ekajOSem(ulaz) ekajBSem(k) br++ ako je (br < N) { PostaviBSem(k) ekajOSem(prolaz) ekajBSem(k) } br-- ako je (br > 0) { PostaviOSem(prolaz) } ina e { *pokreni kabinu* za i=1 do N { PostaviOSem(ulaz) } } PostaviBSem(k) *vo~nja ~i arom i silazak na vrhu* } Po etna vrijednost semafora ulaz treba biti jednaka broju mjesta u kabini, tj. broju N, dok je po etna vrijednost semafora prolaz nula. Potencijalni putnici ~i arom moraju ekati na prazno mjesto kako bi uali u kabinu. Vrijednost semafora ulaz je upravo jednaka broju praznih mjesta u kabini. Kada semafor doe do vrijednosti nule putnici koji ve nisu u kabini biti e blokirani na tom semaforu. Svi putnici koji uu u kabinu, osim zadnjeg, biti e blokirani na semaforu prolaz gdje ekaju da se kabina napuni. Zadnji e putnik, vidjevai da je kabina puna, tj. varijabla br ima vrijednost jednaku N, po eti oslobaati ostale putnike iz tog blokiranog stanja. Zadnji e putnik (zadnji koji je uaao u kabinu) samo jednom postaviti semafor prolaz. Putnik kojeg je oslobodio (tj. dretva) oslobodit e slijedeeg i tako sve dok se i zadnji ne oslobodi iz reda. Zadnji putnik osloboen iz semafora prolaz  pokree kabinu (ili signalizira operateru) te postavlja semafor ulaz na vrijednost N, jer je slijedea kabina koja dolazi iza trenutne prazna. Predlo~eno rjeaenje daje svakom putniku  priliku da se upozna sa ostalim putnicima u istoj kabini, prije nego li kabina krene, odnosno prije po etka punjenja slijedee kabine. Ovakva prilika mo~e biti potrebna u razli itim primjenama, a ne samo ovom hipotetskom primjeru. Ako ne postoji takav zahtjev, gornji algoritam se mo~e pojednostaviti tako da zadnja dretva, tj. zadnji putnik koji ulazi u kabinu, pokree kabinu, otpuata sve dretve u kabini koje ekaju na semaforu prolaz i postavlja semafor ulaz N puta. Binarni semafor k mora se koristiti da bi se sprije ilo istovremenu promjenu varijable br. Ponekad je potrebno semaforu poveati vrijednost za viae od jedan. U prikazanom primjeru je to na injeno koriatenjem petlje u kojoj se vrijednost semafora poveava za jedan. Operacijski sustavi uglavnom imaju funkcije kojima je to mogue napraviti i sa samo jednom (jezgrinom) funkcijom. U Win32 okru~enju [6] funkcija ReleaseSemaphore prima parametar lReleaseCount koji ozna ava za koliko treba poveati vrijednost semafora. UNIX funkcija semop [7] omoguava istovremeno obavljanje viae operacija nad skupom semafora. Svaka se operacija definira pomou oznake semafora te cijelog broja koji ozna ava operaciju koju treba obaviti. Ako je broj pozitivan, semafor se poveava, ako je negativan semafor se pokuaa umanjiti za zadani broj, ali tako da vrijednost ne postane negativna. V. PROBLEM STAROG MOSTA U prethodnim primjerima semafori nisu bili dovoljni za sinkronizaciju, ve su se koristile i dodatne pomone varijable. `to je problem slo~eniji to je semafor samo instrument ostvarenja osnovne sinkronizacije, dok se dodatne varijable koriste za utvrivanje mogunosti nastavka rada dretve. Sinkronizacija monitorom je korak u tom smjeru. Funkcije koje slu~e za ostvarenje monitora su po svojoj strukturi jednostavne gotovo kao i funkcije semafora, dok su istovremeno upravo graene da budu koriatene kao pomone funkcije. Nastavak rada ili blokiranje svog rada dretva poduzima na temelju ispitivanja potrebnih uvjeta, a ne stanja monitora. Uostalom, monitor nema uz svoju strukturu podataka nikakvo stanje ili broj. Jedino ato se za monitor mora dati razlu iti jest je li trenutno neka dretva unutar monitora ili nije. Upravo e to pokazati primjer rjeaenja sinkronizacije  problema starog mosta . Problem starog mosta [4] sastoji se u tome ato treba sinkronizirati dretve koje predstavljaju automobile koji prelaze preko uskog starog mosta kao na sl. 2. Budui je most uzak, u istom trenutku auti ga smiju prelaziti samo u jednom smjeru. Kako je most star, na njemu istovremeno smije biti najviae tri automobila. Za rjeaenje problema moraju se koristiti dodatne varijable koje e ozna avati stanje sustava. Potrebno je pratiti u kojem smjeru trenutno voze automobili na mostu te koliko ih trenutno ima na mostu. Svaki automobil, kada ~eli prijei preko mosta, mora pogledati ove dvije varijable i zaklju iti smije li on na most. Provjera i mijenjanje varijabli stanja sustava je kriti ni odsje ak i mora se zaatititi tako da se obavlja unutar monitora. Rjeaenje koje je zasnovano na re enim pravilima prikazano je u nastavku. dretva automobil () { smjer = smjer_u_kojem_auto_ide Kreni_na_most(smjer) *prijei_most* Sii_s_mosta(smjer) } m-funkcija Kreni_na_most(smjer) Ui_u_monitor(m) dok je ( auti_most = 3 ( (smjer `" smjer_most ( auti_most > 0) ){ Uvrsti_u_red_uvjeta(m, smjer) } auti_most++ smjer_most = smjer Izai_iz_monitora(m) } m-funkcija Sii_s_mosta(smjer) Ui_u_monitor(m) auti_most-- ako je (auti_most = 0) { Oslobodi_iz_reda_uvjeta(m, 1-smjer) Oslobodi_iz_reda_uvjeta(m, 1-smjer) Oslobodi_iz_reda_uvjeta(m, 1-smjer) } ina e { Oslobodi_iz_reda_uvjeta(m, smjer) } Izai_iz_monitora(m) } Pri silasku auta s mosta potrebno je smanjiti broj automobila na mostu za jedan te potom propustiti slijedei automobil ili viae njih na most. Ukoliko je to bio zadnji automobil na mostu, mogue je da na prelazak mosta s druge strane eka viae automobila, pa im treba omoguiti prilaz mostu i to za najviae do tri takva auta, jer je to kapacitet mosta. Ukoliko automobil nije bio zadnji, propuata se slijedei auto koji vozi u istom smjeru, ako takav postoji. Funkcija Oslobodi_iz_reda_uvjeta ne mijenja stanje sustava, ako u redu ekanja koji se kao parametar daje funkciji nema dretvi. Zato se ona mo~e pozvati i bez prethodne provjere broja dretvi u tom redu. Uz pretpostavku da varijabla smjer mo~e imati vrijednost 0 ili 1, auti za smjer 0 ekat e u redu uvjeta (m, 0), dok e auti za smjer 1 ekati u redu (m, 1). Varijabla smjer se ne mijenja kada automobil silazi s mosta jer se ona postavlja samo kada automobil prilazi mostu. Analizom predlo~enog rjeaenja mo~e se ustanoviti da se sinkronizacija obavlja ispravno. Ne dopuata se vo~nja viae od tri automobila na mostu, svi auti na mostu voze u istom smjeru, a kada jedan sie drugi e moi na most samo ukoliko ide u istom smjeru. Ako automobil ne mo~e na most, on e stati u red uvjeta i nee optereivati sustav, tj. ne postoji radno ekanje. Takoer ne postoji situacija koja mo~e izazvati potpuni zastoj. Meutim, kada bi promatrali kako se sustav ponaaa kroz dulje vremensko razdoblje, uvidjeli bi neke mogue ne~eljene pojave. Mogue je da u nekom trenutku iz smjera u kojem automobili upravo prelaze most doe navala automobila. Prema predlo~enom algoritmu, automobili sa suprotne strane nee biti u mogunosti doi na most dok god automobili iz trenutnog smjera vo~nje prelaze most. Budui to u ovom slu aju mo~e potrajati, neki automobili mogu jako dugo ekati na prelazak mosta. Teorijski se ekanje mo~e produ~iti u beskona nost, tj. neki automobili nikada nee prei most. Ovaj problem se naziva  izgladnjivanjem po uzoru na istu pojavu kod sinkronizacije pet filozofa [1]. Rjeaavanje problema izgladnjivanja, tj. uvoenje nekakve pravednosti u raspodjelu raspolo~ivih sredstava, vrlo je slo~en problem. Problemu treba oprezno pristupiti kako bi se novim rjeaenjem, koje e nu~no biti slo~enije, ne izazovu ne~eljene posljedice, kao ato je to potpuni zastoj ili radno ekanje ili pojava stanja u sustavu koje je sinkronizacija trebala onemoguiti. Za problem starog mosta treba najprije definirati pojam izgladnjivanja, tj. je li ono vremenski ili nekako druk ije odreeno. Ako se ~eli postii da auti ne ekaju viae od nekog unaprijed zadanog vremena, treba za svaki dolazak automobila pamtiti vrijeme dolaska, a automobile svrstavati u redove uvjeta organizirane po redu prispijea. Svaki bi automobil prije pristupa mostu prvo trebao provjeriti prvi auto s druge strane mosta i njegovo vrijeme ekanja te tek ako ustanovi da tamo nema nikoga ili postoji automobil koji mo~e joa ekati, mo~e provjeriti ostale uvjete. Ovakvo rjeaenje s vremenima zahtijevalo bi slo~enu strukturu podataka (liste) te nee biti dalje razmatrano u ovom radu. Postoje i jednostavniji na ini rjeaavanja navedenog problema. Mogue je ograni iti ili duljinu reda s jedne strane mosta ili broj automobila koji su preali preko mosta dok je s druge strane ekao automobil. Prvi pristup s pokuaajem ograni avanja duljine reda s jedne strane mosta u nekim slu ajevima nee rijeaiti problem izgladnjivanja. Tako primjerice auti s one strane mosta na kojoj postoji red krai od zadanog mogu i dalje beskona no ekati na prelazak mosta, ako na tu stranu viae ne prilaze automobili te se nikada nee dostii granica koja bi automobilima sa suprotne strane sprije ila prelazak mosta. S druge strane, ovakav pristup mo~e i dovesti do potpunog zastoja, ako se s obje strane stvori red automobila vei od dozvoljenog. Drugi pristup, kod kojeg se ograni ava broj prelazaka u jednom smjeru dok s druge strane ekaju automobili, jako podsjea na semafore na kri~anjima. Oni, istina, rade na vremenskoj osnovi, ali i dalje propuataju skupinu automobila u jednom smjeru, te potom drugu skupinu u drugom smjeru. Za ostvarenje takve sinkronizacije bit e potrebne dodatne varijable koje e ozna avati stanje sustava. Za sustav e biti potrebno definirati koliko se automobila u nekom trenutku nalazi sa svake strane, u kojem se smjeru kreu automobili preko mosta te koliko je automobila proalo preko mosta u tom smjeru dok je s druge strane ekao barem jedan automobil. Svaki e automobil prije prelaska mosta najprije gledati u kojem smjeru se vozi na mostu. Ako se vozi u njegovu smjeru, provjerava postoji li automobil koji eka na prelazak u suprotnom smjeru i koliko je automobila prealo preko mosta dok je on ekao. Ako je taj broj manji od neke zadane vrijednosti, tek tada auto mo~e na most u slu aju da se na mostu nalazi manje od tri automobila. U svakom drugom slu aju automobil, tj. dretva kojom ga simuliramo, ulazi u red ekanja. Nakon ato je automobil krenuo na most potrebno je provjeriti je li to prvi automobil u tom smjeru jer on u tom slu aju mora brojila prelaska postaviti na nulu. Prilikom silaska s mosta potrebno je poveati broj automobila koji su preali preko mosta u tom smjeru, ali samo ako s druge strane postoji red. Potom treba ispitati stanje sustava. Ako je to bio zadnji automobil u tom smjeru, tada je potrebno propustiti aute u suprotnom smjeru. Ina e treba propustiti slijedei automobil u istom smjeru. Sve navedeno ugraeno je u slijedee rjeaenje. dretva automobil () { smjer = smjer_u_kojem_auto_ide Kreni_na_most(smjer) *prijei_most* Sii_s_mosta(smjer) } m-funkcija Kreni_na_most(smjer) Ui_u_monitor(m) eka[smjer]++ dok je ( (smjer `" smjer_most ( auti_most > 0) ( proalo[smjer] > MAX ( auti_most = 3 ) { Uvrsti_u_red_uvjeta(m, smjer) } auti_most++ ako je (smjer `" smjer_most) { proalo[1-smjer] = 0 smjer_most = smjer } eka[smjer]-- Izai_iz_monitora(m) } m-funkcija Sii_s_mosta(smjer) Ui_u_monitor(m) auti_most-- ako je ( eka[1-smjer] > 0) } proalo[smjer]++ } ako je (auti_most = 0) { Oslobodi_iz_reda_uvjeta(m, 1-smjer) Oslobodi_iz_reda_uvjeta(m, 1-smjer) Oslobodi_iz_reda_uvjeta(m, 1-smjer) } ina e { Oslobodi_iz_reda_uvjeta(m, smjer) } Izai_iz_monitora(m) } Prikazano rjeaenje nije znatno slo~enije od prethodnog i lako je pratiti slijed odlu ivanja koje mora napraviti svaki automobil. Monitor se naj eae koristi za slo~ene slu ajeve sinkronizacije gdje se na mnogo lakai i razumljiviji na in rjeaava problem sinkronizacije nego sa semaforima. Jedan od akolskih primjera takvih problema je problem pet filozofa [1]. Semafori su u ovom slu aju potpuno neprikladni, dok je rjeaenje s monitorima vrlo jednostavno i razumljivo. VI. ZAKLJU AK Problem sinkronizacije sustava dretvi je slo~en problem. Pri rjeaavanju problema uvijek treba krenuti od pravila koja se u zadanom sustavu moraju poativati. Rjeaavanje problema naj eae je iterativan postupak u kojem se rjeaenje dobiveno u prethodnom koraku analizira te se poboljaava u slijedeem. Poboljaanja se naj eae odnose na otklanjanje nekih problema uo enih u prethodnom rjeaenju. Druga poboljaanja mogu biti usmjerena na pojednosta-vljenje. Jednostavno rjeaenje je mnogo bolje od slo~enog jer se takvo rjeaenje lakae analizira i lakae uo avaju potencijalni problemi. Jednostavno rjeaenje se uz mnogo manje truda mo~e prilagoditi nekim novim uvjetima. Za svako od predlo~enih rjeaenja u ovom radu dano je podrobno objaanjenje problema koji se mogu pojaviti u sustavu. Problemi na koje je potrebno paziti pri koriatenju algoritama sinkronizacije mogu se svrstati u nekoliko kategorija. Prvo i osnovno, algoritam mora poativati pravila koja su unaprijed utvrena za zadani sustav, odnosno, ne smije dopustiti da se sustav nae u nedozvoljenom stanju. Drugo, algoritam mora omoguiti normalni rad sustava i ne smije dovesti do stanja potpunog zastoja. Potpuni zastoj mo~e se manifestirati u dva oblika. U prvom su sve dretve blokirane na pozivima jezgrinih funkcija s kojima se sinkronizacija obavlja (npr. semaforima). U ovom se obliku potpuni zastoj javlja u prvom pokuaaju sinkronizacije problema puaa a cigareta. Drugi oblik dopuata da neke dretve nisu blokirane na tim pozivima, ali se vrte u petlji iz koje ne mogu izai i nastaviti s korisnim radom. Trei problem sinkronizacije na koji treba pripaziti jest radno ekanje. Iako se sinkronizacija mo~e obaviti i bez jezgrinih funkcija, one se ipak koriste kako bi se rasteretio sustav. Dretva koja ne mo~e nastaviti s radom treba biti blokirana i prepustiti procesor pripravnim dretvama, a ne u petlji nanovo provjeravati uvjete za nastavak rada. U algoritmima u kojima se koriste jezgrine funkcije mo~e se takoer pojaviti oblik radnog ekanja, kao ato je to pokazano u primjeru  problema puaa a cigareta . Slijedei problem na koji treba pripaziti jest problem izgladnjivanja. Problem se manifestira na na in da se nekoj dretvi mo~e uskratiti koriatenje pojedinog sredstva na neodreeno dugo vrijeme. Uzrok tome mogu biti nove dretve u sustavu koje prilikom zahtjeva za sredstvima pronalaze potrebna sredstva slobodnim. Problem se javlja u sustavima u kojima dretve za nastavak rada trebaju viae od jednog sredstva ili je uvjet koji mora biti zadovoljen za nastavak njihova rada sa injen od nekoliko poduvjeta. Primjer u kojemu se pojavljuje izgladnjivanje je prvo rjeaenje za  problem starog mosta . Budui je problem prili no jednostavan, moglo se nai i relativno jednostavno rjeaenje koje izbjegava izgladnjivanje. U opem slu aju rjeaavanje problema izgladnjivanja mo~e biti znatno te~e te mo~e zahtijevati i dodatne slo~ene podatkovne strukture za prikladno rjeaenje. LITERATURA [1] L. Budin,  Operacijski sustavi  predavanja , 2003. [2] M. Jones,  What really happened on Mars? , http://research.microsoft.com/~mbj/Mars_Pathfinder/ [3] D.L. Parnas,  On a Solution to the Cigarette Smoker's Problem, Comm. of the ACM, Vol 18, No 3, March 1975. [4] Synchronization Problems, http://inst.eecs.berkeley.edu/-~cs162/fa06/hand-outs/synch-problems.html [5] http://en.wikipedia.org/wiki/Barrier_(computer_science) [6] (Win32) Synchronization Functions, http://msdn2.micro-soft.com/en-us/library/ms686360.aspx [7] (UNIX) Semaphore facility, http://www.opengroup.org/on-linepubs/007908799/xsh/syssem.h.html [8] (POSIX) threads, http://www.opengroup.org/onlinepubs/-007908799/xsh/pthread.h.html     dretva u redu aktivna dretva unutar monitora Izai_iz_monitora Monitor Oslobodi_iz_reda_uvjeta Uvrsti_u_red_uvjeta Ui_u_monitor Sl.  SEQ Sl. \* ARABIC 2. Problem starog mosta Sl.  SEQ Sl. \* ARABIC 1. Model monitora Lr̻&LVfļ޼ 4jz`,$d%d&d'dNOPQ`gdDʼμ.2jz2:ؿrv FH\ٳqq hDahDaCJOJQJ^JaJhDaOJQJh"CJOJQJ^JaJh"OJQJ%h@CJOJQJ^JaJmHnHu%h"CJOJQJ^JaJmHnHu%hc'CJOJQJ^JaJmHnHu%hCJOJQJ^JaJmHnHu%hDaCJOJQJ^JaJmHnHu,\|NX(*,2NhdfF٪ꏁnYnYnnn(h"CJOJQJ^JaJmHnHo(u%h"CJOJQJ^JaJmHnHujhc'UmHnHu%hc'CJOJQJ^JaJmHnHuh@OJQJhc'OJQJ h"5h"5OJQJh"5CJOJQJ h"5CJ h5CJ h"5CJh"OJQJaJh"OJQJh"CJOJQJ^JaJ*,2"Rv,$d%d&d'dNOPQ`gdD*$d%d&d'dNOPQ`gdD`gdc'$a$$da$JBrvx40J`,$d%d&d'dNOPQ`gdDFH~@BprvxDHrtnprBֲֲֲևֲֲֲyyf^V^^V^V^h=<OJQJh"OJQJ%hc'CJOJQJ^JaJmHnHuhc'CJOJQJ^JaJ(h"CJOJQJ^JaJmHnHo(u+h@h@CJOJQJ^JaJmHnHuh"CJOJQJ^JaJ+ jh"CJOJQJ^JaJmHnHu%h"CJOJQJ^JaJmHnHu+ jh"CJOJQJ^JaJmHnHu!BL6BZd@*,^8hrϼϼ򼑼{{mhc'CJOJQJ^JaJ+ jh"CJOJQJ^JaJmHnHu+ jh"CJOJQJ^JaJmHnHu(h"CJOJQJ^JaJmHnHo(u%h"CJOJQJ^JaJmHnHu%hc'CJOJQJ^JaJmHnHuhOJQJh"OJQJh"CJOJQJ^JaJ*.0.r:b,$d%d&d'dNOPQ`gdD*$d%d&d'dNOPQ`gdD`R8jt 2PR,$d%d&d'dNOPQ`gdD 02PdnNRTV\npJn0p0r00ɨɨ쨠~umm^W h"5CJh{Uoh"CJOJQJaJh{UoOJQJh"5OJQJh5CJOJQJh"5CJOJQJh{Uoh"5CJaJh"OJQJhc'CJOJQJ^JaJ%hc'CJOJQJ^JaJmHnHuh"CJOJQJ^JaJ(h"CJOJQJ^JaJmHnHo(u%h"CJOJQJ^JaJmHnHu"dnNPRnpp !%)n0$da$$a$ $da$gd{Uo`,$d%d&d'dNOPQ`gdDn0p0r000012v334r5$6&6(6,6$ :^`:a$ :^`:gd{Uo$ :^`:a$gd{Uo :^`:gd{Uo$da$$a$ $da$gd{Uo `gd{Uo00000N2n2 3"3B3D3d4f4&5(555$6(6*6.6064666:6<6B6\6^6`666ߵߡߍߡߡ߀xtxtxtxtfUQfUh2 h4>h:CJOJQJ^JaJh:CJOJQJ^JaJhjhUh"CJmHnHsH u'h@h,2CJOJQJmHnHsH u'h@h{UoCJOJQJmHnHsH u*h@h"6CJOJQJmHnHsH u'h@h ^CJOJQJmHnHsH u'h@h"CJOJQJmHnHsH u h"5CJ h"5,6.6264686:6>6@6B6^6`66666667 72747P7R777-$a$gd@$*$`a$gd:$a$gd:gd:6666667 72747P7R7Z7\77777777777777­­„p[p[E[*hA)hA)5CJOJQJaJmHnHu(jhA)hA)5CJOJQJUaJhA)hA)5CJOJQJaJh@*h@h@5CJOJQJaJmHnHu$hA)5CJOJQJaJmHnHu(jh@h@5CJOJQJUaJh@h@5CJOJQJaJ h:h:CJOJQJ^JaJh_h:5 h4>h:CJOJQJ^JaJh2788888h"CJmHnHsH uh3{ahA)*hA)hA)5CJOJQJaJmHnHuhA)hA)5CJOJQJaJ78888$ :^`:a$-$a$gdA)4PPP. A!"#n$n% M 0PPP. A!"#n$n% P0 SSM 0PPP. A!"#n$n% P0 SS`!" %Ȭ|iMc t@=((k x͛ tUEoB@@6M BGpD "(K%HDD Dp9A( 8" (&AEo$8 {vw_}uTHͿ(֒@q(\/[c.*ϳmOr1[}GrbRAKG}Zeʆ i&P(֎e ?Y 5wy`P[0`*WUp=+gKy|4 gq+QW]E^K i{]SBԩ>X,T@?Ŀz~i._CFʾGX_3ŽtwFC:3H;-뼪`@NGgԆuPT\}\fq^sQ(rc8K?Ǫi([eEh}^R^ w<"{פ 2sTijj/&5oSKU{7O:߃c;.TGHcOp.Z6C@"ty/꺒\H}jHW溆\ڀ(ǣ ('>Yה]KR8}<#et0Eזf2[Hy<[ɋ,7J uGy].yHK>uW)EnK%M{.5Meze hP 44}$+|0@Z V&A1CIv&In1ä.w܌H2_x A~k,J/~LstGHN;x0 )]r ).r3!@{:I;*7-rw|\75Vr%_+-ji&Tsq4!ב)WpMP]b#r\^qD3I$|kw\ _֙bh`' +LhJEĖ(I:L Ҙrw'CҨ~9e1u%tLA-Je+ Q{Y6[K%[J]͖O?]|Γ}=&r&Y:߻ޗ/lf'eP9E~1S@f7-2h/4;hL6Ze]c;dh+z멩Kͼu6[{zy˨2F-gP8Zw<Vu;W]SZŃXQ>mUAȀ+ 4Rw(5ֱjUcVN9VmũF<Xu2[ug^UTUq¾>߂u ǪQj WRTڭc?8ڝ5ZEQZի_}kQ9K-%q,TOsoߧ~*T4ǪxcXYH}$ǪL: u^zL·I;q;g31߃C-OW[ʇh>@^:wa;ῃ q-BYd^ 58D#(8r!."+D\g ~dv`}I/zmln̆ y˅k[54 Cy$G} RaT荁hDa7qmҎFY{qYOf5MA332@2>Ez ~>`2cu,L:rBdQ`4H!2Vs"T T6t0çAg{,ͪ2JK`$w~G 6M(o[Ѿ v~;;1`,Sў 4ا/ iI^*tS?q ^ l˟ 羪b"X([(?a ~ c,Cr]s@otC,E%/hgu,^ N0゠1W׵^sǪoO3!|29V(c|Ӗ6(Ǫ[Xy_7(Ǫuv]Xuא&9@OS ߂^@M[H=Ggv`?~ZjKtaϢ^&P~ Ϡ9-}6K{/kp1=I Od/{)%Po8 b:~a h"HGy:g=vς_ ΄tIGkv43^ .:xfOgbaKc Q +X.REGڠ-Ќ^fa,tc(kDWāƠO ,8o_3@fM1 !J7CAFdԏc`7K*A=vς_ L΁~FY/y=ù*6M67 z EĽ%|{TUb8V3`^v[N\!t?~ tAX}}/8ı\Nz^ 9k/+ }]f)_:V !UW:oYH{nP2I&GfrOt vuD[شmeb-Erv%|Vw4VBeh.RXXوi-=ùF"MH4! p_ u ʰ XjJh R=hՅfhG"F-Ī6~iG=xC7 y;)؊mY|3|| P.`cy7Y_s.y֠`?G uXlm5-gNW_Ė|74%t7߆݄zkF7{iu/d~q[x~O.Q5.F@F Normal7$8$OJQJ_HmHsHtHL@L Heading 1 @&5>*OJQJ\aJH@H Heading 2 x@&5OJQJ\aJD@D Heading 3 h@&^h 5\aJB@B Heading 4 h@&^h>*aJ@@@ Heading 5 @&^5\>@> Heading 6 @&^>*@@@ Heading 7 @&^6]@@@ Heading 8 @&^6]@ @@ Heading 9 @&^6]DA@D Default Paragraph FontViV  Table Normal :V 44 la (k(No List >*> Endnote ReferenceH*4@4 Header  !H&H Footnote Reference CJEHaJ6"6  Footnote Text>@> Normal Indent ^FOBF Naslov$da$5OJQJ\aJZObZ Glavni naslov$a$5CJ$OJQJ\aJ$NObN Novi paragraf$d$0`a$0Or0 Text$d$a$HObH Formula  !d`BObB Podnaslov1 dCJaJJObJ Podnaslov2 $x5CJ\aJ^O^ Reference)$ @@d^@`a$CJaJDObD Opis slike$d$a$CJaJFOF Zaglavlje  ! OJQJaJ<OA< Naslov aCJOJQJaJ8O8 Okvir sliked>O> Unos slike $$a$NON Opis slike a!$a$ OJQJaJ0Oa"0 Sazetak"d6O6 Okvir 2 li#d6Ob6 Okvir 1 li$d<OR< Adresa%$da$CJaJ8Ob8 Footnote&$da$<O< Poc. formule '$6U@6 Hyperlink >*B*phHH  Balloon Text)CJOJQJ^JaJB'B Comment ReferenceCJaJ44  Comment Text+@j@ Comment Subject,5\0"@0 hCaption-5\/BKdy~xwvu/BKdy=\6\\A:;<=)*+34c  !$& (!("(#(6(E(u(((((((())*)>)V)q))))+- 0366667)7E7b7s7u7v77777 8(8J8h8x888888m::::=?@@AACAhA~AAAAAAAAB&B9BgBBBBBBBBEEE F FHJJJ-J=JEJZJoJJJJJJJJJK)K1K6KHKnKpKqKQTTT U UX[[[\\/\F\H\I\i\}\\\\\\]-]/]0]O]c]r]]]] ^^A^F^^^`^a^ bafgj\ksmss t-tEtWtntptqttttttuAuFuUuvuuuuuuuuu vvٍ>RICub$9 h! |ӾN @ " (  P  # A#" `f  s * n Q%$ p3 @#" P2 q  "` B2 r "` =  B2 s "`  = ZB t S Dc d  u s *"` Q3  v s *"`w  w s *"`w}  x s *"`G E B2 y "`kB2 z "`kZB { S DabZr | S GHaI) arb } 6G5hHI\1 ~ s *"`+M ZB  S Dc d 9V2  # "`  uV2  # "` w "B2  "`"w%$  s *"`+  "   s *"`+"%$ f  s *   B S  ?/@ | w} [[4p]14  4 4-23:=)+24  @ A U W  24BCeguv}fh !!""%%'' (#(6(9(E(((((())) ))v)))))++++,+U+c+++h,i,,,,,--////g0h0u0w01466666g7s7v777777778888888::@@AAAAAAAABB&BBBBCCEEEE F FJqKKKKKKKdLeLLLOMPMMMMMYN[NNN7OPeQfQ~QQQQQQ2S3SPSQSSSTTTTT UXXXXYY(Y*Y[[[l\|\\\\\]]],]R]b]f]r]u]]]]]]] ^^^^@^I^]^a^M`N```aaaabagajaaaaaaammmmoooopqstttt#uAuIuUuXufuuuuuuuu vvvZvsvyvvvvvvvvw%w.wBwFwxxyyy!y+y,y||‡ćՇׇއ  :NPSm{@A9=(+24bc  !!$$&&(#(5(9(D(K(t({((((((((((((() )))))0)=)D)U)\)p)t)))))++-- 0 0336666667 7(7/7D7K7a7e7r7s7u7v77777777788'818I8S8g8n8w8888888888l:m:::::::==??@@AAAABAIAgAnA}AAAAAAAAAAAAAABB%B,B8B?BfBpBBBBBBBBBBBBBEE F FHHJJJJ,J0J}vgA)X:)kc'F<"@tD"Da!g2s>@hp deskjet 3500 seriesNe01:winspoolhp deskjet 3500 serieshp deskjet 3500 series< C 4dXXA4DINU"Pn#{? SMTJhp deskjet 3500 seriesInputBinFORMSOURCERESDLLUniresDLLHPPreAnalysisFalseMSPreAnalysisFalseHPReportSymmetricMarginsFalseHPPrintPreviewFalseHPBorderLessPhotoFalseHPBorderLessAutoFitFalseHPOutputOrderReverseTrueHPOrientRotate180FalseJobUITruePaperSizeA4OrientationPORTRAITHPDocPropResourceDatahpzhl3xq.cabHPNUseDiffFirstPageChoiceTrueHPPrintInGrayScaleFalsePrintQualityBestPrintQualityGroupPQGroup_1HPColorModeCOLOR_MODEHPPDLTypePDL_PCL3HPXMLFileUsedhpf39003.xmlHPPosterPrintingFalseHPPosterPrintingOptionPOSTER_2HPMediaTypeTreeviewPopupTrueColorModeColor24TextAsBlackFalseCollateONMediaTypePLAINResolution600dpiPQDPIInstalledHPMirrorPrintFalseHPAutoDuplexScalingTrueHPPrintOnBothSidesManuallyFalseHPManualDuplexDialogItemsInstructionID_01_FACEUP-NOROTATEHPManualDuplexPageRotateUserRotateHPManualFeedOrientationFACEUPHPSpeedMechFastDraftHPOutputBinOrientationFACEUPHPManualDuplexDialogModelModalHPManualDuplexPageOrderOddPagesFirstHPMapManualFeedToTray1FalsePSAlignmentFileHPZlA3xqPSServicesOptionLaunchToolBoxHPConsumerCustomPaperHPCustomHPBornOnDateHPBODHPInputColorSpaceCOLORSMARTHPDriverDataTRUEHPDisplayPrintingHelpRegPathESPRITSupportedTrueHPRESDLLNameHPFRS3xqHPRedEyeReductionOffHPDigitalImagingHPHomePrintingHPSmartFocusOnHPContrastOffHPDigitalFlashOnHPSharpnessOffHPSmoothingOffHPJpegPngPassthroughTrueHalftoneHT_PATSIZE_DEFAULTHPHTDLLNameHPFIG3xqHPMHDLLNameHPFIE3xqHPCRDCommandTrueHPSendUnitMeasureCommandTRUEPIUPH dA4 [none] [none]Arial4P d?LEONARDO<Automatic>600dpiCustom Print SettingsingdC:\Documents and Settings\Leonardo\Local Settings\Temp\hpzEN3xq.hlpType new Quick Set name herexB xB tI {C zE uD @splwow64.exeC:\WINDOWS\splwow64.exehp deskjet 3500 series< C 4dXXA4DINU"Pn#{? SMTJhp deskjet 3500 seriesInputBinFORMSOURCERESDLLUniresDLLHPPreAnalysisFalseMSPreAnalysisFalseHPReportSymmetricMarginsFalseHPPrintPreviewFalseHPBorderLessPhotoFalseHPBorderLessAutoFitFalseHPOutputOrderReverseTrueHPOrientRotate180FalseJobUITruePaperSizeA4OrientationPORTRAITHPDocPropResourceDatahpzhl3xq.cabHPNUseDiffFirstPageChoiceTrueHPPrintInGrayScaleFalsePrintQualityBestPrintQualityGroupPQGroup_1HPColorModeCOLOR_MODEHPPDLTypePDL_PCL3HPXMLFileUsedhpf39003.xmlHPPosterPrintingFalseHPPosterPrintingOptionPOSTER_2HPMediaTypeTreeviewPopupTrueColorModeColor24TextAsBlackFalseCollateONMediaTypePLAINResolution600dpiPQDPIInstalledHPMirrorPrintFalseHPAutoDuplexScalingTrueHPPrintOnBothSidesManuallyFalseHPManualDuplexDialogItemsInstructionID_01_FACEUP-NOROTATEHPManualDuplexPageRotateUserRotateHPManualFeedOrientationFACEUPHPSpeedMechFastDraftHPOutputBinOrientationFACEUPHPManualDuplexDialogModelModalHPManualDuplexPageOrderOddPagesFirstHPMapManualFeedToTray1FalsePSAlignmentFileHPZlA3xqPSServicesOptionLaunchToolBoxHPConsumerCustomPaperHPCustomHPBornOnDateHPBODHPInputColorSpaceCOLORSMARTHPDriverDataTRUEHPDisplayPrintingHelpRegPathESPRITSupportedTrueHPRESDLLNameHPFRS3xqHPRedEyeReductionOffHPDigitalImagingHPHomePrintingHPSmartFocusOnHPContrastOffHPDigitalFlashOnHPSharpnessOffHPSmoothingOffHPJpegPngPassthroughTrueHalftoneHT_PATSIZE_DEFAULTHPHTDLLNameHPFIG3xqHPMHDLLNameHPFIE3xqHPCRDCommandTrueHPSendUnitMeasureCommandTRUEPIUPH dA4 [none] [none]Arial4P d?LEONARDO<Automatic>600dpiCustom Print SettingsingdC:\Documents and Settings\Leonardo\Local Settings\Temp\hpzEN3xq.hlpType new Quick Set name herexB xB tI {C zE uD @splwow64.exeC:\WINDOWS\splwow64.exegg4)gg 0138AtD`` `````(`:`<`F`h`j`n`x``UnknownDomagoj JakoboviLeonardo Jelenkovic Gz Times New Roman5Symbol3& z Arial?5 z Courier NewcCG Times (W1)Times New RomanM" Univers (W1)Arial9TimesCRO3Dutch5& zaTahoma;Wingdings"V LL&TL&6L& :NsE:NsE!Vxx4dCC 2QVHX ?X2Instruct&Instructions for Preparation of PapersZeljkoLeonardo Jelenkovic  Oh+'0   <H h t   Instruct(Instructions for Preparation of PapersZeljko Normal.dotLeonardo Jelenkovic3Microsoft Office Word@d@z@kz@z:Ns՜.+,0 hp  MIPROEC  Instruct Title  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !&Root Entry F0z(Data 1TableӨWordDocumentiSummaryInformation(DocumentSummaryInformation8CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q