03.08.2013 Views

R E F E R A T I - Media Zona - My Paper

R E F E R A T I - Media Zona - My Paper

R E F E R A T I - Media Zona - My Paper

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

R E F E R A T I<br />

16. KONFERENCIJA HRVATSKE UDRUGE ORACLE KORISNIKA<br />

18. – 22. LISTOPADA 2011. ROVINJ<br />

1


REFERATI 2<br />

KONFERENCIJSKE AKTIVNOSTI - REFERATI PO TEMATSKIM CJELINAMA<br />

Na strani<br />

1 201<br />

200 Strategija i upravljanje IS - opće ICT teme<br />

Klaudio Lazarić, Hrvatski Telekom<br />

Cloud Computing - Sveti Gral poslovnog računarstva<br />

3<br />

2 202 Rajko Kuzma, Intesa Sanpaolo Card<br />

Kontinuirano nadziranje kvalitete razvoja Oracle aplikacija<br />

11<br />

3 207 Dubravka Mendeš Poljak, Grad Zagreb<br />

Cijena aplikacije – Zašto software toliko košta?<br />

21<br />

300 Alati za razvoj aplikacija i aplikacijska rješenja<br />

1 301 Zlatko Sirotić, Istra informatički inženjering 28<br />

Konkurentno programiranje - Oracle baza, Java, Eiffel<br />

400 Tehnologija – DBA, Linux i Open Source rješenja<br />

1 402 Alen Prodan, LOGIN 67<br />

Korištenje histograma u optimizaciji SQL naredbi<br />

2 409 Zlatko Sirotić, Istra informatički Inženjering 79<br />

Kriptografija u Oracle bazi<br />

500 Oracle Fusion Middleware<br />

1 502 Dubravko Miljković, HEP SIT 107<br />

BI Publisher 11g – što je novo?<br />

600 Poslovni IS - rješenja, infrastruktura i integracija<br />

1 601 Dubravko Miljković, HEP SIT 125<br />

Metode balansiranja opterećenja (load balancinga) za aplikacijske servere<br />

2 607 Josip Matanović, Infosistem 137<br />

Integracija Oracle aplikacija i JasperReports-a<br />

3 608 Andro Milanović, Ivan Žiger, 147<br />

ISŽO-ADs: Integracija transakcijskog sustava s dokumentacijskim sustavom<br />

4 612 Nataša Dvoršak, Uljanik IRI 162<br />

Oracle VPD u primjeni<br />

700 Specifični podsustavi – GIS, OCM, …,<br />

1 703 Martin Martić, Mario Starčević, Multisoft 177<br />

Oracle/Oracle Spatial i FME ETL - Razmjena podataka neovisno o formatu<br />

2 706 Bojan Franc, Miroslav Šturlan Ivo Uglešić, Ivan Goran Kuliš, FER, Končar KET 188<br />

Programska podrška sustava za lociranje munja u Hrvatskoj


CLOUD COMPUTING - SVETI GRAL POSLOVNOG RAČUNARSTVA<br />

Klaudio Lazarić<br />

Hrvatski Telekom d.d.<br />

Petra Kobeka 15,<br />

51000 Rijeka<br />

+385 51 226029<br />

+385 98 425999<br />

klaudio.lazaric@t.ht.hr<br />

SAŽETAK<br />

Informatika je svaki dan bogatija za novi pojam iako ga temelji na idejama iz prošlosti. Težnja<br />

da sva rješenja moraju biti optimizirana usmjerava ih prema centralizaciji, a onda ih složenost<br />

problema ponovo vraća decentralizaciji. „Računarstvo u oblaku“ doživljava vrtoglavi razvoj i sve<br />

veću primjenu u poslovnom računarstvu, zato je potrebno utvrditi sve njegove prednosti i<br />

nedostatke. Navikli smo živjeti virtualno, ali još uvijek moramo živjeti stvarno.<br />

Koliko je Cloud Computing: Sveti Gral – izvor svih rješenja poslovnog računarstva?<br />

Postoji li jednostavno rješenje za složene probleme? Koliko su slični pojmovi „crna kutija“ i<br />

„oblak“? U vrijeme kada se sve više osoba osjeća informatičarima – koju vrstu organizacije u<br />

poslovanju trebamo?<br />

UVOD<br />

Informatika proživljava vrlo burno razdoblje. Ušla je u sve pore čovjekovog života i postala<br />

svakodnevna potreba kao što su voda i zrak. Međutim, javlja se i nezadovoljstvo jer sve češće<br />

informatika gubi sposobnost brzog rješavanja novo postavljenih zahtjeva. Zato se ponovno posegnulo<br />

za davno stvorenim idejama kada se predlagalo da informatika bude na usluzi korisnicima, na način,<br />

kao što se to radi s vodom, strujom i plinom. Potrebni preduvjeti nastali su razvojem interneta koji je<br />

idealna struktura za raspodjelu podataka i informacija, te primjenom virtualizacije. Mnogobrojni<br />

znanstvenici preuzeli su zadaću da računarstvo u oblaku pretvore u najpoželjniju, najekonomičniju i<br />

jedinu vezu između korisnika i isporučitelja informatičkih resursa. Ovaj osvrt ima za cilj da ukaže na<br />

neke dileme, prednosti i nedostatke koje nosi ovo rješenje.<br />

Centralizacijom svih resursa i njihovim stavljanjem u Oblak stvorila se mogućnost da se dio ostavi<br />

nepoznat i tajanstven u svojim rješenjima, ali otvoren u mogućnostima. Magična moć novih metoda,<br />

metodologija i tehnologija pružila je novu priliku kojom se korisnika može i treba zadiviti, te ga na taj<br />

način stvoriti potpuno ovisnim.<br />

Koliko je računarstvo u oblaku samo Sveti Gral koji nudi ogromne potencijalne mogućnosti, a koje<br />

zbog svoje izdvojenosti nose opasnost da ostanu nedovoljno iskorištene, pokazati će vrijeme. Glavni<br />

nedostatak leži u tome što se nove tehnologije i rješenja uvode u informatiku prebrzo bez da ih se<br />

pažljivo analizira, testira, shvati i razumije. Brzina uvođenja i korištenja jednostavnih rješenja<br />

zasljepljuje. Međutim, onda kada implementacija složenih rješenja bude trajala duže od očekivanog<br />

opet će se krenuti u novu potragu za boljim rješenjima.<br />

Teorija je uvijek korak ispred prakse, ali je praksa uvijek svjesnija puta po kojem se kreće.<br />

3


1. PROIZVOD – USLUGA (CRNA KUTIJA – OBLAK)<br />

Nove tehnologije nastoje sve svoje mogućnosti korištenja što brže uvesti u svakodnevnu<br />

primjenu i to često bez sustavne provjere i potvrde. Pažljivim pristupom u građenju tajanstvenosti i<br />

znatiželje korisnika se dovodi u stanje potpune ovisnosti.<br />

Složeni proizvodi sadrže novo oblikovane cjeline, a postojeće usluge stalno se prebacuju u<br />

novo stvorena područja koja su nejasna ili nepoznata osobama s nedovoljnim stručnim<br />

znanjem. Najbolji primjer kod složenih proizvoda su takozvane crne kutije gdje su poznate ulazno<br />

- izlazne vrijednosti, a uglavnom je nepoznata struktura odnosno sadržaj. Samo je ograničeni<br />

broj školovanih odnosno specijaliziranih osoba u stanju razumjeti pojedinosti crne kutije čije se<br />

funkcionalnosti najčešće prikazuju u shematskom obliku.<br />

Kod mnogobrojnih usluga koje danas pruža informatika, nastoji se sve važnije pojedinosti i<br />

rješenja smjestiti u novo stvoreni pojam Cloud – Oblak. Ovaj izraz nastao je kao metafora za<br />

Internet i prvobitno je bio korišten u prikazima predstavljanja telefonske mreže, dok se kasnije u<br />

računalnoj mreži počeo koristi u dijagramima Interneta kao apstrakcija osnovne infrastrukture koju<br />

predstavlja.<br />

Cloud je simbol koji se prvenstveno koristi za označavanje točke razgraničenja između<br />

onoga što je odgovornost davatelja usluge i onoga što je odgovornost korisnika. Kao što se<br />

kod proizvoda nastojalo složene dijelove zatvoriti u nepoznanicu crnih kutija tako se kod<br />

informatičkih usluga nastoji sve posebnosti odvojiti od korisnika u Oblak. Ovaj način pruža veću<br />

mogućnost apstrakcije, a i lakšeg iznošenja različitih tvrdnji i pretpostavki budući da korisnik nema<br />

izravnu mogućnost uvida, a time i nadzora nad procesima koji se odvijaju u informatičkim sustavima.<br />

Nelogičnost stvara i način usporedbe sustava, koji u stvarnosti ne postoje, pa zahtijevaju<br />

proizvoljno postavljanje troškovnih veličina, a tada se rezultati mogu lako prilagoditi namjerama<br />

i željama onoga koji određenu tvrdnju dokazuje.<br />

2. NESAVRŠENOST I STVARALAŠTVO (INCIDENTI – RJEŠENJA)<br />

Virtualno računalo razvijeno je u težnji da mu se logičkim predstavljanjem pokuša programski<br />

pridijeliti inteligenciju. Međutim, inteligencija koja se stvara kroz pravila i standarde nije ona<br />

„prava“. Najbolji dokaz za ovu tvrdnju su teškoće koje su postojale i postoje pri pokušaju razvoja<br />

umjetne inteligencije. Ovakav način rješavanja problema najčešće je samo željena pretpostavka<br />

ostvarivanja očekivanog ponašanja sustava uz unaprijed zadane preduvjete i na osnovu njih<br />

iskustveno poznatih mogućih stanja. Stvaralaštvo se u informatici neprekidno kretalo između<br />

hardvera i softvera. Najnovije je stremljenje da se hardver odvoji od operativnog sustava. Međutim, tu<br />

se onda zahtijevaju automatizirani procesi koji trebaju sadržavati kvalitetne kontrolne mehanizme.<br />

Nažalost, programski vođeno odvijanje procesa često dovodi do nepredvidivih problema u<br />

kojima je onda alarm jedina prava mogućnost upozorenja potrebe za intervencijom i rješavanjem<br />

incidentne situacije.<br />

Informatičku tehnologiju oduvijek se pokušavalo prekriti velom nadnaravnih sposobnosti i<br />

predstaviti ju kao savršenu osnovu za uspješno rješavanje svakog problema, tvrdeći i iznova<br />

pokušavajući dokazati da je ona u stanju riješiti sve i to uvijek brže i jednostavnije.<br />

Čarobna riječ iscjeljenja bolesnih područja današnje informatičke tehnologije određena je<br />

novim pojmom – Cloud Computing odnosno računarstvo u oblaku. Mnogobrojni savjetnici na<br />

području informatike zadnjih deset godina pokušavaju kao jedini mogući izvor svih rješenja prikazati –<br />

Cloud Computing. Prema njima, mistični Oblak pruža nove nesagledive sposobnosti, pa više neće<br />

biti potrebe da svaki servis, podatak ili informacija bude pohranjena na računalu korisnika, već će se<br />

sve moći, morati i trebati pohraniti u Oblaku. Za sve one koji nisu u duhu današnje informatike,<br />

savjetnici proročki ponavljaju mantru (snagu koja može dovesti do duhovnog buđenja) da će<br />

računarstvo u oblaku preuzeti cjelokupan IT, pri čemu će se svi korisnici u nekom svetom činu ITuskrsnuća<br />

dematerijalizirati i otići u nebo i tako virtualni, promatrati s visine one materijalne, od mesa<br />

sačinjene smrtnike koji još uvijek imaju lokalne hard diskove, lokalne aplikacije, lokalno sadržane<br />

podatke i za koje je potrebno raditi sigurnosne kopije.<br />

Međutim, nesavršenost rješenja iznova će generirati incidente i tjerati na novo stvaralaštvo<br />

kroz nove tehnološke mogućnosti.<br />

4


3. NAPRAVITI – KUPITI – IZNAJMITI<br />

Poznate su mnogobrojne znanstvene rasprave koje se vode oko traženja prave metode za<br />

utvrđivanje izbora najekonomičnijeg rješenja. Što je bolje: napraviti, kupiti ili iznajmiti? Odluka<br />

je oduvijek bila podložna trenutnoj ponudi i potražnji koja je određivala pravila, a s njima prednosti<br />

odnosno nedostatke. Neprekidnim preslagivanjem vrijednosti mijenja se procjena o pojmu bogatstva.<br />

U vrijeme kada bogataš preko noći može postati siromah, ali gdje i siromah (istina nešto malo teže)<br />

može postati bogataš teško je utvrditi gdje su prava mjerila i granice posjedovanja vrijednih stvari<br />

budući da se njihova cijena mijenja vrtoglavom brzinom u jednom trenutku na gore, a već u<br />

slijedećem na dolje. Razdoblje globalizacije najveću prednost daje posjedovanju energetskih<br />

resursa koji su tako postali mjerilo bogatstva pojedinih područja. Političke odluke stalno mijenjaju<br />

sliku moći, a s njom važnost ponude i potražnje. Trgovina je pak ta koja stvara dodatne<br />

nestabilnosti svojim procesom: kupi – pričekaj pravi trenutak za prodaju – prodaj i zaradi. U izjavi:<br />

Imati ili nemati, pitanje je sad? leži i dio odgovora. Što je vrijedno, a što je bezvrijedno? Najčešće je<br />

vrijedno ono čega ima malo ili ono čega uopće nema, a ne ono čega ima u izobilju. Uz različitu<br />

raspodjelu prirodnih bogatstava, uz vlasnike koji svoje bogatstvo ulažu u investicije, često na<br />

suprotnom kraju svijeta, sve su procjene vrlo upitne jer su samo slika trenutnog stanja. Ono što je<br />

danas pametno, često je već sutra potpuno glupo odnosno pogrešno.<br />

Kakvo je stanje u informatici? Kamo se kreću razmišljanja o ekonomičnosti rješenja?<br />

Nema više potrebe za vlastitim podatkovnim centrom, sve što treba smješteno je tamo<br />

negdje u Oblaku, uvijek dostupno uz dogovorenu vrijednost naknade. Težnja je da se plaća<br />

koliko se koristi, pa ako poslovi lošije idu, manje se koristi i manje se plaća. Pitanje ekonomičnosti<br />

postaje pitanje optimalnosti. Međutim, optimalno nije uvijek i ekonomično kao što ekonomično<br />

nije uvijek optimalno. Problem je taj što onaj tko pruža iznajmljivanje propada, ako ga se ne<br />

koristi optimalno. Ekonomična cijena za ekonomično korištenje obično nije optimalna cijena, jer<br />

da bi se isporučitelj usluge osigurao za razdoblje kriznih vremena, (a da bi uz to i zaradio) on mora<br />

uzimati više kako bi sakupio „bijele novce za crne dane“.<br />

Ono što se koristi jednokratno ili kratkotrajno, najbolje je iznajmiti, ali i pri tome uvijek<br />

analizirajući cijenu kupljeno - iznajmljeno. Ono što se koristi svakodnevno, najbolje je kupiti. Ono<br />

što je jednostavno ili za što postoje potrebni resursi, najbolje je napraviti. Zašto plaćati ono što se<br />

ne koristi, ali zašto imati i nešto što se ne koristi? Razlog je taj što se čovjek boji da neće imati, kada<br />

mu bude trebalo, pa se nastoji osigurati sakupljanjem i spremanjem i onoga što mu u određenom<br />

trenutku ne treba, ali za što misli da će mu trebati. Napravljeno i kupljeno je ipak vidljivo odnosno<br />

postoji, ali iznajmljeno je uvijek tuđe i do njega korisnik ima pravo pristupa samo dok postoji<br />

dozvola korištenja. Iznajmljeno nije korisnikovo i kada se on raziđe od vlasnika, ništa mu ne ostaje.<br />

Korištenje je obično jeftinije, ali i opasnije ako stvari krenu ka prekidu, a u današnja krizna<br />

vremena prekidi postaju sve češći i sve teže predvidljivi.<br />

4. PODRŠKA – ODRŽAVANJE (SAVJETNICI – OUTSOURCING)<br />

U poslovnom se svijetu neprekidno pojavljuju novi zahtjevi koje treba ugrađivati u informatičke<br />

sustave. Težnja je osmisliti što ekonomičnije rješenje koje istovremeno treba biti jednostavno i<br />

lako primjenjivo u praksi. Međutim, zbog mnogobrojnih posebnosti nastaju vrlo složeni sustavi<br />

koje treba neprekidno nadzirati, a zbog incidenata koji su neminovnost nesavršenosti rješenja<br />

potrebno je imati kvalitetnu podršku koja je u stanju na vrijeme reagirati i spriječiti daljnje stvaranje<br />

problema. Nastojanje da se stalno ide u korak s novim mogućnostima, jer se tehnologije<br />

neprekidno mijenjaju, dovodi do slučajeva u kojima su zbog nedovoljnog znanja pogreške sve<br />

prisutnije, a uz to često uzročno povezane. Potreba za prijelazom na nove sustave zahtjeva vrlo<br />

stručno poznavanje ponašanja postojećih i budućih sustava kako bi se svaka migracija mogla obaviti<br />

kvalitetno, brzo i jednostavno.<br />

Održavanje i podrška traže sve više sredstava jer rješenja u uvjetima stalnih poslovnih<br />

promjena postaju sve složenija, a time i skuplja. U poslovnom okruženju nastaje tako „bolesno<br />

stanje“ koje traži liječnike, takozvane savjetnike, koji su onda u stanju ponuditi pravi lijek za<br />

svaku situaciju. Poznato je da svaki lijek kod nečega pomaže, ali da istovremeno kod drugoga<br />

odmaže. Nedovoljno znanje zahtjeva iznajmljivanje tuđeg iskustva. Postalo je najlakše zatražiti<br />

specijalizirane timove izvan organizacije koji se onda u već poznatom obliku iznajmljivanja znanja<br />

i rada (outsourcinga) uključuju u sređivanje problema. Međutim, takvo „liječenje“ postaje sve<br />

skuplje jer traži sve više tuđeg rada, brige i znanja koji se onda pretvara u nove troškove<br />

povećavajući već ionako visoka ulaganja u informatiku.<br />

5


Svako plaćanje obavljenog posla riješeno je ugovorom koji nosi skrivene ciljeve u kojem jedna<br />

strana želi što više zaraditi, a druga što manje platiti. Znači ciljevi su dijametralno suprotni. U<br />

outsourcingu se tako javlja paradoks dok jedna strana želi što manje učešće druge strane jer<br />

svaki trenutak njenog rada znači trošak, druga pak teži većem uključivanju u svrhu stvaranja<br />

prihoda. Prisutna je često i neskrivena težnja isporučitelja usluge napraviti što manji transfer<br />

znanja na korisnika kako bi se ovisnošću mogao stvoriti dodatni izvor zarade. Pružatelju usluge<br />

najviše odgovara kada uspije uvjeriti korisnika da ne treba stvarati vlastita ili kupovati gotova rješenja,<br />

već da sve što mu je potrebno može jednostavno iznajmljivati od njega, pa će se oslobođen brige o<br />

održavanju sustava više usmjeriti na vlastiti posao. Na početku sve to izgleda lijepo i krasno jer se<br />

obavlja na dogovoren i primamljiv način, ali postepeno se pretvara u potpunu ovisnost. Sve se<br />

usmjerava prema stvaranju čvrstih veza koje će osiguravati sigurnu i stabilnu podršku i odražavanje,<br />

ali se na taj način smanjuje mogućnost za novi izbor. Stvorene veze teško je brzo i u potpunosti<br />

zamijeniti jer uvijek postoji mogućnost pojave problema koji u slučaju prekida ostavljaju duboke ožiljke<br />

i nose opasnost od ozbiljnih i dugotrajnih posljedica.<br />

Ovisnost se stvara svakim izborom. Oslanjanje na točno određenog pojedinca nosi u sebi rizik<br />

da se njegovim odlaskom izgubi stabilnost u odvijanju procesa. Oslonac na jednu osobu uvijek nosi<br />

rizik, na dvoje već gradi sigurnost, na troje stvara stabilnost. Međutim, ovo je još jedan dokaz da<br />

optimalno rješenje najčešće nije ono ekonomično.<br />

5. RAČUNARSTVO U OBLAKU<br />

Računarstvo u oblaku nudi se i reklamira kao najekonomičniji način rješavanja svih sadašnjih<br />

i budućih informatičkih zahtjeva. Nastalo je kroz pretpostavku da se mogućnost „opskrbe“<br />

resursima može napraviti na isti način na koji je organizirana opskrba vode, struje i plina.<br />

Masovne zahtjeve raspodjele i korištenja takvih usluga rješava se organizirano, izdvojeno i<br />

centralizirano, pa se iz toga rodila tvrdnja da se i obrada podataka može, mora i treba riješiti na isti<br />

način. Glavna je prednost što se ovakvim pristupom osiguravaju ogromne količine raspoloživih<br />

resursa. Mogućnosti se zasnivaju na stalnoj dostupnosti, dok je odluka o korištenju bilo da se<br />

radi o količini ili vremenu potrošnje prepuštena korisniku. Vrlo se rijetko i to najčešće samo površno<br />

razmatraju posebnosti ove vrste zahtjeva i rizici ovakvog načina opskrbe. Posljedice se nikada ni ne<br />

pokušavaju uspoređivati s prednostima. Vješto se izbjegava analiza koja bi mogla otkriti<br />

nedostatke. Sve poznate probleme nastoji se obrazložiti pripremom dodatnih akcija za takve situacije.<br />

U slučaju nastanka štete obavlja se saniranje posljedica uz često prikrivanje prave istine o njenim<br />

razmjerima.<br />

Računarstvo u oblaku je model za koji zagovornici ovakvog rješenja navode da omogućava<br />

jednostavan, na korisnikov zahtjev organizirani pristup mreži uz zajedničku akumulaciju podesivih<br />

računalnih resursa (mreža, poslužitelja, smještajnih kapaciteta, aplikacija i usluga) koje se mogu<br />

brzo pružiti i primijeniti uz minimalan napor i učešće korisnika. Svaki je model vrlo uspješan u<br />

teoriji jer je tada izdvojen i oslobođen svih smetnji i nepredvidivih događanja koje praksa sa sobom<br />

donosi. U steriliziranoj okolini teško se zaraziti. U nadgledanom okruženju koje je za potrebe testiranja<br />

vrlo pažljivo organizirano lakše je potvrditi prednosti i umanjiti rizike koje stvaraju nedostaci. U<br />

nenadanoj ali očekivanoj situaciji lakše je brzo i pravovremeno reagirati.<br />

Međutim, problemi računarstva u oblaku postoje i oni su danas još uvijek posebno izraženi u<br />

zahtjevima sigurnosti, pouzdanosti, intelektualnom vlasništvu softverskih rješenja, pohrani<br />

podataka koje treba imati u slučaju oštećenja smještajnih kapaciteta – backup, različitosti<br />

operativnih sustava, a poseban zahtjev je izrada kvalitetnih sučelja na web osnovi. Jednostavnije<br />

rečeno, problemi su prisutni u svemu onome što informatiku određuje. Prirodno je da svi oni koji<br />

zagovaraju računarstvo u oblaku sve ove nedostatke nastoje riješiti ili barem smanjiti opasnost od<br />

mogućih rizika, ali očito je da je za sada uspješnost rješenja više izuzetak nego li pravilo.<br />

Računarstvo u oblaku je obećavajući poslovni koncept. Potrebno je samo riješiti sigurnost,<br />

sigurnost i samo sigurnost. Nažalost, za svaki se urušeni sigurnosni sustav u početku mislilo i tvrdilo<br />

da je nepogrješiv. Prepustiti sigurnost i nadzor odluci koja je zasnovana na povjerenju vrlo je opasno,<br />

pa čak i kada se radi o manje važnim aplikacijama, a za posebne svakako da to nije ni poželjno.<br />

Zamislite što je sve moguće s novim rješenjima, ali nemojte zaboraviti kakve sve to rizike nosi.<br />

Avanturizam je lijep dok ne krene po zlu, a onda se poteškoće samo gomilaju i gomilaju. Važan je<br />

integritet podataka, povjerljivost,dostupnost i raspoloživost. Ako veće vjerovanje znači smanjenje<br />

sigurnosti onda problem postoji i treba ga riješiti. Kako biti siguran da korištenje neće prijeći<br />

granice ekonomičnog korištenja? Kako biti optimalan u uvjetima u kojima postoji potreba ili<br />

sloboda da se koristi sve više i više? Kako postići da se zahtjevi ne prošire više od potrebnog?<br />

6


U nastojanju da se umanji strah od potencijalnih problema pružatelji usluga računarstva u<br />

oblaku pokušavaju tvrditi da su njihova rješenja sigurna i preporučljiva. U svojim reklamama<br />

navode - Sigurnost je ugrađena u DNK naših proizvoda. Kao što se u glazbenoj industriji teško<br />

boriti protiv piratstva, tako je u Oblaku teško pružiti potpunu sigurnost. Prijelomne tehnologije brzaju u<br />

odnosu na donošenje novih zakona. Svakako ne treba ići ni u krajnost, pa nametnuti stroge zakone jer<br />

bi to moglo donijeti više štete nego li koristi. Standardi su po svojoj prirodi ograničenja. Različitost<br />

pristupa određivanju standarda izražena je po područjima i državama. Dok je u Evropi velika zaštita<br />

privatnosti, u SAD bi se moglo reći da je uopće nema. Pomiriti sve moguće pretpostavke nije i neće<br />

biti lako i uvijek će postojati problemi koji će stvarati potencijalnu opasnost i gdje će se opskrba iz<br />

Oblaka vrlo lako i brzo pretvoriti u lutanje kroz nepoznato. Dodatne teškoće nastaju i zato jer<br />

postojeća intenzivna transakcijska opterećenja i drugi važni aspekti velikih tvrtki kod IT produkcije<br />

nisu još uvijek dobili uspješna rješenja kroz računarstvo u oblaku - barem ne još za sada.<br />

Rješenja koja su razvijena usmjerena su prvenstveno na pitanja opskrbe iz ogromnog bazena,<br />

podataka i informacija. Građenje iskustva i stvaralaštvo u Oblaku suzuje se u uske okvire<br />

mogućnosti koje su osim toga ograničene sposobnošću onih koji ih koriste.<br />

Opet će se na nove načine graditi posebnosti. Kroz računarstvo u oblaku početi će prodirati zrake<br />

novih stvaralačkih ideja koje će stvoriti pretpostavku da rastjeraju ili rasplinu Oblake u koje se<br />

danas ugrađuju nova informatička rješenja.<br />

6. CENTRALIZACIJA – DECENTRALIZACIJA (PRIHOD – TROŠKOVI)<br />

U svim područjima čovjekovog života prisutna je vječna težnja prema centralizaciji. Zasniva se<br />

na tvrdnji da je ona sigurnija, ekonomičnija i poželjnija. Posebno je to izraženo u kriznim<br />

vremenima. U centraliziranom sustavu sve je povezano, standardizirano i s minimalnim<br />

razlikama. Standard je ograničenje, smanjenje mogućnosti zbog nastojanja da se sve pojednostavi.<br />

Potrebu nadzora i upravljanja lakše je riješiti u centraliziranom sustavu. Iako je izuzetak uvijek skuplji<br />

od masovnog slučaja, odnos procjene se mijenja ako se za njega postavi standard. Kada se utvrdi<br />

postojanje posebnog slučaja, osiguraju se sredstva i nastaje prirodan zahtjev koji traži<br />

rješenje. Izuzetak tako postaje pravilo. Znači bitna je samo dozvola postojanja, a onda se sve može,<br />

treba i mora riješiti da bude ekonomično. U informatici se stalno balansira između želje i potrebe<br />

za ekonomičnim hardverom i softverom. Dugoročno gledano nije problem u hardveru, već u<br />

softveru odnosno iskorištenosti tog hardvera. Na tim postavkama računarstvo u oblaku našlo je<br />

najjači oslonac i mnoge izuzetke pretvorilo u pravilo. Standardiziranjem svega, pa i izuzetaka, kroz<br />

centralizirani sustav nastoji se onda sve obuhvaćeno prikazati ekonomičnim.<br />

Centralizacijom se umanjuju troškovi održavanja infrastrukture. Smanjuju se ukupni<br />

troškovi, ali postoje granice gdje se sve većim prostiranjem neproporcionalno povećavaju<br />

troškovi zbog potrebe za sve širim područjem održavanja. Da bi se ostvarila što bolja kvaliteta<br />

centraliziranog sustava karakteristike infrastrukture moraju biti izuzetne jer sve se odvija negdje<br />

drugdje, pa veza mora biti stalna, brza i jednostavna. Na jednoj su strani želje i zahtjevi, a na<br />

drugoj, obično negdje daleko, nalaze se svi procesi koji to rješavaju. Nakon iznajmljivanja usluga bilo<br />

je prirodno za očekivati da će se početi iznajmljivati i skupe investicije to jest infrastruktura.<br />

Koliki je trošak informatike? Kako mjeriti korištenje? Koja je cijena mjerne jedinice? Koliko je<br />

ona promjenjiva? Poremećaji na tržištu često stvaraju sve veće potrebe, a sredstva su tada obično<br />

sve manja. Bez informatike se više ne može. Toliko je usađena u poslovanje da i kratkotrajni<br />

neplanirani prekid stvara gužvu i nervozu. U trenucima panike sve bi se dalo da sustav bude<br />

operativan i često se nakon takvih problema, pričuvnim rješenjima, potroše sve prethodne uštede.<br />

Koji su troškovi stvarni i prirodni? Kako utvrditi ekonomičnu vrijednost informatike? Što<br />

određuje vrijednost usluge: kvaliteta – količina – zadovoljstvo? Pokušavalo se, a još se<br />

pokušava utvrditi koliko informatika uspijeva vratiti od onoga što se u nju ulaže. Poduzeća vrlo<br />

teško utvrđuju stvarne troškove informatičkih usluga, pa zato ni ne mogu znati što im je bolje i kolika<br />

je prednost ili nedostatak korištenja računarstva u oblaku. Informatiku se stalno gura u nove i ne<br />

istražene mogućnosti pokušavajući slijediti primjenu najnovijih tehnoloških dostignuća. Pokazalo se da<br />

su prednosti novih rješenja teško mjerljive. Dok neke primjene informatike mogu vrlo brzo prikazati<br />

velike uštede, druge traže dugo razdoblje da bi do povrata došlo. Financijskim stručnjacima trošenje<br />

sredstava predviđenih za ulaganja u investicije najmanje je prihvatljivo. Zbog toga postoji težnja da se<br />

što više troškova veže uz produkciju da bi ih se onda uzročno posljedično opravdalo mogućim rizicima<br />

do kojih bi nedostatak sredstava mogao dovesti. Računarstvo u oblaku postiglo je dodatnu prednost<br />

jer se kod njega svaki kapitalni izdatak smatra operativnim izdatkom.<br />

7


Oblak nije moguće nadzirati jer je virtualan. U transakcijskom načinu rada najčešće nema<br />

većih problema, ali izvođenje obrade, te nadzor i praćenje što i kako se odvija često je nepoznanica.<br />

Zbog posebnosti web servisa mnogo se toga još mora unaprijediti i napraviti kako bi se moglo lakše<br />

rješavati poteškoće koje imaju krajnji korisnici s dugim vremenima odziva ili dohvata podataka. Sve<br />

što danas Internet dobro i loše pruža kod računarstva u oblaku mnogostruko je izraženo. Sigurnosni<br />

problemi koje donosi virtualizacija povezani su s činjenicom da su i virtualni sustavi ranjivi kao i<br />

stvarni. Sve je odlično dok je stanje prirodno, ali kad sustav krene nizbrdo, teško ga je vratiti u<br />

ravnotežu. Traži se brza prilagodba zahtjevima na tržištu. U stabilnim vremenima to je moguće, ali u<br />

uvjetima krize i stalnih promjena to postaje vrlo složeno. Da bi se čovjek približio virtualnom<br />

svijetu, u stvarnom svijetu mora stalno biti u središtu. Život na periferiji je život u pustinji – nema<br />

struje, nema vode, nema plina, nema podataka, nema informacija. Preostaje zadovoljstvo samo s<br />

onim što priroda pruža i kada to pruži. U stvarnom svijetu treba u pravo vrijeme biti na pravom<br />

mjestu.<br />

Sve je jače izraženo predviđanje da će računarstvo u oblaku postati izvjesnost. Ulažu se<br />

ogromna sredstva da tako bude, pa će tako i biti. Poduzeća će sve više koristiti računarstvo u oblaku<br />

za osnovne poslovne funkcije. Sve u informatici postaje neki oblik usluge – korištenje poslužitelja,<br />

memorije, skladišnih prostora, mrežne infrastrukture, aplikacija. Mogućnosti su sve veće, pa se oblici<br />

korištenja šire.<br />

Problem povjerenja postaje sve izraženiji u odnosima dobavljača i korisnika. Vjerovanje u<br />

poštenje šetnja je tamnom stranom ulice i uvijek pruža mogućnost prevare ili obmane. Kada netko<br />

drugi vrši nadzor i procjenu onda mu se može vjerovati, ali i ne, treba biti svjestan da u uvjetima želje<br />

za što većom zaradom istina nije sveta. Gdje je granica poštenja? Na granici s nepoštenjem.<br />

Nakon razdoblja centralizacije uvijek se jave želje i potrebe vraćanja prema decentralizaciji.<br />

Stvaralaštvo i znatiželja uvijek će izbacivati čovjeka iz strogih klišeja centralizacije. Bijeg od strogo<br />

organiziranog ustrojstva opet će tražiti nove prostore i rješenja.<br />

7. SVETI GRAL - OBLAK<br />

Nažalost danas informatika sve češće nije ni na nebu ni na zemlji. Poslovni zahtjevi i<br />

informatička rješenja sve više lutaju od idealnog ostvarenja do potpunog promašaja. U takvim<br />

uvjetima virtualnost i s njom stvoreno računarstvo u oblaku vratili su opet duh i dah mistike u<br />

informatičke tehnologije. Nude se obećanja da će računarstvo u oblaku pružiti mogućnost za<br />

ostvarenje i nemogućeg. U trenutku kada je informatika već počela gubiti svoju mistiku, otkrivši grubu<br />

stvarnost, stvoreni su novi preduvjeti koji vraćaju vjeru da se sve može napraviti. Često su zahtjevi i<br />

rješenja u informatičkim sustavima na granici znanstvene fantastike. Uvijek se tražio i traži sveti gral<br />

koji će biti onaj pravi perpetum mobile znanstvene misli. Oblak je zbog svoje nejasnosti i prividnosti, a<br />

istovremeno velikih potencijalnih obećanja postao za to idealan. Izgleda da je ovdje, a u stvari je samo<br />

iluzija. On ima svoju fizičku komponentu, ali je nedodirljiv. Oblak je samo simboličko predstavljanje<br />

mogućnosti s podjelom odgovornosti. Ponovo je sve vraćeno u područje simbola koje informatiku<br />

prekriva novim velom tajanstvenosti, obećavajući brda i doline, te što je korisniku najvažnije, život<br />

bez incidenata, bez problema i nerješivih stanja. Budi se optimizam jer će svi problemi nestati, a<br />

svi će se zahtjevi rješavati brzo i jednostavno. Opasnost je samo da se ne sakriju u Oblaku.<br />

Nastoji se izgraditi povjerenje i vjerovanje u sposobnosti Oblaka usmjeravanjem na ono što<br />

najviše nedostaje, a to su sigurnost, nadzor, odgovornost i privatnost. Intenzivno se radi na<br />

rješavanju nedostataka, pa će se tako sigurno doći do cilja ili će se bar uspjeti uvjeriti korisnike da<br />

mogućnosti postoje. Za sve one nevjerne Tome koji sumnjaju uvijek će se naći način kako ih<br />

potisnuti ili pritisnuti. Upornim ponavljanjem sve iluzije postaju opipljive i stvarne.<br />

Računarstvo u oblaku je prirodna evolucija rasprostranjenog usvajanja virtualizacije,<br />

uslužno orijentirane arhitekture, autonomnog i uslužnog računarstva. Krajnji korisnici, već<br />

odavno, a s Oblakom sve više nemaju potrebu za prevelikom i raznorodnom stručnošću ili brigu oko<br />

infrastrukture koja ih podupire. Računarstvo u oblaku je danas najbolji model za pokretanje<br />

informatičkih sustava izvan poduzeća. Riječ je o iznajmljivanju standardiziranih informatičkih<br />

sposobnosti – pamćenja, pohrane, procesne obrade, softvera na zahtjev, i sve to preko<br />

Interneta, dok se naplata obavlja na osnovu njihovog korištenja. Računarstvo u oblaku ima<br />

mogućnosti pružiti poslovanju brži, veći i izravniji pristup informatičkim resursima koji su postali<br />

sveti kaleži poslovnog računarstva. Čak i tvrtke koje prodaju informatičke usluge, kupuju dio onoga<br />

što im je potrebno preko Oblaka. Računarstvo u oblaku je u stvari uslužni program na koji se<br />

može lako i jednostavno priključiti. Mreže su vrlo značajan element u njegovom korištenju, pa<br />

njihova važnost postaje sve izraženija, ali zbog zahtjeva za kvalitetom, cijena sve više raste.<br />

8


ZAKLJUČCI<br />

Čak i onda kada davatelji usluge računarstva u oblaku riješe sva poznata kritična pitanja,<br />

ostati će ih još mnogo za rješavanje. Trenutno se tržište relativno dugo zadržava na istoj<br />

tehnologiji, a vrlo kratko na usluzi, pa će poduzeća trebati iskusne osobe koje će biti u stanju<br />

donijeti brzu i kvalitetnu odluku. Smanjivati će se potreba za posebnim stručnim znanjem, a rasti će<br />

zahtjev za kvalitetnim iskustvom u različitim znanstvenim područjima. Može li se znanje kupiti?<br />

Može. Može li se iskustvo kupiti? Ne može. Iskustvo treba izgraditi ili ga treba iznajmiti.<br />

Poduzeća uglavnom obavljaju više od jedne poslovne usluge, pa kada se neki programi budu<br />

premjestili u Oblak, a neki ostanu izvan, pojaviti će se problem njihove integracije. Ne može se<br />

neku uslugu postaviti u Oblak djelomično i onda očekivati istu razinu integracije kao da je sve na<br />

jednom mjestu. Složenija rješenja ostati će zato izvan Oblaka, ali će se jednostavnija sve više<br />

ugrađivati u njega.<br />

Dobre vijesti putuju brzo, ali loše putuju još brže. Dobre vijesti za računarstvo u oblaku su:<br />

donosi poboljšanja, pruža nove mogućnosti, a loše su: ostaje problem performansi, kritični su<br />

prekidi u radu. Značajan problem u informatičkim sustavima su performanse, ali tu često nije<br />

uzrok količina podataka, već rukovanje tim podacima – bilo programski, bilo pri korištenju.<br />

Pojednostavljenje procesa na mali broj aktivnosti postati će prioritetna zadaća. Web servisi<br />

pružaju veće mogućnosti, ali zahtijevaju da je način korištenja što lakši i razumljiviji.<br />

Kolikogod se pokušavalo dokazivati suprotno, računarstvo u oblaku ipak nije sasvim savršeno,<br />

a još manje je čarobni štapić kojim se u kratkom vremenu sve može riješiti. Već se kroz planove<br />

implementacije za zahtjevnije sustave može vidjeti da je predviđeno razdoblje za migraciju oko 6<br />

godina. Gdje li će tada biti informatička tehnologija? Ipak računarstvo u oblaku predstavlja<br />

danas Sveti Gral, čarobni lijek iscjeljenja za bolesnu informatiku.<br />

Virtualizacija treba osigurati put kojim će se kretati rješavanje zahtjeva, ali veća uspješnost<br />

pokazala se samo kod jednostavnijih slučajeva. Ukoliko se radi o računalno zahtjevnijim primjenama,<br />

virtualizacija može više štetiti nego li koristiti. Računarstvo u oblaku pogodno je za sustave koji su<br />

manje iskorišteni. Glavna značajka virtualizacije je ekonomičnije korištenje resursa i opreme.<br />

Poseban problem može nastati ako davatelj usluge propadne, a nažalost i to se događa.<br />

Oblikuju se različite vrste organizacije Oblaka. Privatni Oblak doživljava kritiku lošeg rješenja jer ga<br />

treba kupiti, graditi i održavati, a osim toga vrlo je sličan današnjem načinu organizacije data centara.<br />

U želji da se zadivi i time pridobije korisnika da ustraje na putu korištenja, planira se izgradnja<br />

Oblaka svih Oblaka koji se naziva Intercloud. Pretpostavlja se da će on postati data centar<br />

budućnosti.<br />

Postoji stalna težnja savršenstvu koju čovjek nažalost nije u stanju postići čak ni virtualno.<br />

Potreba da se viđeno sačuva, da se prodiskutira s nekim, da se u slučaju nerazumijevanja ponovi<br />

čitanje, znači da zabilješka o povijesti mora postojati. Računalo treba dio za zapis (pohranu), a onda i<br />

dio za obradu tog zapisa (procesor), a preko zaslona i tipkovnice opet nastaje potreba za dosadašnjim<br />

načinom komunikacije kolikogod je on promijenjen novim načinom korištenja preko osjetljivih zaslona<br />

na kojima se sve obavlja na dodir. Čovjek zbog ne savršenosti i ne sposobnosti da brzo obrađuje<br />

veliku količinu podataka, da ju dugotrajno pamti morati će opet iznova tražiti iste, već tražene<br />

stvari. Istina davatelji usluge će upravo na tome graditi i svoje trajanje i svoje bogaćenje. Neznanje je<br />

stvarnost i dok jednome stvara prihod drugome je trošak. Međutim, znanje je virtualno – prividno i<br />

ponekad mu je prihod jednak nuli. Vrijednost ima samo ono znanje koje se može naplatiti, sve ostalo<br />

je bezvrijedno odnosno neiskorišteno znanje koje ima samo prividnu vrijednost odnosno sadrži<br />

potencijal koji može ostati neupotrebljen, pa tako i ne stvoriti prihod.<br />

U razvijenim zemljama sve se više sredstava ulaže u informatičku sigurnost. Povjerenje<br />

između isporučitelja i korisnika postaje sve važnije. Težnja prema stvaranju sigurnosti traži<br />

povjerenje, ali osobe iz sigurnosti takav način ne zadovoljava. Zahtjevi na mrežu postaju sve složeniji.<br />

Sporazum o razini isporuke usluge pruža mogućnost da se obveze propišu, ali u slučaju njihovog<br />

neispunjavanja nikada se ne dobiva prava naknada za nastale probleme. Ovisnost o isporučitelju<br />

stvara se svakim izborom. Vjerovanje može vrlo brzo i jednostavno svaku stvarnu sliku događaja<br />

pretvoriti u virtualnu – prividnu. Ne uklanja se rizik u informatici novim pojmovima, već se samo<br />

mijenja priroda rizika.<br />

Završava li opskrba informacijama upravo na svojoj sličnosti s opskrbom vode, struje, plina?<br />

Rješenja za sve informatičke zahtjeve trebaju čekati neka strožija pravila u kojima će informacije<br />

postati jednoznačne i oslobođene mogućnosti mijenjanja. Sužavanjem izbora i stvaranjem<br />

ovisnosti o takvim pravilima nestati će mnogobrojni današnji nedostaci.<br />

9


Dozvoljeni uvid u ograničeni skup informacija uz ograničavanje dozvoljenog biti će prvi<br />

korak prema stvaranju sigurnosti, koja je inače rak rana računarstva u oblaku. Kod slučajeva u<br />

kojima se samo obavlja pristup informacijama najlakše je i najjednostavnije riješiti pitanje<br />

zaštite i sigurnosti. Upisivanje nudi veće mogućnosti za nedozvoljene aktivnosti. Mijenjanje već<br />

donosi opasnost da se podaci prepravljaju. Brisanje pruža najveći rizik i jedino se<br />

pravovremenim zaštitnim kopiranjem podatke može sačuvati od neplaniranog uništenja.<br />

Živimo u dinamičnom svijetu transakcija u kojem informacije putuju i razmjenjuju se velikom<br />

brzinom. Pristup informacijama je sve brži, ali poslovi sakupljanja podataka i njihova obrada<br />

ostaje ipak i dalje u posjedu informatičkih službi. Odlazak u područje Web usluga je poput odlaska<br />

u dućan – može se donijeti kući mnogo namirnica, ali se još uvijek nakon toga mora napraviti večeru.<br />

CASE alati u vrijeme kada su se pojavili izgledali su kao nova budućnost programiranja i<br />

lagan način za rješavanje svih zahtjeva poslovanja. Prijetili su čak ukidanju zvanja – programer.<br />

Međutim, samo su korisno poslužili u jednom razdoblju i postepeno su zamijenjeni novim metodama i<br />

alatima.<br />

Oblak danas prijeti da u potpunosti promijeni stvarnost informatike, ali ograničenja koja u<br />

njemu postoje pokazuju da će mnogo toga morati i u njemu biti promijenjeno da bi zadovoljilo<br />

potrebe koje poslovanje postavlja pred informatiku. O tome koliko se Oblak uspije prilagoditi ili<br />

koliko uspije prilagoditi informatiku ovisi njegov životni vijek. Prilagodba je uvijek pružala<br />

priliku za uspješnost u evoluciji, pa će i računarstvo u oblaku opstati koliko se uspješno uspije<br />

prilagođavati novim zahtjevima i potrebama poslovanja.<br />

Dodatni izvori:<br />

1. Michael Miller, Cloud Computing – Web-Based Applications That Change the Way You Work and<br />

Collaborate Online, Que Publishing, 2009.<br />

2. Anthony T. Velte – Toby J. Velte – Robert Elsenpeter, Cloud Computing – A Practical Approach,<br />

Mc Graw Hill, 2010.<br />

3. Eric A Marks – Bob Lozano, Executive's Guide to Cloud Computing, John Wiley & Sons, Inc,<br />

2010.<br />

4. Bill Thompson, Storm Warning for Cloud Computing, BBC News, 2008.<br />

5. David Rosenbaum, Can Cloud Computing Clear the Air, CFO Magazine, 2011.<br />

6. Bernard Golden, Cloud Computing: 2011 Predictions, CIO US, 2010.<br />

7. Vincent Ryan, A Place in the Cloud, CFO Magazine, 2008.<br />

8. Pat Romanski, Virtualization – The Engine That Enables Cloud Computing, Sys-Con <strong>Media</strong>, 2011.<br />

9. Jill Tummler Singer, Is Cloud Computing for Real?, Sys-Con <strong>Media</strong>, 2011.<br />

10. Wikipedia – (preuzeti različiti termini i pojmovi)<br />

10


Rajko Kuzma, dipl. ing.<br />

Intesa Sanpaolo Card d.o.o.<br />

Lastovska 23<br />

10000 Zagreb<br />

099 231-7180<br />

rajko.kuzma@intesasanpaolocard.com<br />

www.intesasanpaolocard.com<br />

KONTINUIRANO NADZIRANJE KVALITETE RAZVOJA ORACLE APLIKACIJA<br />

SAŽETAK<br />

Životni vijek Oracle aplikacije počinje sa strategijom koja definira svrhu aplikacije. Proteže se od<br />

dizajna aplikacije, preko razvoja pa sve do zadovoljstva njenim korištenjem od strane krajnjeg<br />

korisnika. Cilj je kontinuirano pružiti podršku svim segmentima životnog vijeka aplikacije, što uključuje<br />

mjerenje kvalitete usluge, od funkcionalnih, pa sve do performansnih testiranja. Prepuštanje kvalitete<br />

slučaju je neprihvatljivo rješenje, dok je ručno provjeravanje funkcionalnosti Oracle aplikacija vrlo<br />

često nezadovoljavajuće. Ova prezentacija će prikazati metode automatizacije i podrške Oracle<br />

razvojnom timu za funkcionalna testiranja produkcijskih verzija, odnosno, performansna mjerenja<br />

odziva Oracle aplikacija.<br />

CONTINUOUS MONITORING OF ORACLE APPLICATION DEVELOPMENT<br />

QUALITY<br />

SUMMARY<br />

Oracle application life cycle starts with the strategy that defines purpose of application. It<br />

stretches over application design, through development and ends with the customer satisfaction. The<br />

goal is to continuously provide support to all segments of application cycle, including quality of service<br />

measurements, from functional to performance testing. Leaving application quality to a chance is<br />

unacceptable, while testing application functionalities manually is often not satisfactory. This<br />

presentation will show methods of testing automation and support to Oracle development team for<br />

production application versions functional testing and application response measurements.<br />

11


1. UVOD<br />

U referatu su opisani načini kako pružiti maksimalnu podršku kvaliteti Oracle aplikacija. Kako sa<br />

ovim metodama napraviti spregu između dizajna aplikacije i samog mjerenja kvalitete. Kako pružiti<br />

podršku u svim stanjima života Oracle aplikacije te primjer kako je ovo implementirano u tvrtci Intesa<br />

Sanpaolo Card.<br />

2. STRATEGIJA I DIZAJN<br />

Poznato je da se u svijetu informatike koriste razne metodologije kako pristupiti problemu izrade<br />

nove aplikacije. Tako danas svi teže ITIL procesu, pa tako i mi isto primjenjujemo ITIL metodologije da<br />

zadovoljimo sve potrebe radi implementacije i održavanja života aplikacije.<br />

Strategija, koja se proteže preko područja koja raspolažu prikupljenim informacijama o uslugama,<br />

potražnji, financijama i rizicima, mora znati da rezultat mora biti zadovoljavajući. Odnosno, predvidjeti<br />

sredstva da se to može, što korisnik traži i zadovoljiti.<br />

Dizajn, koji bolje raspolaže informacijama o samoj arhitekturi i mogućnostima što se može<br />

implementirati, treba predvidjeti da se u sljedećim fazama razvoja moraju obavljati testiranja. Ta<br />

testiranja se sastoje redom od unit testiranja, integracijskih, pa sve do nekih stres testiranja. Često se<br />

nakon integracije, od kompleksnosti same razvijene aplikacije ne može elegantno pronaći uzrok<br />

pronađene greške ili se premalo posvećuje ovome. Zato je vrlo bitno da sam proces dizajna predvidi<br />

mjerne točke u modelu izrade same Oracle aplikacije.<br />

3. TRANZICIJA<br />

Proces tranzicije se svodi na modifikaciju aplikacije u produkcijskom okruženju. Odnosno,<br />

primjenjuje se change management procedura, koja je usko povezana sa release i deployment<br />

managementom. Da se proces tranzicije uredno obavi, potrebno je imati prikupljene podatke za bazu<br />

znanja. To su razne dokumentacije o novim, odnosno, promijenjenim funkcionalnostima same<br />

aplikacije.<br />

Do procesa tranzicije se može doći tek tada kada su svi preduvjeti stavljanja nove verzije Oracle<br />

aplikacije zadovoljeni. Sve promjene koje će se raditi nad Oracle aplikacijom su unaprijed najavljene,<br />

te je sam korisnik obaviješten o toj akciji.<br />

4. OPERACIJE<br />

Nakon procesa tranzicije, aplikacija se daje na korištenje. Sve radnje koje korisnik treba odnosno<br />

smije raditi se ovdje mogu modificirati. To su razna prava pristupa, upravljanja problemima u radu kao<br />

i kritični problemi s radom, tj. incidentima.<br />

Slučaj detekcije problema nad Oracle aplikacijom od strane korisnika nije baš dobrog karaktera.<br />

Već ovo ukazuje da prethodni koraci koji su prethodili dijelu operacija (strategija, dizajn, tranzicija) nisu<br />

dovoljno dobro pokrili sve situacije s kojima se korisnik susreće.<br />

5. KONTINUIRANO UNAPRIJEĐENJE<br />

Spomenute četiri glavne cjeline nisu sva područja koja se bave ciklusom života Oracle aplikacije.<br />

Potrebno je proaktivno pratiti život i ponašanje Oracle aplikacije i obrađivati sve te informacije.<br />

Ciklus prikupljanja informacija ovdje ne završava, već se daju smjernice prema strategiji. Takvo<br />

definirano ponašanje opisuje Slika 1.<br />

12


Slika 1 ITIL v3 pojednostavljena shema<br />

Vidljivo je da su svi koraci međusobno isprepleteni te jedni ovise o drugome. Kao što je u poglavlju<br />

ranije navedeno, potrebno je imati pripremljene točke za mjerenja. Ovime se, kao adapterom,<br />

možemo spojiti na kritične dijelove Oracle aplikacije i time raditi određena mjerenja kvalitete.<br />

6. RAZVOJ I IMPLEMENTACIJA<br />

Kada se specifikacija za promjenu ili za novu implementaciju Oracle aplikacije napiše, po njoj je<br />

potrebno raditi razvoj tih specificiranih funkcionalnosti. U toku razvoja, razvojni inženjer radi lokalno,<br />

tokom implementacije, svoja vlastita testiranja. Takva testiranja su tzv. unit testiranja.<br />

U tvrtci Intesa Sanpaolo Card u razvoju Oracle aplikacija rade nekoliko desetaka razvojnih<br />

inženjera. Paralelno traje razvoj za više projekata, te je vrlo važno raditi kvalitetna testiranja. Stoga je<br />

potrebno kontinuirano raditi kontrolu kvalitete razvijenih funkcionalnosti. Ovdje unit testiranja dosežu<br />

svoj limit, te je potrebno provjeravati kompleksnije funkcionalnosti.<br />

U narednim poglavljima će biti riječi o tipovima testiranja kao i prednosti pojedinih grupa.<br />

6.1. Unit testiranja<br />

Standardni razvoj Oracle aplikacija podrazumijeva testiranje funkcionalnosti u trenutku<br />

implementiranja. Dokumenti koji proizlaze kao rezultat testiranje je excel tablica sa pobrojanim<br />

funkcionalnostima iz same specifikacije sa pripadnim rezultatima.<br />

Često se testiraju samo ključne točke Oracle sustava te je vrlo šturo. Akcije koje se rade nad<br />

Oracle aplikacijom rade se ručno. Ovo traži jako puno vremena, pa je očito da razvojni inženjer sam<br />

procjeni što je potrebno testirati te na koji način. Uz ovo, često se zna dokumentacija nekvalitetno<br />

odraditi, te nije potpuno pouzdana, tj. ne pokriva sve testne slučajeve.<br />

Slika 2 predstavlja primjer dokumenta koji proizlazi iz unit testiranja. Vidljivo je da boja<br />

statusa definira rezultat testnog scenarija, ispravan ili krivi.<br />

13


Ime testa korak detalji status<br />

start 1<br />

login 2<br />

pokretanje Oracle<br />

aplikacije OK<br />

prijava na Oracle<br />

aplikaciju OK<br />

AMEX pin<br />

zadavanje promjene pina<br />

za American express<br />

change 3 karticu OK<br />

stop 4 logout OK<br />

start 1<br />

login 2<br />

promjena<br />

matičnih<br />

podataka 3<br />

pokretanje Oracle<br />

aplikacije OK<br />

prijava na Oracle<br />

aplikaciju OK<br />

promjena prezimena,<br />

djevojačko prezime KO<br />

stop 4 logout OK<br />

Slika 2 Ručna unit test dokumentacija<br />

Također se teško iz dokumenta vidi, što i na koji način su napravljeni testovi.<br />

6.2. Integracija<br />

Integracija Oracle kôda se svodi na prikupljanje svih izlaza što razvojni inženjeri proizvedu. U<br />

velikom timu inženjera, version control sustav puno pomaže u tome. Uz ovo, potrebno je izolirati<br />

integracijsku okolinu od razvojne okoline.<br />

Objedinjuje se cijeli programski kôd u jedan kumulativni patch koji se kontrolirano spušta na tu<br />

Slika 3 Osnovne 3 podjele okolina<br />

14


izoliranu okolinu. Slika 3 predstavlja osnovni pregled podjela i izolacija okolina. Vidljivo je da su<br />

međusobno neovisne, potpuno odvojene okoline. Nakon objedinjenja programskog kôda koji radi<br />

promjene nad bazom, isti princip se odnosi i na Oracle Forme. Njih korisnik napada, odnosno, one su<br />

vidljiv dio Oracle aplikacije od strane krajnjeg korisnika.<br />

Slika 4 Proces promjena<br />

Build management sustav u procesu tranzicije osigurava samo da se odabrane promjene<br />

(kumulativni patch) baznih objekata i Oracle Forme uspješno apliciraju. Ova automatika radi kontrolu<br />

ispravnosti kôda, dok se kontrola funkcionalnosti mora raditi u odvojenom procesu.<br />

Generalno, testiranje koordinira Quality Assurance (QA) team. Sve što developeri isporuče na<br />

integracijsku okolinu, biva u nekom obliku testirano.<br />

Kasnije u ovom dokumentu će biti više riječi o načinu automatizacije provjere funkcionalnosti<br />

Oracle (Forms) aplikacije.<br />

6.3. User Acceptance Test<br />

User Acceptance Test, skraćeno UAT, je finalna provjera svih definiranih testnih slučajeva koje<br />

promijenjena ili nova Oracle aplikacija mora podržavati. U pravilu ovo je masovno testiranje svih<br />

funkcionalnosti koje općenito Oracle aplikacija mora podržavati. Ova testiranja rade sami korisnici.<br />

Izlazni dokument je dokumentacija koja potvrđuje da je Oracle aplikacija preuzeta na način da<br />

podržava sve funkcionalnosti koje su definirane funkcionalnom specifikacijom, odnosno, zahtjevima<br />

korisnika.<br />

Također, ako korisnik opravdano pronađe grešku, zahtjev za popravak ide prema razvojnom<br />

inženjeru koji traži uzrok problema. Nakon popravka problema, slijede svi koraci koji su prethodili do<br />

samog UAT testiranja, te se obavještava korisnik da je dotična greška uspješno uklonjena.<br />

6.4. Performansno testiranje - stres test<br />

Svaka promjena nad Oracle aplikacijom, bilo arhitekture tablica, programskog kôda, ili samih<br />

formi, direktno utječe na brzinu Oracle aplikacije. Često se desi problem da na razvojnim i testnim<br />

okolinama aplikacija radi zadovoljavajućom brzinom, neobraćajući pažnju na to da u Oracle bazi nema<br />

pravih produkcijskih podataka kao i dovoljan broj korisnika koji paralelno rade.<br />

15


Često upiti koje rabe korisnici Oracle izvađa po krivim indexima, odnosno, radi full table scan nad<br />

velikim tablica. Zato postoje dodatne provjere Oracle aplikacija prije nego li takva promjena dođe do<br />

produkcijske okoline.<br />

Zbog toga je potrebno provesti simulaciju korištenja Oracle sustava, cijele Oracle aplikacije, sa<br />

realnim opterećenjem. Raditi generiranje realnog prometa nad kopijom Oracle baze, te u pozadini<br />

raditi razna mjerenja. Sistemaši i DBA rade mjerenja nad samom bazom i Oracle serverom, mjere<br />

raspoloživost procesora, memorije, broj I/O operacija i slično. S druge strane, rade se end-to-end<br />

mjerenja odziva same akcije nad Oracle sustavom. To su primjerice pokretanje aplikacije, prijava na<br />

aplikaciju, set osnovnih odnosno Sigle Point of Failure akcija.<br />

Na kraju je potrebno analizirati podatke, tj. usporediti ih sa prethodnom analizom. Tako se može<br />

predvidjeti ponašanje Oracle sustava u produkcijskom okruženje nakon primjenjenog kumulativnog<br />

patch-a.<br />

6.5. Monitoring Oracle aplikacije u produkcijskom okruženju<br />

Nakon što sve promjene "sjednu" u produkcijsku okolinu, nije kraj provjeravanju kvalitete Oracle<br />

aplikacije. Praćenje, tj. monitoriranje se mora konstantno raditi. Razlog je jednostavan. Tvrtka koja<br />

daje usluge na Oracle sustavu, partnerima daje na znanje da će sustav raditi u dogovorenim<br />

granicama. Stoga iznenadni padovi uslijed npr. zagušenja sustava daje pokaz na nepuzdanost<br />

sustava. Ako se pružatelj usluge i partner dogovore o određenim stvarima što očekuju od Oracle<br />

aplikacije, onda međusobno potpisuju Service Level Agreement - SLA ugovor. Naravno, kod<br />

neočekivanog ispada kao i neisporučivanje primjerice datoteka na vrijeme uslijed kašnjenja, mogu se<br />

plaćati i penali, koji naravno, nisu nikada korisni (pa niti za onoga koji bi dobio taj iznos). Cilj<br />

permanentnog monitoriranja je imati maksimalno moguće dostupnu aplikaciju, te uslijed neočekivane<br />

greške u najmanjem mogućem roku otkriti uzrok te isti popraviti.<br />

7. RAZVOJ I IMPLEMENTACIJA SKRIPTI ZA AUTOMATSKO TESTIRANJE<br />

Na tržištu postoje razni alati koji podržavaju automatsko testiranje. Njih je moguće podijeliti u<br />

dvije glavne skupine, u alate za funkcionalna testiranja i u alate za mjerenje performansi.<br />

Ranije u prethodnim poglavljima piše se o vrstama testiranja. Ovdje će biti naglasak samo o<br />

automatskim testiranjima koje se primjenjuju na Oracle (Forms) aplikaciji, odnosno, svi testovi i<br />

mjerenja će biti rađeni preko Oracle GUI strane odnosno Oracle Forme.<br />

Slika 5 Okolina za automatsko testiranje Oracle aplikacija<br />

Naglasak je na Oracle Forms aplikaciji. Potrebno je dobro proučiti da li odabrana platforma<br />

podržava testiranje nad Oracle aplikacijom. Oracle nudi rješenje za testiranje Oracle aplikacija, no<br />

postoji razne zamke da taj sustav ipak to ne može raditi. Treba se uvjeriti da li je aplikacija za<br />

16


testiranje kompatibilna sa Oracle Forms serverom. Da li podržava verziju Oracle jInitiatora, ili je za<br />

novijeg interpretera, Sun Native javu. Potrebno je voditi i računa o širini automatizacije. Da li interface<br />

koji radi prikupljanje podataka želimo testirati te da li taj alata podržava i tu tehnologiju. Analizom svih<br />

tih podataka dolazimo do specifičnog seta alata koji sve to što pojedinoj tvrtci treba.<br />

Slika 5 prikazuje arhitekturu okoline za automatsko testiranje. Postoji centralni aplikacijski server,<br />

Oracle repozitorij te fizičke instance virtualnih korisnika. To su obično radne stanice sa kojih se<br />

pokreću funkcionalna i performansna testiranja. Vidljivo je da QA team vodi brigu o setu testova koji<br />

će se pokrenuti na željenoj Oracle instanci, tj. aplikaciji spremne za testiranje.<br />

7.1. Funkcionalna testiranja<br />

Za funkcionalna testiranja je potrebno imati potpuno izoliranu okolinu. Potrebno je osigurati da<br />

nitko slučajno ne radi razvoj, jer to ima direktan negativan utjecaj na rezultat funkcionalnih testiranja.<br />

Poželjno je prije samog testiranja i primjene novog kumulativnog patch-a, što razvojni inženjeri<br />

kreiraju, napraviti osvježavanje okoline. Pod osvježavanjem se misli napraviti okolinu identičnom<br />

kakva će biti produkcijska nakon primjene tog istog kumulativnog patch-a.<br />

Orkestriranje testova rade QA inženjeri u direktnoj suradnji sa implementatorima Oracle<br />

aplikacije. Cilj je napraviti što veći broj različitih testova te ih imati spremne u repozitoriju automatskih<br />

testiranja. Ako sustav i vrijeme dozvoljavaju, poželjno je raditi takozvane noćne testove. Sve promjene<br />

koje razvojni inženjeri rade i imaju spremno za isporuku, dobro je što ranije testirati.<br />

Alati za automatsko testiranje upravo ovo gore spomenuto podržavaju. Imaju bazu testova koje je<br />

moguće elegantno pokrenuti nad željenom okolinom. Rezultat izvođenja testova je taj, da se za svaki<br />

test vidi da li je funkcionalnost ispravna ili nije. U slučaju da nije, QA inženjer istražuje pomoću loga<br />

testa što je uzrokovalo pad dotične testne skripte, te taj isti slučaj prijavljuje razvojnom inženjeru da<br />

popravi. U međuvremenu, QA inženjer ima pravo da zabrani stavljanje dotičnog lošeg programskog<br />

koda u produkcijsko okruženje.<br />

17


Slika 6 Primjer loga funkcionalnog testa 1 i detalji<br />

Kod dizajna i pisanja automatskih testova potrebno je voditi brigu o ponovnoj iskoristivosti testnih<br />

skripti. Primjerice to su skripte za pokretanje Oracle aplikacije, prijavu testnog korisnika u aplikaciju,<br />

odjava i gašenje aplikacije.<br />

Same skripte trebaju pratiti osnovna načela programiranja, ne raditi redundantnost kôda. Primjer,<br />

ako Oracle aplikaciju koriste više tržišta, potrebno je preko iste testne skripte moći testirati Oracle<br />

aplikaciju za različita tržišta.<br />

Slika 7 Primjer loga funkcionalnog testa 2 i detalji<br />

Slika 6 i Slika 7 prikazuju primjer izlaznog reporta iz različitih sustava za testiranje Oracle<br />

aplikacija. Vidljivo je da je došlo do greške, kao i opis greške.<br />

18


7.2. Performansna testiranja<br />

Slično kao i kod funkcionalnih testiranja, potrebno je imati potpuno izoliranu okolinu. Da bi<br />

mjerenja bila realističnija, potrebno je imati potpuno identičnu performansnu okolinu kao i<br />

produkcijsku. U to ulaze podaci u tablicama, podatak o broju istovremenih korisnika, isto hardware-sko<br />

okruženje – database server s isto memorije i procesorske snage te isti mrežni segmenti između<br />

performansne baze i sustava za performansno testiranje u odnosu na krajnjeg korisnika i<br />

produkcijskog Oracle okruženja.<br />

U sustav za generiranje virtualnih korisnika potrebno je dovesti scenarij testiranja. Ovdje već<br />

uveliko pomaže baza funkcionalnih testova. Sve što je potrebno napraviti je da se ti testovi<br />

transformiraju u određeni oblik.<br />

Drugi parametar koji je vrlo važan, koliko istovremenih upita nad Oracle bazom je potrebno<br />

simulirati. Također, prilikom dizajniranja testnih performansnih scenarija moguće je definirati redoslijed<br />

testova. Primjerice, deset korisnika istovremeno rade neki posao slijedno, dok u željenom koraku<br />

želimo istovremenu napasti najveću tablicu u bazi, tj. napraviti stres test Oracle sustava.<br />

Tako prikupljeni podaci služe za analizu ponašanja Oracle sustava, da li se ubrzava ili usporava,<br />

odnosno, testirati možemo i maksimalni broj korisnika, dok Oracle sustav ne dođe u stanje<br />

preopterećenosti (capacity planning).<br />

7.3. Monitoring produkcijskog okruženja<br />

Sustav za performansno mjerenje moguće je prilagoditi na način da radi provjeru produkcijskog<br />

okruženja. Potrebno je napraviti tzv. ping svih akcija što mora apsolutno konstantno biti funkcionalno.<br />

Stoga sustav za praćenje radi kontrolu i istu informaciju zapisuje u nekom definiranom obliku i Oracle<br />

tablicu.<br />

Slika 8 Zapis mjerenja odziva<br />

Slika 9 GUI operativna konzola<br />

Slika 8 prikazuje dio tablice u Oracle bazi sa zapisima o prikupljenim podacima o odzivu pojedine<br />

Oracle Forme. Ista informacija je proslijeđena operativnom agentu koju prati ponašanje cijele<br />

informatičke infrastrukture (Slika 9). Ako se nadmaši, odnosno, ako dotična akcija traje više od<br />

definirane prve granice, operateru se prikazuju to na grafičkoj konzoli putem žute boje na objektu koji<br />

definira to mjerenje. Slično je ako je došlo do ispada ili do prevelikog usporenja, operateru se na<br />

konzoli prikazuje informacija i aktivira alarm i to automatskim putem.<br />

19


8. ZAKLJUČAK<br />

Danas je neprihvatljivo rješenje kvalitetu Oracle aplikacije prepustiti slučajnosti. Zbog raznih<br />

ugleda tvrtke koja pruža uslugu na Oracle aplikaciji, ne može si priuštiti ispad Oracle aplikacije,<br />

prvenstveno zbog financijskih gubitaka. Ozbiljne tvrtke poput Intesa Sanpaolo Card-a sa svojim<br />

partnerima potpisuje Service Level Agreement ugovore u kojima se obvezuje da će dostupnost<br />

aplikacije i isporuka određenih podataka biti u okviru dogovorenih granica. Sve te provjere je potrebno<br />

imati u realnom vremenom. Stoga je potrebno puno pažnje posvetiti kontroli kvalitete Oracle aplikacija<br />

u dizajnu, kao i u fazi razvoja. Maksimalno svu snagu treba dati na predprodukcijskim testiranjima te u<br />

bilo kakvim neočekivanim produkcijskim problemima imati informaciju o ispadu u najkraćem mogućem<br />

roku radi što bržeg popravka.<br />

20


CIJENA APLIKACIJE – ZAŠTO SOFTWARE TOLIKO KOŠTA?<br />

APPLICATION PRICE – WHY DOES SOFTWARE COST SO MUCH?<br />

Dubravka Mendeš Poljak<br />

Grad Zagreb<br />

email: dmpoljak@zagreb.hr<br />

SAŽETAK<br />

Danas, više nego li prije postaje izuzetno važno bilo za onoga koji kupuje ili onoga koji<br />

izraĎuje aplikaciju znati konačnu cijenu kao i objasniti odnosno opravdati navedeni iznos. Rad je<br />

prvenstveno usmjeren na prikaz korištenih načina mjerenja razvoja aplikacija, te u konačnici<br />

objašnjava na koji način se utvrĎuje cijena. Biti će prikazano nekoliko metrika i alata korištenih za<br />

procjenu troškova i pregled njihovih osnovnih mogućnosti. Nadalje biti će prikazani i rezultati<br />

istraživanja provedenog na hrvatskom tržištu sofwerskih kuća i način na koji oni vrše procjenu<br />

troškova. Nadalje prikazat će se kako procjena utječe na uspjeh projekta i u kojoj mjeri ona utječe na<br />

prekid razvoja.<br />

Today, more than ever it becomes extremely important for anyone who buys, or makes an<br />

application to know the final price as well as to explain or to justify that amount. The work is primarily<br />

focused on the presentation of used application development metrics, and ultimately explains how to<br />

determine price. Several metrics and tools used to estimate costs will be shown, and their basic<br />

features. Furthermore the results of research conducted on the Croatian market software houses and<br />

the way they assess the costs will be presented. Furthermore it will be shown how cost estimation can<br />

have impact on project success and how they influence the result of the final software product.<br />

UVOD<br />

Do kasnih 70-ih godina, razvoj softverskih proizvoda mjerio se kroz vrijeme i materijal. Radilo se o<br />

naplati pruženih i dostavljenih usluga. Pod tim se podrazumijevao napor uložen u razvoj, izražen kroz<br />

mjesece projektnog tima, koji je radio na projektu. Taj se napor zbrajao sve do isporuke softvera i do<br />

prihvaćanja od strane korisnika. Na taj način, kupac je ovisio o isporučitelju i njegovom uspjehu da u<br />

razumnom roku završi projekt. Mjerenje se izražavalo u dostavljenim linijama koda. Takvo se mjerenje<br />

i danas koristi, no u manjoj mjeri. Afirmacijom i razvojem novih programskih jezika, posebice objektnih<br />

jezika, nove metrike ostvaruju više uspjeha na području procjene troškova razvoja softverskih<br />

proizvoda.<br />

U današnjem tržišnom društvu, borba za prevlast i pridobivanje kupaca vrlo je značajna. ProizvoĎači<br />

trebaju biti konkurentni i maksimalno prilagodljivi kupcu. Današnja usluga mora pružiti više<br />

funkcionalnosti uz što niže cijene te opstati na tržištu. No proizvoĎači softvera i njihovi kupci oduvijek<br />

su se nalazili u nezavidnoj poziciji, jer utvrĎivanje cijene predstavlja „crnu kutiju“, budući da se softver<br />

ne može mjeriti jedinstvenim i fiksnim mjerama već se utvrĎivanje njegove cijene i ostalih troškova<br />

temelji na procjeni. Kod ostalih proizvoda cijena se obično utvrĎuje nakon što je proizvod izraĎen, no<br />

kod softvera se vrlo često dogaĎa da je cijenu potrebno utvrditi prije negoli je sam softver napravljen i<br />

to bez poznavanja svih ključnih faktora koji su potrebni za njegovu izradu. Iz navedenog se vidi<br />

važnost utvrĎivanja što realnije procjene utrošenih resursa jer lošom procjenom sam razvoj projekta<br />

dolazi u pitanje, a gubitak resursa to samo slijedi.<br />

Kako bi procjena bila što pouzdanija i mogla se primjeniti na različite korištene programske jezike i<br />

alate razvijaju se brojne metrike i alati za procjenu koji služe kao podrška u planiranju i utvrĎivanju<br />

potrebnih i utrošenih resursa na razvoju jednog projekta.<br />

21<br />

1


FAKTORI UTJECAJA NA TROŠKOVE SOFTVERA<br />

Da bi se uopće postiglo i razumjelo odreĎivanje procjene troškova razvoja, potrebno je prikupiti i<br />

analizirati čitav niz faktora koji direktno utječu na odreĎivanje troškova izrade softvera. Osnovne<br />

faktore za bilo kakvu procjenu neizostavno čine veličina, rok, kvaliteta i uloženi napor. Bez utvrĎivanja,<br />

razmatranja i definiranja vrijednosti ovih faktora, procjena nije moguća, a odreĎivanje troškova razvoja<br />

softvera je nepouzdano i gotovo nepostojeće. Osim ovih osnovnih faktora na cjelokupnu procjenu u<br />

pravilu utječe voše od 50 različitih i meĎusobno povezanih faktora.<br />

Većina studija danas pokazuje da se softverski proizvodi prekidaju zbog loše ili preambiciozno<br />

definiranih ciljeva. U provedenom istraživanju utvrĎeno je da se 46% anketiranih softverskih kuća u<br />

Hrvatskoj našlo u situaciji da su morali prekinuti s razvojem softvera, a 66% njih, kao razlog, navode<br />

lošu procjenu izvodljivosti. Obzirom da na lošu procjenu utječu kritični faktori, koji su loše ili<br />

preambiciozno definirani, oni su razlog što dolazi do kašnjenja u realizaciji projekata, što pak rezultira i<br />

povećanjem troškova njegove izrade. U navedenom se očituje važnost dobre procjene svakoga od<br />

pojedinačnih faktora, kako bi utjecali na donošenje pouzdane procjene.<br />

METRIKE ZA PROCJENU TROŠKOVA RAZVOJA SOFTVERSKIH PROIZVODA<br />

Svaki softverski projekt ima svoj početak i kraj. Softverski projekt započinje idejom, odreĎenim<br />

zahtjevima korisnika za zadovoljavanje neke potrebe. Kraj je realizacija tih ideja i potreba u obliku<br />

odreĎenog softverskog proizvoda, prihvaćenog od strane korisnika ili pokretača projekta. Ako<br />

promatramo taj razvoj, kao nepoznati put kojega je potrebno prijeći od jedne do druge točke, teško da<br />

će se tamo stići u zadano vrijeme, ili se uopće neće stići, ako se ne koriste neki od dostupnih<br />

pomagala kao što su kompas ili danas popularni GPS. Analogno tome, da bismo razvili kvalitetan<br />

softverski proizvod u zadanom vremenu i uz planirane troškove, umjesto kompasa koristit ćemo<br />

dostupne metrike, kao pomoć pri postizanju toga cilja.<br />

Korištenje metrika pretpostavlja upotrebu različitih metoda mjerenja, čime se softverski proizvodi<br />

unapreĎuju u pogledu razvoja. Mjerenje, upotreba i korištenje brojeva, te praćenje napretka,<br />

predstavljaju neizostavan dio ovog procesa.<br />

Jedna od definicija prepoznaje softverske metrike kao neprekidnu primjenu tehnika za mjerenje<br />

razvoja softvera i njegovih produkata, radi prikupljanja značajnih i u odreĎeno vrijeme potrebnih<br />

informacija za unapreĎenje procesa razvoja softvera i njegovih produkata. 1<br />

Kao i u ostalim područjima, tako je i kod metrika jedna od osnovnih funkcija prikupljanje podataka.<br />

Naravno, radi se o ciljanom prikupljanju podatka, relevantnih za područje koje se procjenjuje. Cilj nije<br />

prikupiti ogroman broj podataka, već dovoljan broj podataka koji će dati potrebne parametre i<br />

obrazloženja uočenih trendova. Osnovno pitanje nakon prikupljenih podatka jest što ti podaci govore?<br />

Podaci sami sebi nisu svrha, potrebno ih je aplicirati na okolinu u kojoj ih prikupljamo, promatramo i<br />

primjenjujemo. Iz njih trebamo dobiti odgovore na pitanje zašto se nešto dogaĎa, čak i ako je dobiveni<br />

odgovor na prvi pogled trivijalan, poput obrazloženja da projekt kasni jer je bio kvar na središnjem<br />

računalnom sustavu i programeri nisu mogli raditi na svojim radnim stanicama.<br />

„Korištenje softverskih metrika ne osigurava preživljavanje, ali povećava vjerojatnost preživljavanja“,<br />

ovom izjavom Paula Goodmana najbolje se očituje vrijednost i snaga upotrebe dostupnih metrika.<br />

Neke od dostupnih i najčešće korištenih metrika su slijedeće:<br />

Metrike temeljene na linijama koda<br />

Funkcijske točke ( i njihove brojne inačice)<br />

Objektne točke<br />

Story points<br />

Use Case Points<br />

Neuralne mreže<br />

1 Goodman, Paul: Software Metrics, Rothstein Associates Inc., 2004., str. 6<br />

22<br />

2


ALATI ZA PROCJENU TROŠKOVA RAZVOJA SOFTVERSKIH PROIZVODA<br />

Danas na tržištu postoji oko 50-ak komercijalnih alata za procjenu razvoja softverskih proizvoda.<br />

Mnogi od njih predstavljaju crne kutije, jer njihove korištene tehnike i način upotrebe nisu obrazloženi.<br />

Alati su se razvili kako bi na automatizirani način pratili razvijene modele procjene. Njihova osnovna<br />

funkcija uključuje procjenu vremena potrebnog za izvršavanje pojedinih aktivnosti kroz životni ciklus<br />

softvera, podršku za procjenu, temeljenu korištenjem funkcijskih točaka ili linija koda te, u novije<br />

vrijeme, podršku za upotrebu novijih korištenih tehnologija, razvojem objektno orijentiranih tehnika te<br />

korištenje programskih jezika poput Jave i Visual Basica, kao i web orijentiranih aplikacija. Alati su<br />

prvenstveno namijenjeni unapreĎenju kvalitete i produktivnosti bilo kojeg procesa uključenog u razvoj<br />

softvera. Nedostatkom konzistentnih i pouzdanih podataka usporio se napredak alata za procjenu<br />

troškova razvijenih u 70-im godinama. No kako su vremenom podaci postajali dostupniji, takvi alati su<br />

se progresivno poboljšavali i kontinuirano se nastavljaju razvijati. Većina alata koristi algoritme koji se<br />

temelje na pouzdanim modelima, dok su oni napredniji bazirani na definiranim pravilima ili bazama<br />

znanja.<br />

Na softverske projekte u pravilu utječe preko 100 različitih faktora koji imaju utjecaj na rokove, trošak,<br />

kvalitetu i zadovoljstvo korisnika. Individualni projekti nisu pod utjecajem svih faktora, ali obično na<br />

njih utječe barem 10 do 20 osnovnih faktora. Alati poput COCOMO II, SEER-SEM-a i QSM-SLIM-a,<br />

koriste vlastite prilagoĎene podatke prikupljenih završenih projekata, i tu se radi o parametarskim<br />

alatima. Ovakvi alati u sebi imaju ugraĎene algoritme i velike baze znanja, na temelju kojih se na<br />

sistematičan i strukturiran način organiziraju ulazni parametri i faktori koji utječu na procjenu. Oni<br />

uzimaju obzir različite načine razvoja softvera i procjenjuju i one dijelove koji tijekom razvoja nisu<br />

vidljivi, a neizostavni su dio te time korisniku alata usmjeravaju pažnju i na pojedine dijelove koji se<br />

najčešće nenamjerno zaborave, odnosno izostave, a ključni su dio za uspješan razvoj i završetak<br />

softverskog proizvoda.<br />

U tablici su sažeti parametri i korištene aktivnosti pri procjeni troškova razvoja softverskog proizvoda<br />

koji su uključeni u pojedinim alatima.<br />

ATRIBUTI<br />

VELIČINE<br />

ATRIBUTI<br />

GRUPA FAKTOR COCOMO II SLIM SEER-SEM PRICE-S<br />

PROGRAMA<br />

ATRIBUTI<br />

RAČUNALA<br />

KADROSVSKI<br />

ATRIBUTI<br />

ATRIBUTI<br />

PROJEKTA<br />

POKRIVENE<br />

AKTIVNOSTI<br />

Check-<br />

point<br />

ESTIMACS<br />

Izvorne instrukcije DA DA DA DA DA NE<br />

Funkcijske točke DA DA DA DA DA<br />

OO- metrike DA DA DA DA DA -<br />

Vrsta/Domena NE DA DA DA DA DA<br />

Kompleksnost DA DA DA DA DA DA<br />

Jezik DA DA DA DA DA -<br />

Ponovno korištenje DA DA DA DA DA -<br />

Pouzdanost DA - DA DA - DA<br />

Ograničenja resursa DA DA DA DA - DA<br />

Promijenjivost platforme DA - DA - - -<br />

Sposobnost kadrova DA DA DA DA DA DA<br />

Kadrovska stalnost DA - - - - -<br />

Iskustvo kadrova DA DA DA DA DA DA<br />

Alati i tehnike DA DA DA DA DA DA<br />

Zastoji DA DA DA DA DA -<br />

Vremenska ograničenja DA DA DA DA DA DA<br />

Zrelost sustava DA DA DA - DA -<br />

Povezanost tima DA - DA DA DA -<br />

Sigurnosna pitanja NE - DA - - -<br />

Multisite razvoj DA - DA DA DA DA<br />

Početak DA DA DA DA DA DA<br />

Elaboracija DA DA DA DA DA DA<br />

Konstrukcija DA DA DA DA DA DA<br />

Tranzicija i održavanje DA DA DA DA DA NE<br />

23<br />

3


MANUALNA PROCJENA I JEDNOSTAVNI ALGORITMI (ISKUSTVO, POVIJESNI PODACI)<br />

Sve do 70-ih godina, kada se prvi put počinju razvijati automatski alati, procjena troškova obavljala se<br />

manualno, i to korištenjem jednostavnih pravila, pod nazivom Pravilo palca (eng. Rules of Thumb). I<br />

danas ovaj način predstavlja najčešće korišteni pristup procjeni troškova. Najčešće ga primjenjuju<br />

organizacije koje zapošljavaju manje od 100 osoba, angažiranih na području razvoja softvera, kao i<br />

organizacije koje su primarno orijentirane na male softverske projekte, odnosno projekte koje uključuju<br />

do 500 funkcijskih točaka gdje visoko precizne procjene nisu potrebne.<br />

Poznato je da korištenje pravila palca podliježe visokom stupnju pogrešaka. Ta pravila su objavljena<br />

radi zadovoljenja potrebe za brzom procjenom koje se mogu koristi manualno ili upotrebom ručnih<br />

kalkulatora i proračunskih tablica. Najznačajnija karakteristika ovog pravila jest jednostavnost<br />

korištenja i brzi set dobivenih podatka vezanih uz procjenu. Dugi niz godina manualna procjena<br />

temeljila se na linijama koda, prvenstveno namijenjenih proceduralnim programskim jezicima.<br />

Alati za procjenu troškova softvera imaju u sebi ugraĎenu široku bazu znanja, niz algoritama i pravila<br />

na kojim se temelje. Ekspert procjenu donosi na temelju iskustva rada s prošlim projektima te pri<br />

svojoj procjeni može napraviti slučajne i nenamjerne pogreške koje se mogu očitovati u izostavljanju<br />

nekih aktivnosti ili dodjeljivanju nerealnih vrijednosti. Nadalje, prilikom rada s proračunskim tablicama,<br />

osobito kada se radi o velikim projektima, vjerojatnost upisa krivih vrijednosti raste, kao i previdi nekih<br />

ključnih elementa. Ekspert takoĎer može podrazumijevati obavljanje odreĎenog dijela posla, no on se<br />

neće prikazati u ukupnoj kalkulaciji, čime će se smanjiti točnost ukupne procjene ili nekog njezinog<br />

pojedinog dijela. Prilikom donošenja procjene, alati ne ovise o stupnju stručnosti korisnika ili voditelja<br />

projekta, oni sadrže prikupljeno sumarno iskustvo stotina i tisuća softverskih projekata, stoga je pristup<br />

procjene eksperta sklon pogreškama, dok pristup dobiven upotrebom alata donosi pouzdanije i<br />

značajnije informacije. No i do danas, procjena temeljena na prosudbi eksperta vrlo je korištena<br />

metoda. Istraživanje Barbare Kitchenham iz 2002. pokazuje da je kod 72% projekta procjena bila<br />

bazirana na prosudbi eksperta. 2 MeĎusobne procjene različitih eksperata nisu jednake kao što ni<br />

znanje i iskustvo koje posjeduje svaki od njih nije jednako. Eksperti imaju tendenciju korištenja<br />

jednostavnih strategija za ostvarivanje procjene. Dobro poznavanje tehnologije ili razvoja ne implicira<br />

da će ta osoba biti pouzdana pri cjelokupnoj procjeni aktivnosti razvoja softvera.<br />

Caper Jones usporeĎivao je 50 projekta, koji su ručno procijenjeni, sa 50 projekata koji su<br />

procjenjivani pomoću automatskih alata za procjenu. 3 Projekti su veličine 5000 funkcijskih točaka.<br />

Manualna procjena temeljila se na procjeni izraĎenoj od strane voditelja projekta, uz korištenje<br />

tabličnog kalkulatora i proračunske tablice, dok su pri odabiru alata korišteni neki od komercijalnih<br />

rješenja. Komparacija je izvršena izmeĎu originalnih procjena i izmeĎu podataka dobivenih nakon što<br />

je aplikacija bila razvijena. Rezultati koji su dobiveni vrlo su zanimljivi. Samo četiri projekta koja su<br />

manualno procijenjena bila su u okvirima točnosti od 10% sa stvarnim podacima. Njih 17 bilo je<br />

optimistično s vrijednostima od 10-30% stvarnog iznosa, a 29 ih je bilo optimistično iznad 30%.<br />

Vrijednosti procjene projekata pokazivale su manje troškove i kraće rokove završetka od stvarnih<br />

podataka. Nasuprot tome, procjene troškova 22 projekta generirane uz pomoć automatskih alata bile<br />

su unutar 10% pouzdanosti. Procjena 24 projekta bila je u rasponu od 10-25% pouzdanosti, tri<br />

projekta imala su više od 25% pouzdanosti, a samo je jedan projekt bio optimističan s oko 15%<br />

pouzdanosti. Zanimljivo je to da su i kod manualne i kod procjene korištenjem automatskih alata,<br />

procjene u području predviĎanja programiranja i napora programiranja bile tu negdje. Manualni alati<br />

bili su vrlo optimistični kod rasta zahtjeva, dizajna napora, napora pri dokumentaciji i testiranja.<br />

Zaključak komparacije jest taj da su oba načina bila jednaka prilikom procjene stvarnog programiranja,<br />

dok su automatski alati bolji za predviĎanje neprogramskog dijela posla.<br />

Osnovna zamjerka softverskim projektima jest ta da oni vrlo često imaju tendenciju premašenja<br />

troškova i planiranih rokova, koja nerijetko nastaje upotrebom nesistematizirane manualne procjene.<br />

2 McConnell, Steve: Software Estimation, Microsoft Press, 2006., str. 105<br />

3 Jones, Capers: Estimating Software Costs: Bringing Realism to Estimating, The McGraw-Hill Companies, 2007., str. 48<br />

24<br />

4


POTEŠKOĆE PRILIKOM PROCJENE TROŠKOVA IZRADE SOFTVERA<br />

Definiranje navedenih faktora ne garantira sigurnu procjenu. Potrebno je dodati još i vještine, iskustvo,<br />

znanje i percepciju cijele situacije i okoline u kojoj se procjena vrši. Ali ono s čim se procjenitelji<br />

redovito susreću jest to da koliko god realna bila procjena troškova razvoja softvera, taj će iznos<br />

drugoj strani uvijek biti previsok. Visoka cijena i dugi rok izrade dvije su tvrdnje koje naručitelji softvera,<br />

menadžeri ili šefovi redovno izgovaraju. Godinama postoji nerazumijevanje izmeĎu onih koji rade na<br />

razvoju, voditelja projekta i naručitelja s druge strane. Razlog u ovome možda leži u tome što nema<br />

jasno identificiranih mjera kojima se može izraziti ono što se radi. TakoĎer, na početku projekta<br />

zahtjevi su površno definirani i nisu precizno specificirani, no od voditelja projekta očekuje se da da<br />

ponudu o očekivanom trošku i roku izrade. Produktivnost programera vrlo je bitan faktor, no<br />

produktivnost se meĎusobno razlikuje od programera do programera, i to je nešto na što se ne može<br />

utjecati. Potrebno je razviti svijest i poznavati produktivnosti svakog pojedinog člana i ukalkulirati je u<br />

procjenu, a nipošto obratno. Dobra je praksa postaviti pitanje programerima da sami donesu procjenu,<br />

koliko im je potrebno vremena za izvršavanje pojedinog djela. Tu treba na imati umu to da programeri<br />

često imaju tendenciju optimistične procjene svoga posla, jer kada se dosegnu optimistične procjene,<br />

a posao nije završen, tada je već kasno.<br />

NAČIN PROCJENE TROŠKOVA RAZVOJA SOFTVERSKOG PROIZVODA U HRVATSKOJ<br />

Kako bi se dobila slika o stanju i spoznaji hrvatskih softverskih poduzeća i o korištenju alata i metrika<br />

za procjenu razvoja softvera, provedena je anketa, kojoj je bio cilj, na osnovu anketnih pitanja,<br />

odgovoriti na sljedeće:<br />

Koliko su hrvatski proizvoĎači softvera upoznati s metrikama i alatima za procjenu<br />

troškova?<br />

Na koji način vrše procjenu troškova?<br />

Koliko izbor metrike i alata ovisi o vrsti softvera i korištenim tehnologijama?<br />

Utječe li način procjene na uspjeh projekta?<br />

Dolazi li do prekida razvoja softvera zbog loše procjene?<br />

Anketiranje je provedeno na uzorku od 30 informatičkih tvrtki koje se isključivo bave proizvodnjom<br />

vlastitih gotovih aplikacija ili aplikacija po narudžbi korisnika.<br />

Provedeno istraživanje o zastupljenosti korištenja alata i metrika za procjenu razvoja softvera<br />

provedeno je na uzorku od 30 poduzeća. Na upitnik je odgovorilo njih 26, što iznosi 87%, i dalo je<br />

sljedeće zaključke temeljene na anketnom upitniku:<br />

Koliko su hrvatski proizvoĎači softvera upoznati s metrikama i alatima za procjenu<br />

troškova?<br />

Istraživanje je pokazalo da su hrvatska softverska poduzeća slabo upoznata s dostupnim<br />

metrikama i alatima koji se nalaze na tržištu. Nijednu metriku ne koristi 46% posto<br />

anketiranih poduzeća, dok su rezultati o korištenju alata još slabiji i pokazuju da 77%<br />

anketiranih poduzeća prilikom procjene ne koristi nijedan alat.<br />

NIŠTA<br />

46%<br />

OSTALO<br />

15%<br />

Metrike<br />

LOC, UC<br />

8% FT<br />

8%<br />

25<br />

OT, UC<br />

15%<br />

UC<br />

8%<br />

5


Na koji način vrše procjenu troškova?<br />

Hrvatska softverska poduzeća procjenu vrše korištenjem procjene eksperta i na temelju<br />

iskustava iz prošlih projekta, i to je odgovorilo 54% anketiranih poduzeća. No,<br />

istovremeno, 62% anketiranih poduzeća ne održava i ne ažurira bazu podataka o procjeni<br />

završenih projekta, čime ti podaci ne mogu biti vjerodostojni i njihova uporaba za<br />

procjenu svih sljedećih projekata smanjuje pouzdanost procjene, što u konačnici dovodi<br />

do kašnjenja u isporuci softvera, povećanjem troškova ili prekidom razvoja.<br />

Koliko izbor metrike i alata ovisi o vrsti softvera i korištenim tehnologijama?<br />

Istraživanje je pokazalo da poduzeća koja razvijaju web aplikacije korištenjem objektno<br />

orijentiranih tehnologija, koriste neku metriku prilikom procjene, i to najčešće Use Case<br />

metriku 25%, dok se za ostale vrste softvera i tehnologije u pravilu ne koriste metrike i<br />

alati.<br />

Utječe li način procjene na uspjeh projekta?<br />

Iako hrvatska poduzeća ne uobičavaju koristiti dostupne metrike i alate pri procjeni,<br />

shvaćaju važnost procjene i njezin utjecaj na uspjeh projekta. Tako su skoro sva<br />

anketirana poduzeća važnost procjene ocijenila s jako važno i važno.<br />

8%<br />

7%<br />

bez odgovora<br />

Razlozi nekorištenja metrika<br />

8% 4% 4%<br />

23%<br />

Važnost procjene<br />

54%<br />

38%<br />

54%<br />

metrike nam ne bi pomogle za donošenje procjene<br />

nismo upoznati s metrikama za procjenu troškova<br />

ostalo<br />

nismo upoznati s metrikama za procjenu troškova, ostalo<br />

jako važno važno umjereno važno<br />

26<br />

6


ZAKLJUČAK<br />

Dolazi li do prekida razvoja softvera zbog loše procjene?<br />

Prema odgovorima anketiranih poduzeća, najčešći razlozi prekida razvoja softvera su:<br />

loša procjena izvodljivosti 32%, politička odluka 10% i loše voĎenje projekta 10%.<br />

Navedeni odgovori dokazuju da se prekid razvoja softvera dogaĎa zbog loše procjene.<br />

Informatičke organizacije pod konstantnim su pritiskom da unaprijede kvalitetu softverskih projekta i<br />

izlazne rezultate. UnapreĎenje procesa procjene jedan je od ključnih faktora. Voditelji projekta i<br />

programeri često se boje da će prezentiranje procjene koja je previsoka dovesti do toga da projekt<br />

bude odbijen, što je osnovni razlog donošenja i prezentiranja nerealnih rokova. Informatičke<br />

organizacije prilikom nabavke nekog od alata najčešće se odlučuju za nabavku popularnog alata na<br />

tržištu, neovisno o svojim stvarnim potrebama i uvode ga u organizaciju, ne iz razloga unapreĎenja<br />

procjene, već kako bi nadvladali pritisak za zahtjevima uprave. Ako se to napravi bez potrebne razine<br />

zrelosti u mjerenju, neadekvatnim skupljanjem metrika i nepridržavanjem procesa analize u<br />

organizaciji, samo uvoĎenje alata dovest će do kaosa.<br />

U ovome je radu prikazano da je za dobivanje što pouzdanije procjene potrebno razmotriti čitav niz<br />

različitih faktora i aspekata koji mogu i koji izravno utječu na konačnu procjenu. Metodom anketiranja<br />

pokazalo se da je loša procjena jedan od ključnih razloga koji imaju negativan utjecaj na razvoj<br />

softvera kao i da dovodi do kašnjenja u razvoju softvera te povećava troškove njegove izrade.<br />

Voditelji projekta često očekuju da će dobar alat za procjenu riješiti sve njihove probleme. No samom<br />

nabavkom takvog alata ne garantira se i dobra procjena. Dobra procjena zahtjeva, izmeĎu ostaloga,<br />

razumijevanje područja koje se procjenjuje, kao i uzimanje u obzir svih faktora koji na takvu procjenu<br />

utječu ili mogu utjecati u odreĎenim situacijama. U obzir se, nadalje, moraju uzeti postupci kao što su<br />

prikupljanje, rafiniranje i održavanje povijesnih podataka tekućih i prošlih projekta. Uloga povijesnih<br />

podataka jest da pruže ulazne podatke potrebne za dobivanje procjene iz korištenih alata. S<br />

upravljanjem i korištenjem povijesnih podataka prilikom procjene treba postupati vrlo oprezno, kako<br />

procjena ne bi otišla u krivom smjeru.<br />

Alat za procjenu bit će vrlo koristan onome tko zna na koji način treba vršiti procjenu. Ako je<br />

procjenitelj iskusan na području softverskog inženjerstva, poznaje promatranu domenu i tehnologiju,<br />

bit će u mogućnosti izvući maksimum koristi i iz alata s najskromnijim mogućnostima. Alati dopuštaju<br />

izvoĎenje nekoliko vrsta poslova vezanih uz procjenu, što se teško može izvršiti manualno, te<br />

omogućavaju izvoĎenje sofisticiranih statističkih simulacija koje pomažu pri shvaćanju obujma posla<br />

koji treba biti napravljen.<br />

Nijedna pojedinačna tehnika procjene troškova nije savršena, stoga je važno korištenje i kombiniranje<br />

nekoliko različitih pristupa. Primjer toga su i najsofisticiraniji komercijalni alati koji koriste barem tri<br />

različita pristupa procjene koji se zatim meĎusobno usporeĎuju za pregled dobivenih sličnosti ili<br />

razlika. Ukoliko su dobiveni približno jednaki rezultati to govori da se vjerojatno radi o dobroj procjeni,<br />

dok velike razlike izmeĎu njih govore da bi trebalo razmotriti faktore koji su se koristili ili izostavili za<br />

bolje razumijevanje dobivenih rezultata.<br />

POPIS LITERATURE<br />

1. Goodman, Paul: Software Metrics, Rothstein Associates Inc., 2004.<br />

2. McConnell, Steve: Software Estimation, Microsoft Press, 2006.<br />

3. Jones, Capers: Estimating Software Costs: Bringing Realism to Estimating, The McGraw-Hill<br />

Companies, 2007.<br />

27<br />

7


KONKURENTNO PROGRAMIRANJE – ORACLE BAZA, JAVA, EIFFEL<br />

Zlatko Sirotić<br />

Istra informatički inženjering d.o.o., Pula<br />

e-mail: zlatko.sirotic@iii.hr<br />

SAŽETAK<br />

U radu se govori o osnovama konkurentnog programiranja. Konkurentno programiranje nije novost,<br />

vuče korijene još iz 60-tih godina prošlog stoljeća, kada se uglavnom primjenjivalo kod operacijskih<br />

sustava. Prvo se daje prikaz konkurentnosti u Oracle bazi - naime, PL/SQL i JVM u bazi izravno ne<br />

podržavaju konkurentno programiranje, ali konkurentnost se neminovno javlja na razini rada sa<br />

transakcijama. Zatim se ukratko prikazuje konkurentnost u operacijskim sustavima, hardverska podrška<br />

konkurentnosti, pa sinkronizacijski algoritmi i mehanizmi. Zatim se prikazuje konkurentno programiranje u<br />

Javi verzije 1 - 4. Posebno se navode nove mogućnosti u Java verzijama 5, 6, 7. Na kraju se daje<br />

drugačiji pristup konkurentnom programiranju u OOPL jeziku Eiffel - SCOOP (Simple Concurrent Object-<br />

Oriented Programming).<br />

The paper discusses the basics of concurrent programming. Concurrent programming is not new, it<br />

has roots in 1960s when it was mainly applied in operating systems. First, concurrency in the Oracle<br />

database is described - although PL/SQL and the JVM in the database do not directly support concurrent<br />

programming, concurrency inevitably occurs at the level of transactions. Concurrency in the operating<br />

system, hardware support for concurrency, and synchronization algorithms and primitives are briefly<br />

discussed later. Concurrent programming in Java versions 1 - 4 is described after that. Specifically new<br />

features of Java 5, 6, 7 versions are outlined. Finally, the different approach of concurrent programming in<br />

Eiffel OOPL is presented - SCOOP (Simple Concurrent Object-Oriented Programming).<br />

UVOD<br />

Gotovo sva današnja računala imaju više CPU-a, manja računala u obliku višejezgrenih (engl. multicore)<br />

procesora, a veća i snažnija računala obično sadrže više procesora (isto višejezgrenih). Prednost je<br />

takvih računala da mogu paralelno izvršavati dva ili više (u ovisnosti od broja CPU-a) nezavisnih<br />

programa, ali mogu paralelno izvršavati i dijelove istog programa. U potonjem slučaju, ako su dijelovi<br />

programa nezavisni jedan od drugoga, tada programeri i dalje mogu pisati kod kao da se on odvija u<br />

jednom dijelu.<br />

No, najčešće su dijelovi programa međusobno zavisni, jer čitaju / pišu u isto memorijsko područje ili<br />

koriste neki drugi dijeljeni resurs, pa je moguće da dođe do tzv. race condition, gdje rezultat izračuna ovisi<br />

o redoslijedu izvršenja programskih instrukcija iz različitih dijelova programa. Zbog toga je potrebna<br />

sinkronizacija dijelova programa. Sinkronizacija traži posebne programske tehnike, koje svoje porijeklo<br />

imaju još u 60-tim godinama prošlog stoljeća. Te se programske tehnike obično zovu imenom<br />

konkurentno programiranje.<br />

U radu se u 1. točki prikazuje konkurentnost u Oracle bazi. Iako to nije konkurentno programiranje<br />

kao u programskim jezicima npr. Java, C++, Eiffel, ipak postoje neki slični problemi konkurentnosti u<br />

Oracle bazi i tim jezicima, npr. problemi zaključavanja, deadlocka (potpuni zastoj; u nastavku ćemo<br />

koristiti engleski termin, zbog jasnoće) i sl. S druge strane, neka najnovija softverska ili/i hardverska<br />

rješenja konkurentnog programiranja nastala su po ugledu na baze podataka – tzv. transakcijske<br />

memorije.<br />

U 2. točki prikazuje se konkurentnost na svom izvoru, tamo gdje je prvobitno i nastala – u<br />

operacijskim sustavima. U 3. točki daje se prikaz hardverske podrške za konkurentnost (naročito u<br />

dizajnu procesora). U 4. točki prikazuju se neki sinkronizacijski algoritmi i mehanizmi. U 5. točki prikazuju<br />

se neke "stare" tehnike konkurentnog programiranja u Javi verzije 1 do 4, a u 6. točki neke novije tehnike,<br />

koje je omogućila verzija 5, a u verzijama 6 i 7 su još poboljšane.<br />

Nažalost, konkurentno programiranje teže je od uobičajenog, sekvencijalnog programiranja, ali sa<br />

razvojem višejezgrenih procesora konkurentno programiranje postaje nužnost u "svakodnevnom<br />

programiranju". Postoje pokušaji (vrijeme će pokazati da li su uspješni) da se konkurentno programiranje<br />

učini jednostavnijim. Jedan drugačiji pristup konkurentnom programiranju u odnosu na onaj u Javi (a<br />

slično Javi ima i C#, pa i C++), koji bi trebao olakšati konkurentno programiranje, prikazan je u 7. točki –<br />

Simple Concurrent Object Oriented Programming (SCOOP), model koji je realiziran u OOPL jeziku Eiffel.<br />

28


1. KONKURENTNO PROGRAMIRANJE U ORACLE BAZI<br />

Uz programiranje operacijskih sustava i programiranje superračunala, programiranje sustava za<br />

upravljanje bazama podataka (SUBP) je treće područje koje je i do sada značajno koristilo tehnike<br />

konkurentnog programiranja. No, tehnike konkurentnog programiranja prisutne su, iako u blažoj verziji (tj.<br />

na jednostavniji način), i kod korištenja SUBP-a, npr. kod programiranja u jeziku Oracle PL/SQL.<br />

Poznato je da u Oracle bazi sesija (baze) nikada ne vidi promjene (tj. efekte DML naredbi) koje je<br />

napravila neka druga sesija, sve dok ta druga sesija ne napravi COMMIT. U Oracle bazi to je realizirano<br />

pomoću UNDO tablespacea, diskovne strukture u kojoj sesije čitaju prethodno stanje podataka, a ne<br />

tekuće stanje koje je zapisano u tablicama podataka, ali promjene još nisu COMMIT-irane.<br />

No, sesija ipak ovisi o drugoj sesiji, jer su redci koje je ažurirala (unijela / mijenjala / brisala) druga<br />

sesija nedostupni (tj. zaključani) prvoj sesiji. Redci se uobičajeno ne mogu otključati do kraja tekuće<br />

transakcije u sesiji koja ih je zaključala, tj. dok ona ne daje COMMIT ili ROLLBACK. Redci se mogu<br />

otključati i sa ROLLBACK TO SAVEPOINT, ali treba podsjetiti da sesiji koja pokuša pristupiti zaključanim<br />

redcima prije nego druga sesija napravi ROLLBACK TO SAVEPOINT, ti redci i daje ostaju zaključani (do<br />

COMMIT ili ROLLBACK).<br />

Sesija koja čeka na zaključane retke u pravilu čeka neograničeno, tj. dok joj druga sesija ne otključa<br />

retke. Postoje dva izuzetka:<br />

- sesija može pokušati zaključati retke sa<br />

SELECT ... FOR UPDATE;<br />

i navesti da ne želi čekati<br />

SELECT ... FOR UPDATE NOWAIT;<br />

ili želi čekati određeni broj sekundi<br />

SELECT ... FOR UPDATE WAIT timeout;<br />

ako je druga sesija zaključala redak, onda se prvoj sesiji javlja greška<br />

ORA-00054: resource busy and acquire with NOWAIT specified;<br />

- ako sesija čeka na otključavanje redaka sa udaljene baze, onda je čekanje definirano<br />

parametrom DISTRIBUTED_LOCK_TIMEOUT, koji ima standardnu vrijednost 60 sekundi;<br />

ako druga sesija drži zaključan redak, nakon isteka tog vremena prvoj sesiji javit će se greška<br />

ORA-02049: timeout: distributed transaction waiting for lock;<br />

ovu smo činjenicu koristili za trik (koji smo prikazali na HrOUG 2003) – kako izbjeći neograničeno<br />

čekanje otključavanja retka kod INSERT naredbe (gdje prethodno korištenje naredbe<br />

SELECT .. FOR UPDATE NOWAIT nema efekta, jer redak za druge sesije ne postoji).<br />

Osim zaključavanja redaka (jednog ili više), ponekad želimo zaključati cijelu tablicu. Zanimljivo je da<br />

zaključavanje tablice možemo izvesti u djeljivom ili ekskluzivnom načinu (modu).<br />

Više sesija može zaključati tablicu u djeljivom načinu:<br />

LOCK TABLE tablica IN SHARE MODE NOWAIT;<br />

Samo jedna sesija može zaključati tablicu u ekskluzivnom načinu (ako ju neka druga sesija nije već<br />

zaključala u djeljivom ili ekskluzivnom načinu):<br />

LOCK TABLE tablica IN EXCLUSIVE MODE NOWAIT;<br />

Zaključavanje tablice u djeljivom i ekskluzivnom načinu može se iskoristiti npr. za omogućavanje da<br />

više sesija mijenja neku tablicu dokumenata (npr. tablicu narudžbi), a da samo jedna sesija može raditi<br />

obradu narudžbi. Pritom se može zaključavati izvorna tablica dokumenata (npr. narudžbi), ili neka<br />

pomoćna tablica, koja može imati malo redaka (može i jedan, pa i nijedan).<br />

Iako se zaključavanje često radi implicitno, pomoću DML naredbi (INSERT, UPDATE, DELETE),<br />

ponekad je potrebno koristiti eksplicitno zaključavanje pomoću SELECT ... FOR UPDATE (rijetko se<br />

koristi LOCK TABLE) kako bi se sačuvao integritet podataka. Npr. pretpostavimo da imamo tri bankovna<br />

računa, svaki sa početnim iznosom od 1000 kuna. Transakcija T1 koja skida 100 kuna sa računa broj 1 i<br />

stavlja ih na račun broj 2, mogla bi izgledati ovako (zanemarimo što programski kod nije optimalan):<br />

SELECT iznos INTO v_iznos_d FROM racuni WHERE broj = 1;<br />

v_iznos_d := v_iznos_d - 100;<br />

UPDATE racuni SET iznos = v_iznos_d WHERE broj = 1;<br />

SELECT iznos INTO v_iznos_p FROM racuni WHERE broj = 2;<br />

v_iznos_p := v_iznos_p + 100;<br />

UPDATE racuni SET iznos = v_iznos_p WHERE broj = 2;<br />

29


No, pretpostavimo da u isto vrijeme transakcija T2 skida 200 kuna sa računa broj 3 i stavlja ih isto na<br />

račun broj 2:<br />

SELECT iznos INTO v_iznos_d FROM racuni WHERE broj = 3;<br />

v_iznos_d := v_iznos_d - 200;<br />

UPDATE racuni SET iznos = v_iznos_d WHERE broj = 3;<br />

SELECT iznos INTO v_iznos_p FROM racuni WHERE broj = 2;<br />

v_iznos_p := v_iznos_p + 200;<br />

UPDATE racuni SET iznos = v_iznos_p WHERE broj = 2;<br />

Može se desiti npr. sljedeći redoslijed radnji:<br />

T1:<br />

SELECT iznos INTO v_iznos_d FROM racuni WHERE broj = 1;<br />

v_iznos_d := v_iznos_d - 100;<br />

UPDATE racuni SET iznos = v_iznos_d WHERE broj = 1;<br />

SELECT iznos INTO v_iznos_p FROM racuni WHERE broj = 2;<br />

v_iznos_p := v_iznos_p + 100;<br />

UPDATE racuni SET iznos = v_iznos_p WHERE broj = 2;<br />

T2:<br />

SELECT iznos INTO v_iznos_d FROM racuni WHERE broj = 3;<br />

v_iznos_d := v_iznos_d - 200;<br />

UPDATE racuni SET iznos = v_iznos_d WHERE broj = 3;<br />

SELECT iznos INTO v_iznos_p FROM racuni WHERE broj = 2; -- čita staro stanje!<br />

v_iznos_p := v_iznos_p + 200;<br />

UPDATE racuni SET iznos = v_iznos_p WHERE broj = 2; -- redak je zaključan od T1<br />

T1:<br />

COMMIT; -- sada je T2 napravila UPDATE<br />

T2:<br />

COMMIT;<br />

Kakvo je sada stanje računa. Stanje računa 1 i 3 (davatelji) je točno – račun 1 ima 900 kuna, račun 3<br />

ima 800 kuna. Račun 2 (primatelj) trebao bi imati 1300 kuna, no ima 1200, jer je druga transakcija kod<br />

SELECT-a na računu broj 2 vidjela stanje od 1000 kuna.<br />

Jedan od načina da se ovaj kod napiše ispravno, je – zaključavanje oba računa unaprijed, pomoću<br />

naredbi SELECT FOR UPDATE. Npr. transakcija T1 mogla bi izgledati ovako:<br />

SELECT iznos INTO v_iznos_d FROM racuni WHERE broj = 1 FOR UPDATE;<br />

SELECT iznos INTO v_iznos_p FROM racuni WHERE broj = 2 FOR UPDATE;<br />

v_iznos_d := v_iznos_d - 100;<br />

v_iznos_p := v_iznos_p + 100;<br />

UPDATE racuni SET iznos = v_iznos_d WHERE broj = 1;<br />

UPDATE racuni SET iznos = v_iznos_p WHERE broj = 2;<br />

No, sada se može desiti deadlock - ako dvije transakcije pokušaju zaključati dva retka, ali u<br />

suprotnom redoslijedu. Npr. u slučaju da transakcija T1 uspješno zaključa račun broj 1, transakcija T2<br />

uspješno zaključa račun 2, a obje žele zaključati i suprotni račun, desit će se deadlock:<br />

T1: SELECT iznos ... FROM racuni WHERE broj = 1 FOR UPDATE; -- uspješno<br />

T2: SELECT iznos ... FROM racuni WHERE broj = 2 FOR UPDATE; -- uspješno<br />

T1: SELECT iznos ... FROM racuni WHERE broj = 2 FOR UPDATE; -- čeka<br />

T2: SELECT iznos ... FROM racuni WHERE broj = 1 FOR UPDATE; -- čeka<br />

Srećom, Oracle baza otkrit će da je došlo do deadlocka, te će jedna od dvije transakcije dobiti<br />

grešku ORA-00060: deadlock detected while waiting for resource. Nakon što ta transakcija (koja je dobila<br />

grešku) napravi ROLLBACK, druga transakcija će nastaviti sa radom.<br />

30


Za kraj, prikažimo kako se u Oracle bazi može napraviti paralelno izvršavanje dijelova programa<br />

pomoću jobova. Izvorno smo ovu metodu koristili kod distribuiranih baza, gdje smo na jednoj bazi<br />

("centralna baza") pokretali jobove koji su pozivali udaljene procedure na drugim (udaljenim) bazama.<br />

Udaljene procedure paralelno obrađuju lokalne podatke, a nakon završetka svake procedure job javlja<br />

centralnoj bazi da je procedura završila. Kada centralna baza dobije odgovor od svih jobova,<br />

sekvencijalno (u jednoj transakciji) prikuplja rezultate udaljenih baza. Navedena metoda može se koristiti i<br />

na jednoj bazi, ali je korisna samo ako ta baza ima više raspoloživih (slobodnih) CPU-a. Poželjno bi bilo<br />

da je broj slobodnih CPU-a veći ili jednak broju jobova, tako da sve procedure mogu raditi paralelno. Ovo<br />

je osnovna logika te metode:<br />

...FOR cur IN (SELECT baza FROM udaljene_baze) LOOP<br />

DBMS_ALERT.REGISTER (cur.baza);<br />

naredba_l :=<br />

'BEGIN ' ||<br />

' udaljena_procedura@' || cur.baza || ';' ||<br />

' DBMS_ALERT.SIGNAL (''' || cur.baza || ''', '' OK, '');' ||<br />

'EXCEPTION' ||<br />

' WHEN OTHERS THEN' ||<br />

' DECLARE' ||<br />

' l_greska VARCHAR2 (20) := SUBSTR (SQLCODE, 1, 20);' ||<br />

' BEGIN' ||<br />

' ROLLBACK;' ||<br />

' DBMS_ALERT.SIGNAL (''' || cur.baza || ''', l_greska);' ||<br />

' END;' ||<br />

'END;';<br />

DBMS_JOB.SUBMIT (pid_l, naredba_l, SYSDATE, NULL, FALSE);<br />

br_jobova_l := br_jobova_l + 1;<br />

END LOOP;<br />

COMMIT; -- nužan za pokretanje JOB-ova<br />

/*<br />

Čeka na završetak svih JOB-ova ili istek vremena (1800 sekundi)<br />

za svaki prolaz u FOR petlji.<br />

*/<br />

FOR i IN 1..br_jobova_l LOOP<br />

DBMS_ALERT.WAITANY (alert_l, poruka_l, status_l, 1800);<br />

IF status_l = 1 THEN -- isteklo je vrijeme, a alert se nije okinuo<br />

RAISE jobovima_isteklo_vrijeme;<br />

END IF;<br />

IF poruka_l ' OK, ' THEN -- JOB je puknuo<br />

poruka_za_gresku_l := alert_l || ' - ' || poruka_l;<br />

RAISE puknuo_job;<br />

END IF;<br />

poruka_za_gresku_l := poruka_za_gresku_l || alert_l || poruka_l;<br />

END LOOP;<br />

DBMS_ALERT.REMOVEALL;<br />

/*<br />

INSERT sa svih udaljenih baza<br />

- serijski (ali radi brzo), kako bi bila jedna transakcija<br />

*/<br />

FOR cur IN (SELECT baza FROM udaljene_baze)<br />

LOOP ...<br />

END LOOP;<br />

COMMIT;<br />

31


2. KONKURENTNO PROGRAMIRANJE I OPERACIJSKI SUSTAVI<br />

Ideja o konkurentnom računanju (concurrent computation) razvila se baš na području operacijskih<br />

sustava. Prvi operacijski sustavi, napravljeni 50-tih godina prošlog stoljeća, bili su sekvencijalni, tj.<br />

računalni programi izvršavali su se na njima slijedno, jedan iza drugoga. Vrlo brzo se uvidjelo da je to vrlo<br />

neracionalan način korištenja računala (u to vrijeme vrlo rijetkih i skupih), pa su 60-tih godina napravljeni<br />

brojni operacijski sustavi koji su omogućavali konkurentno korištenje računalnih resursa.<br />

Tadašnja velika računala, kao i donedavno uobičajena osobna računala, imala su samo jedan CPU.<br />

Zbog toga se programi na njima nisu zaista izvršavali paralelno (ako zanemarimo specijalne programe,<br />

koji su se zaista izvršavali paralelno sa glavnim programima, npr. na specijaliziranim procesorima ulaznoizlaznih<br />

jedinica), već kvazi-paralelno. Uobičajeno se takav kvazi-paralelan način rada naziva<br />

višezadaćnost (multitasking). Procesi, kako se nazivaju programi u izvršavanju (može se reći i da su<br />

procesi instance programa u izvršavanju) u višezadaćnom radu izvršavaju se slijedno na istom CPU, ali<br />

se zbog isprepletenog izvršavanja djelića različitih procesa (tj. niza instrukcija), čini kao da se procesi<br />

izvršavaju paralelno. Na slici 2.1 vidi se prikaz višezadaćnosti:<br />

Slika 2.1: Višezadaćnost (multitasking): instrukcije se međusobno isprepliću; Izvor: [14]<br />

Vrlo brzo su se pojavila velika računala sa dva ili više CPU-a, a danas je uobičajeno da i najjeftinija<br />

prijenosna računala imaju dva CPU-a, u obliku dvije jezgre smještene u isti mikroprocesor (bolje rečeno<br />

mikroprocesorski čip). Ovakva računala omogućavaju da se dva procesa (ili više, ovisno o broju CPU-a)<br />

zaista izvršavaju paralelno, što se uobičajeno naziva multiprocesorski rad ili multiprocesiranje<br />

(multiprocessing), kako prikazuje slika 2.2:<br />

Slika 2.2: Multiprocesiranje (multiprocessing): instrukcije se izvršavaju paralelno; Izvor: [14]<br />

I multiprocesiranje i višezadaćnost su primjeri konkurentnog izvršavanja. Postoji i distribuirano<br />

izvršavanje, koje je po svom ponašanju dosta slično konkurentnom izvršavanju. Razlika je u tome što se<br />

konkurentno izvršavanje zbiva na jednom računalu (koje može imati više CPU-a, pa i stotine i tisuće), a<br />

distribuirano izvršavanje zbiva se na dva ili više računala koja su spojena mrežom.<br />

Ne ulazeći u detalje zbivanja u operacijskim sustavima (detalje se može vidjeti npr. u [2]), može se<br />

reći da proces operacijskog sustava ima sljedeće najvažnije elemente [14]:<br />

- Identifikator procesa: jedinstveni ID procesa;<br />

- Stanje procesa: tekuća aktivnost procesa;<br />

- Kontekst procesa: vrijednost programskog brojača i vrijednost svih registara CPU-a;<br />

- Memorija: tekst programa, globalni podaci, stog (stack) i gomila (heap).<br />

32


Slika 2.3 prikazuje najvažnije elemente procesa operacijskog sustava:<br />

Slika 2.3: Najvažniji elementi procesa operacijskog sustava; Izvor: [13]<br />

Operacijski sustav koristi poseban program - raspoređivač (scheduler), koji određuje kojem procesu<br />

treba dodijeliti (neki) procesor. Procesi mogu biti u ova tri generalna stanja [14]:<br />

- Pokrenut (running): instrukcije procesa se izvršavaju na (nekom) procesoru;<br />

- Spreman (ready): proces je spreman za izvršavanje, ali trenutačno mu nije dodijeljen procesor;<br />

- Blokiran (blocked): proces čeka da se desi neki događaj (npr. da se završi čitanje podataka sa<br />

diska ili iz memorije, koji su potrebni za nastavak rada procesa).<br />

Slika 2.4 prikazuje tranziciju stanja procesa operacijskog sustava (dodana su i terminalna stanja new<br />

i terminated):<br />

Slika 2.4: Tranzicija stanja procesa operacijskog sustava; Izvor: [13]<br />

Zamjena (swapping) procesa koji se izvršavaju na CPU-u naziva se zamjena konteksta (context<br />

switch). Pretpostavimo da je proces P1 u stanju pokrenut i treba biti zamijenjen procesom P2 koji mora<br />

biti u stanju spreman. Program raspoređivač postavlja stanje procesa P1 na spreman i snima njegov<br />

kontekst u memoriju, kako bi ga poslije mogao "probuditi" i omogućiti da nastavi sa istog mjesta na kojem<br />

je stao. Raspoređivač dalje koristi kontekst procesa P2 kako bi postavio vrijednosti registara CPU-a i<br />

postavlja proces P2 u stanje pokrenut. Ta zbivanja prikazuje slika 2.3:<br />

Slika 2.5: Zamjena konteksta (context switch): proces P1 se odstranjuje iz procesora<br />

i zamjenjuje ga proces P2; Izvor: [14]<br />

33


U prethodnom opisu proces P1 je iz stanja pokrenut prešao u stanje spreman, a proces P2 obrnuto.<br />

No, moguće je da proces pređe iz stanja pokrenut u stanje blokiran, jer čeka da se desi neki događaj<br />

(npr. da završi čitanje podataka sa diska ili iz memorije, ili da drugi proces napravi neki niz instrukcija).<br />

Blokirani proces ne može direktno preći u stanje pokrenut, nego prvo mora preći u stanje spreman, a<br />

onda ga raspoređivač može staviti u stanje pokrenut.<br />

Kod paralelnog ili (kvazi-paralelnog) izvršavanja procesa možemo u načelu razlikovati dva slučaja. U<br />

prvom slučaju procesi su nezavisni jedan od drugoga, tj. ne komuniciraju međusobno. Inače,<br />

komunikacija između dva procesa radi se preko razmjene poruka (rjeđe) ili preko čitanja/pisanja u<br />

zajednički dio memorije (češće). Zapravo, i nezavisni procesi mogu u nekom smislu biti zavisni, tj. ovise o<br />

zajedničkim resursima kao što su procesori (koji ih izvršavaju), ulazno-izlazne jedinice i sl. Programiranje<br />

nezavisnih konkurentnih procesa zapravo se ne razlikuje od programiranja sekvencijalnih procesa. U<br />

drugom slučaju procesi su zavisni, tj. međusobno komuniciraju. Tada je potrebno koristiti mehanizme<br />

sinkronizacije kako bi se procesi izvršavali na ispravan način - to je "pravo" konkurentno programiranje.<br />

No, nisu samo procesi oni koji se mogu izvršavati paralelno (ili kvazi-paralelno). Ako je dobro da se<br />

procesi mogu izvršavati paralelno, onda to može biti dobro i za manje dijelove programa nego što su<br />

procesi, tj. dobro je da se paralelno (ili kvazi-paralelno) mogu izvršavati dijelovi istog programa! Dijelovi<br />

programa koji se mogu izvršavati paralelno zovu se dretve ili niti (threads). Može se reći: "dretve su lagani<br />

procesi". Procesi koji su sastavljeni od više dretvi zovu se višedretveni (multithreaded).<br />

Dretve jednog procesa dijele adresni prostor tog procesa, tj. jedna dretva vidi podatke druge dretve.<br />

Zapravo, dretve dijele globalnu memoriju (programski kod i globalne podatke) i gomilu (heap), ali imaju<br />

vlastiti stog (stack) i kontekst dretve, kako prikazuje slika 2.6:<br />

Slika 2.6: Najvažniji elementi dretvi operacijskog sustava<br />

(prikazane su tri dretve koje pripadaju istom procesu); Izvor: [13]<br />

Zamjena konteksta dretvi u pravilu se izvodi nekoliko puta brže od zamjene konteksta procesa. U [7]<br />

se navodi da je zamjena konteksta dretve puno efikasnija od zamjene konteksta procesa, koja tipično<br />

traje stotine do tisuće ciklusa procesa. Zbog toga svi današnji moderni operacijski sustavi nisu samo<br />

višeprocesni, nego i višedretveni. No i tu se očekuju poboljšanja, jer kako je navedeno u [3] "Postojeći<br />

raspoređivači nisu pripremljeni za stotine CPU-a i tisuće dretvi koje su u stanju pokrenut (running)."<br />

Dretve se mogu dodjeljivati procesorima na isti način na koji se mogu dodjeljivati procesi. Npr. u<br />

računalnom sustavu sa četiri CPU-a, sustav može u određenom trenutku paralelno izvršavati četiri<br />

različita procesa, ali može izvršavati i četiri dretve istog procesa, ili bilo koju kombinaciju. Istina, zbog<br />

optimizacije sustav može odabrati da je bolje rasporediti određene dretve na određene procesore.<br />

34


3. UTJECAJ RAZVOJA MIKROPROCESORA NA KONKURENTNO PROGRAMIRANJE<br />

Materijal [4], znakovitog naslova "Not Your Father's Von Neumann Machine: A Crash Course in<br />

Modern Hardware", navodi da je Von Neumannov model računala (prikazan na slici 3.1) u današnje<br />

vrijeme samo korisna apstrakcija, koja u mnogim detaljima odudara od stvarnih današnjih računala:<br />

Slika 3.1: Von Neumannov model računala; Izvor: [4]<br />

U knjizi [7], autori daju grafikon (slika 3.2) koji prikazuje rast performansi procesora 1978.-2005.<br />

godine. Vidljiva su tri razdoblja: razdoblje CISC računala do 1986., u kojem je prosječno godišnje<br />

povećanje performansi 25%; razdoblje velikog povećanja radnog takta procesora, gdje je povećanje<br />

performansi 52% godišnje; razdoblje višejezgrenih procesora, gdje se radni taktovi procesora više nisu<br />

povećavali:<br />

Slika 3.2: Rast performansi procesora od 1978. do 2005.; Izvor: [7]<br />

No, to ne znači da je prestao vrijediti Mooreov zakon, jer broj tranzistora po procesoru i dalje<br />

eksponencijalno raste, kako pokazuje slika 3.3. No, radni takt procesora praktički je prestao rasti oko<br />

2005. Razlog za to je prije svega veliko povećanje potrošnje struje procesora na velikim brzinama. Zbog<br />

toga su se proizvođači okrenuli drugačijem načinu povećanja performansi procesora. Umjesto povećanja<br />

brzine, povećali su broj CPU-a na jednom mikroprocesorskom čipu, tj. počeli su proizvoditi višejezgrene<br />

procesore. No, dok smo kod jednojezgrenih procesora povećanjem takta procesora dobili linearno<br />

povećanje brzine programa, kod višejezgrenih procesora program najčešće moramo pisati drugačije da<br />

bismo iskoristili raspoložive jezgre, tj. moramo preći na konkurentno programiranje.<br />

Slika 3.3: Povećanje broja tranzistora i radnog takta procesora od 1973. do 2010.; Izvor: [15]<br />

35


U [7] se daje zanimljiv grafikon (slika 3.4) koji pokazuje kako se širina pojasa (bandwidth) ili<br />

propusnost glavnih elemenata računala (procesora, memorije, diska, mreže) povećavala daleko brže od<br />

brzine pristupa (latency).<br />

Slika 3.4: Log-log dijagram kretanja odnosa propusnosti i brzine pristupa<br />

kod glavnih elemenata računala; Izvor: [7]<br />

Tablica 3.1 prikazuje razlike u veličini, brzini pristupa, propusnosti i nekim drugim karakteristikama<br />

različitih vrsta memorije, tj. procesorskih registara, priručne memorije (cache), glavne memorije i diskova<br />

(konkretni podaci vrijede za oko 2005. godinu). Vidi se da je glavna memorija 10 i više puta sporija od<br />

registara i priručne memorije:<br />

Tablica 3.1: Razlike u veličini, brzini pristupa i drugim karakteristikama<br />

različitih vrsta memorije; Izvor: [7]<br />

Slika 3.5 pokazuje kako se eksponencijalno povećava jaz između performansi CPU-a i performansi<br />

glavne memorije (DRAM):<br />

Slika 3.5: Povećanje jaza između performansi CPU-a i performansi DRAM-a; Izvor: [4]<br />

36


Naravno, nije nemoguće napraviti glavnu memoriju koja bi bila brza skoro kao registri procesora.<br />

Problem je što bi takva memorija bila puno skuplja. Naime, glavna memorija standardno koristi tzv.<br />

DRAM (Dynamic RAM) memoriju, koja za svaki bit memorije treba jedan tranzistor i jedan kondenzator.<br />

Daleko brža SRAM (Static RAM) memorija za svaki bit memorije treba šest tranzistora. Ako treba birati<br />

između sustava sa većom količinom sporije glavne memorije i sustava sa manjom količinom brže glavne<br />

memorije, u pravilu je bolje izabrati prvo, jer je magnetski disk daleko sporiji od najsporije glavne<br />

memorije. No, još je bolje napraviti hijerarhiju memorija, tj. koristiti bržu i manju SRAM priručnu memoriju<br />

(ili više razina te memorije) zajedno sa većom i sporijom DRAM glavnom memorijom. Budući da programi<br />

često koriste programske instrukcije koje se nalaze blizu jedna drugoj, a to često vrijedi i za podatke,<br />

priručne memorije značajno ublažavaju sporost pristupa glavnoj memoriji. Slika 3.6 prikazuje dva primjera<br />

korištenja priručne memorije, jedan jednostavniji i jedan složeniji (oba primjera prikazuju jednojezgreni<br />

procesor):<br />

Slika 3.6: Dva primjera korištenja priručne memorije; lijevo je jednostavniji sustav sa jednom<br />

razinom priručne memorije; desno je složeniji sustav sa tri razine priručne memorije,<br />

a prva razina ima odvojenu memoriju za podatke (L1d) i za instrukcije programa (L1i);<br />

Izvor: [5]<br />

Osim uvođenja priručne memorije u mikroprocesorske čipove, dizajneri su od 1985. nalazili i druga<br />

rješenja za rješavanje jaza između brzine registara i brzine glavne memorije, kako bi u konačnici povećali<br />

brzinu izvođenja programa.<br />

Jedan od načina koji je jako pridonosio povećanju performansi procesora sve dok je bilo moguće<br />

povećavati radni takt procesora (a to je postalo problematično zbog prevelikog zagrijavanja procesora) je<br />

tzv. paralelizam na razini instrukcija, ILP (Instruction-Level Parallelism). ILP obuhvaća više mehanizama,<br />

od kojih je najvažniji pipelining ("cjevovod instrukcija"), gdje se u procesor paralelno dovodi više<br />

instrukcija (istog programa) koje se paralelno obrađuju, ali tako da se za svaku instrukciju istovremeno<br />

radi različita faza obrade. Na taj način, ako se npr. jedna prosječna instrukcija obrađuje u pet faza kroz<br />

pet radnih taktova, paralelnom obradom pet instrukcija istovremeno moguće je teoretski svesti prosječno<br />

vrijeme obrade instrukcije na samo jedan takt. Problem su, međutim, npr. instrukcije grananja, tj. sve<br />

instrukcije koje narušavaju sekvencijalni tok programa. Na rješavanje takvih problema kod ILP-a dizajneri<br />

procesora su trošili sve više i više tranzistora u procesoru.<br />

Dosjetili su se da bi ILP mogli koristiti i na drugi način. Umjesto da paralelno obrađuju (u različitim<br />

fazama) instrukcije istog programa, mogli bi paralelno obrađivati instrukcije različitih programa, tj.<br />

instrukcije različitih dretvi (threads). Treba naglasiti da procesorske dretve (ili hardverske dretve) mogu<br />

odgovarati i dretvama i procesima operacijskog sustava. Takvo obrađivanje instrukcija naziva se<br />

multithreading (Intel koristi ime Hyper-Threading Technology), a prikazuje ga slika 3.7:<br />

Slika 3.7: Multithreading kod procesora; Izvor: [4]<br />

37


Multithreading (kao niti ILP) ne može činiti čuda. Naime, za razliku od višejezgrenih procesora, kod<br />

multithreadinga su duplirani samo neki elementi CPU-a. Npr. kod Intelove implementacije duplirani su<br />

samo procesorski registri. Dretve dijele i istu priručnu memoriju. Zbog toga procesor koji podržava dvije<br />

procesorske dretve nikako ne može imati 2 puta bolje performanse od istovrsnog procesora koji podržava<br />

samo jednu dretvu, već u praksi maksimalno do oko 1,3 puta (a i to vrlo rijetko). No, multithreading je<br />

ipak koristan, a koristi se i kod višejezgrenih procesora.<br />

Kada je postalo jasno da se više ne može povećavati radni takt procesora (zbog eksponencijalnog<br />

povećanja potrošnje, pa onda i zagrijavanja procesora), a broj tranzistora po procesoru se i dalje<br />

eksponencijalno povećava, bilo je razumno početi smještati dva ili više CPU-a (jezgri) u jedan procesorski<br />

čip. U računalo se onda može ugrađivati i nekoliko višejezgrenih procesora, pa se dobije arhitektura npr.<br />

kao na slici 3.8. Na njoj je prikazan sustav sa dva dvojezgrena procesora, a svaka jezgra ima dvije<br />

procesorske dretve (T1 i T2). Dretve jedne jezgre dijele priručne memorije L1i i L1d. Jezgre dijele<br />

priručne memorije L2 i L3. Dva procesora nemaju zajedničku priručnu memoriju, te pristupaju glavnoj<br />

memoriji na uobičajen način – to je tzv. centralna djeljiva memorija. Takva se arhitektura glavne memorije<br />

ponekad naziva UMA (Uniform Memory Access), ali se češće naziva SMP (Symmetric Multi-Processors)<br />

arhitektura, iako se naziv SMP ponekad koristi za UMA i NUMA arhitekturu zajedno.<br />

Slika 3.8: Sustav sa dva dvojezgrena procesora (svaka jezgra podržava dvije dretve); Izvor: [5]<br />

Osim arhitekture centralne djeljive memorije, postoji i arhitektura distribuirane djeljive memorije. Iako<br />

je i takva memorija djeljiva između svih procesora (pa neki kažu da je i to simetrična arhitektura, SMP),<br />

određeni dijelovi memorije su bliži određenim procesorima. Takva se arhitektura uobičajeno naziva<br />

NUMA (Non-Uniform Memory Access). Procesor ima najbrži pristup svom "lokalnom" dijelu glavne<br />

memorije, a brzina pristupa udaljenim dijelovima memorije ovisi o udaljenosti procesora od onoga<br />

procesora kojemu "pripada" taj dio memorije. U NUMA arhitekturi procesori nisu međusobno povezani<br />

(samo) preko memorijske sabirnice, nego su direktno povezani sa određenim brojem drugih procesora<br />

(tzv. Hyper Link; AMD koristi varijantu HyperTransport, tehnologiju licenciranu od nekadašnje firme<br />

Digital). Najčešće su povezani u obliku "hiperkocke", kao što pokazuje slika 3.9. Npr., kod desne<br />

hiperkocke (sa 8 procesora, C = 3), procesor 1 najbrže pristupa vlastitoj memoriji, a nakon toga<br />

memorijama procesora 2, 3 i 5 (sa kojima je direktno povezan, C = 1), a najudaljeniji mu je procesor 8, pa<br />

je pristup njegovoj memoriji najsporiji (C = 3).<br />

Slika 3.9: Povezivanje procesora (i pripadajućih dijelova glavne memorije) u hiperkocke ; Izvor: [5]<br />

Danas na tržištu postoji nekoliko procesora koji su višejezgreni, podržavaju višedretvenost i mogu se<br />

međusobno povezivati. Npr. Oracle (prije Sun) SPARC T3 procesor, poznat i kao Niagara 3 (prikazan na<br />

slici 3.10) ima 16 jezgri, svaka jezgra podržava 8 dretvi, a moguće je spojiti 4 takva procesora, čime se<br />

38


dobije 16 * 8 * 4 = 512 dretvi.<br />

Slika 3.10: Oracle SPARC T3 procesor ima 16 jezgri, a svaka podržava 8 dretvi; Izvor: [15]<br />

No, trenutačni lider na području standardnih (nespecijaliziranih) procesora je Vega 3 firme Azul<br />

Systems, koji je prvenstveno ciljan za tržište Java servera. Procesor ima 54 jezgre, a moguće je spojiti 16<br />

procesora (koristi se UMA arhitektura), čime se dobije sustav sa 864 jezgre. Ono što čini ovaj procesor<br />

zanimljivim je i podrška za tzv. hardversku transakcijsku memoriju (Hardware Transactional Memory).<br />

Osim Vega procesora (verzije 1, 2 i 3), Azul Systems je prilagodio Sun JVM koji podržava heap veličine i<br />

preko 500 GB, sa maksimalnim pauzama za GC (Garbage Collector) od samo 10-20 ms, a to zahvaljujući<br />

i podršci procesora Vega za GC [3].<br />

Nažalost, kod višejezgrenih procesora (i višeprocesorskih sustava općenito) rast performansi<br />

sustava rijetko raste proporcionalno sa povećanjem broja jezgri, već je rast općenito manji. Za razliku od<br />

toga, povećanje radnog takta kod jednojezgrenih i jednoprocesorskih sustava u pravilu je povećavalo<br />

performanse skoro linearno. Zapravo, u nekim slučajevima se proporcionalno povećanje performansi<br />

može postići i kod višejezgrenih / višeprocesorskih sustava, npr. onda kada takvi sustavi služe za<br />

podršku baza podataka i aplikacijskih servera, gdje su pojedini procesi (ili dretve) međusobno nezavisni.<br />

No, kada pokušamo paralelizirati (razbiti u dretve) jedan program, najčešće dobijemo rezultat prikazan na<br />

desnoj strani slike 3.10, a ne onaj prikazan na lijevoj strani:<br />

Slika 3.11 Povećanje broja jezgri obično ne rezultira (skoro) linearnim povećanjem performansi<br />

(lijeva strana slike), već puno manjim od toga (desna strana slike); Izvor: [13]<br />

Razlog za to objašnjava Amdahlov zakon [13]. Ako je u nekom programu proporcija onih dijelova<br />

programa koji se mogu paralelno izvršavati jednaka p (što znači da je proporcija dijelova koji se ne mogu<br />

paralelno izvršavati jednaka 1 – p), onda se povećanjem broja CPU-a može dobiti ovo povećanje:<br />

Npr. ako imamo 10 procesora i ako je moguće paralelizirati 90% programa, onda je maksimalno<br />

povećanje brzine 5,26 puta, što je skoro dva puta manje od broja procesora. Ako je moguće paralelizirati<br />

99% programa, onda je povećanje 9,17 puta.<br />

39


4. SINKRONIZACIJSKI ALGORITMI I MEHANIZMI<br />

Pretpostavimo da smo napisali sljedeći programski kod [10] za računanje sekvence cijelih brojeva:<br />

@NotThreadSafe<br />

public class UnsafeSequence {<br />

private int value;<br />

/** Returns a unique value. */<br />

public int getNext() {<br />

return value++;<br />

}<br />

}<br />

Prethodni kod nije dobar u konkurentnom radu. Npr., ako dvije dretve A i B izvode metodu getNext(),<br />

moguć je sljedeći tok izvođenja, koji će dati pogrešan rezultat – obje dretve dobile su istu sekvencu 10,<br />

umjesto 10 i 11. Problem je u tome što (Java) naredba value++ kod izvođenja nije atomarna, već se<br />

razlaže na (uobičajeno) tri interne naredbe: temp = value; temp = temp + 1; value = temp.<br />

Slika 4.1: Poziv metode getNext() u dretvama A i B dao je (pogrešno) istu sekvencu;<br />

Izvor: [10]<br />

Kao i kod sekvencijalnih programa, tako je i kod konkurentnih programa najvažnija osobina<br />

programa korektnost. Međutim, u konkurentnim programima se korektnost daleko teže postiže /<br />

provjerava. Prethodni program nije korektan, jer njegova točnost ovisi o međusobnom redoslijedu<br />

izvođenja naredbi dva (ili više) programa. Taj se problem uobičajeno naziva race conditions.<br />

Da bismo riješili taj problem, dretve (ili procese, ali u nastavku ćemo navoditi samo dretve, iako<br />

može biti oboje) moramo sinkronizirati [10]. Sinkronizacija se zasniva na ideji da dretve komuniciraju<br />

jedna sa drugom kako bi se "dogovorile" o sekvenci akcija. U prethodnom primjeru trebale bi se<br />

"dogovoriti" da u isto vrijeme samo jedna drži resurs (tj. da ima ekskluzivan pristup do njega). Dretve<br />

mogu komunicirati na dva načina:<br />

- korištenjem djeljive memorije (shared memory): dretve komuniciraju čitajući i pišući u zajednički<br />

dio memorije; ova tehnika je dominanta i bit će korištena u nastavku;<br />

- slanjem poruka (message-passing): dretve međusobno komuniciraju porukama.<br />

Nažalost, potreba za ekskluzivnim držanjem resursa može dovesti do različitih problema. Najveći<br />

problem je deadlock, kada dvije dretve (ili više njih) ostaju blokirane zato što obje trebaju (i) resurs koji je<br />

ekskluzivno zauzela druga dretva. Osim deadlocka, problem je i livelock, kada dretva naizgled radi, ali se<br />

ne dešava ništa korisno. Problem je i kada se resursi ne dodjeljuju dretvama na pravedan (fer) način, a<br />

najgora varijanta je kada neka dretva konstantno ostaje bez resursa - to je tzv. gladovanje (starvation).<br />

Međusobno isključivanje (mutual exclusion) je oblik sinkronizacije koji onemogućava istovremeno<br />

korištenje djeljivog resursa. S tim je povezan pojam kritične sekcije (critical section), što je naziv za dio<br />

programa koji pristupa djeljivom resursu. Pseudokod koji prikazuje osnovnu logiku rada sa kritičnom<br />

sekcijom je sljedeći:<br />

while true loop<br />

entry protocol<br />

critical section<br />

exit protocol<br />

non-critical section<br />

end<br />

Sinkronizacijski mehanizmi temeljeni na ideji protokola ulaz / izlaz (iz kritične sekcije) nazivaju se<br />

lokoti (locks).<br />

40


Lokoti se mogu realizirati na različite načine. Dobro su poznata [8] dva algoritma za implementaciju<br />

lokota - Petersonov algoritam za dvije dretve, te Lamportov Bakery (= pekara) algoritam za n dretvi:<br />

class Peterson implements Lock {<br />

// thread-local index, 0 or 1<br />

private volatile boolean[] flag = new boolean[2];<br />

private volatile int victim;<br />

}<br />

public void lock() {<br />

int i = ThreadID.get();<br />

int j = 1 - i;<br />

flag[i] = true; // I’m interested<br />

victim = i; // you go first<br />

while (flag[j] && victim == i) {}; // wait<br />

}<br />

public void unlock() {<br />

int i = ThreadID.get();<br />

flag[i] = false; // I’m not interested<br />

}<br />

class Bakery implements Lock {<br />

boolean[] flag;<br />

Label[] label;<br />

}<br />

public Bakery (int n) {<br />

flag = new boolean[n];<br />

label = new Label[n];<br />

for (int i = 0; i < n; i++) {<br />

flag[i] = false; label[i] = 0;<br />

}<br />

}<br />

public void lock() {<br />

int i = ThreadID.get();<br />

flag[i] = true;<br />

label[i] = max(label[0], ...,label[n-1]) + 1;<br />

while ((?k != i)(flag[k] && (label[k],k)


Kako se navodi u [8], lokote bi trebalo implementirati sa sljedećim atomarnim osnovnim operacijama<br />

(atomic primitives) za sinkronizaciju, koje su kompleksnije od operacija atomarnog čitanja-pisanja<br />

(pseudokod je pisan u Eiffelu):<br />

test-and-set (x, value)<br />

do<br />

temp := x<br />

x := value<br />

result := temp<br />

end<br />

compare-and-swap (x, old, new)<br />

do<br />

if x = old then<br />

x := new; result := true<br />

else<br />

result := false<br />

end<br />

end<br />

Treba napomenuti da su navedene operacije u praksi realizirane na razini procesora, tako da je<br />

navedeni pseudokod samo prikaz logike tih operacija. Operacija test-and-set (TAS) bila je osnovna<br />

operacija za sinkronizaciju u mikroprocesorima 1990-tih godina, dok praktički svaki mikroprocesor<br />

dizajniran poslije 2000. godine podržava jaču operaciju compare-and-swap (CAS), ili njoj ekivalentnu. No,<br />

CAS (i CASD, Compare-and-Swap-Double) nisu novost – bile su dio IBM 370 arhitekture od 1970!<br />

Jedan od najpoznatijih današnjih algoritama za implementaciju lokota je MCSLock. Njegove varijante<br />

osnova su za sinkronizaciju koju koriste današnji JVM-ovi (Java Virtual Machines). U nastavku su<br />

prikazane metode lock() i unlock() MCSLock algoritma. Vidi se (označeno crveno) da obje metode koriste<br />

radno čekanje (ali to je local spinning), te da lock() koristi operaciju getAndSet, a unlock() operaciju<br />

compareAndSet (što je uobičajeni Java naziv za hardversku operaciju compare-and-swap):<br />

public class MCSLock implements Lock {<br />

...<br />

public void lock() {<br />

QNode qnode = myNode.get();<br />

QNode pred = tail.getAndSet(qnode);<br />

if (pred != null) {<br />

qnode.locked = true;<br />

pred.next = qnode;<br />

// wait until predecessor gives up the lock<br />

while (qnode.locked) {}<br />

}<br />

}<br />

}<br />

public void unlock() {<br />

QNode qnode = myNode.get();<br />

if (qnode.next == null) {<br />

if (tail.compareAndSet(qnode, null))<br />

return;<br />

// wait until predecessor fills in its next field<br />

while (qnode.next == null) {}<br />

}<br />

qnode.next.locked = false;<br />

qnode.next = null;<br />

}<br />

Zanimljiv je pojam konsenzus objekt (consensus object), uveden u [8]. Ne ulazeći u detalje, tj.<br />

matematičke definicije i dokaze navedene u [8], mogu se navesti neki zanimljivi rezultati. Konsenzus<br />

objekt je objekt čija klasa ima samo metodu decide(). Cilj je napraviti rješenja bez čekanja (wait-free<br />

solutions) za tzv. problem konsenzusa (consensus problem), kod kojeg se grupa procesa pokušava<br />

usaglasiti oko zajedničke vrijednosti. Broj konsenzusa (consensus number) je maksimalni broj procesa za<br />

koje određena primitivna operacija (konsenzus objekt) može implementirati problem konsenzusa.<br />

42


Zanimljivi su sljedeći rezultati (teoremi) iz [8]:<br />

- atomarni registri imaju broj konsenzusa 1;<br />

- FIFO redovi (queues) imaju broj konsenzusa 2; korolar je da je nemoguće napraviti<br />

implementaciju bez čekanja za redove, stogove (stacks), skupove (sets) ili liste samo od<br />

skupova atomarnih registara;<br />

- tzv. Common2 RMW (Read–Modify–Write) operacije, koje su standardno realizirane u<br />

procesorima, imaju broj konsenzusa 2; to su npr. operacije getAndSet(v), getAndIncrement(),<br />

getAndAdd(k) i slične;<br />

- registri koji koriste compareAndSet() i get() operacije imaju beskonačni broj konsenzusa.<br />

Kako se navodi u [8], strojevi (računala) koja imaju operacije kao što je compareAndSet() znače na<br />

području asinkronog računanja (asynchronous computation) ono što Turingovi strojevi znače na području<br />

sekvencijalnog računanja (sequential computation): svaki konkurentni objekt koji se može potencijalno<br />

implementirati, može se implementirati na način bez čekanja (wait-free manner) na takvim strojevima. Po<br />

riječima Mauricea Sendaka: "compareAndSet() is the king of all wild things".<br />

Osim navedenih nižih osnovnih operacija (primitives) za sinkronizaciju, postoje i više osnovne<br />

operacije, kao što su semafori i monitori. Semafore je izumio E.W. Dijkstra 1965. godine. Oni su vrlo<br />

važna viša osnovna operacija za sinkronizaciju, ali ne baš dovoljno visoka [13]. Opći semafor je objekt<br />

koji se sastoji od varijable count i dvije operacije wait i signal. Ako dretva (ili proces) zove wait dok je<br />

count > 0, tada se count smanjuje za 1, a inače dretva čeka da count postane pozitivan. Ako dretva zove<br />

signal, count se povećava za 1. Testiranje varijable count, te njeno dekrementiranje i inkrementiranje,<br />

mora biti izvedeno atomarnim operacijama niže razine (kao što su one prije navedene). Postoje i binarni<br />

semafori, koji mogu imati vrijednost 0 ili 1. Semafori nisu baš pogodni za konkurentno programiranje, jer<br />

pružaju preveliku fleksibilnost: teško je odrediti da li je korištenje semafora u nekom dijelu programa<br />

izvršeno korektno, pa često treba pregledati cijeli program; operacije wait i signal se često mogu greškom<br />

izostaviti, ili staviti na pogrešno mjesto; lako je uvesti deadlock u program.<br />

Zbog toga su Per Brinch-Hansen i Tony Hoare 1973./1974. godine izumili monitore. Treba<br />

napomenuti da se monitori često implementiraju na temelju semafora (iako mogu i na drugim temeljima),<br />

ali može se i obrnuto - implementirati semafore na temelju monitora [13], što je važno za teoretska<br />

razmatranja, ali u praksi nije iskoristivo. Monitori se temelje na objektno-orijentiranim principima (iako<br />

njegovi izumitelji u to vrijeme nisu tako zvali; napomena: prvi OOPL Simula 67 napravljen je još 1967.). U<br />

terminima objektno orijentirane paradigme može se reći da:<br />

- klasa monitor (monitor class) ima atribute koji su isključivo privatni, a njene metode (funkcije i<br />

procedure) se izvode sa međusobnim isključivanjem (mutual exclusion);<br />

- monitor je objekt (instanca) klase monitor.<br />

Intuitivno, atributi klase monitor odgovaraju djeljivim varijablama (shared variables), tj. dretve im<br />

mogu pristupati samo preko monitor metoda. Tijela rutina odgovaraju kritičnim sekcijama, jer u isto<br />

vrijeme može biti aktivna najviše jedna metoda monitora.<br />

Prednosti monitora [13] jesu:<br />

- strukturni pristup: programer ne mora pamtiti da iza operacije wait mora staviti signal i sl.;<br />

- raspodjela odgovornosti (separation of concerns): međusobno isključivanje se dobije automatski,<br />

a za sinkronizaciju na temelju uvjeta (condition synchronization) se koriste varijable uvjeta<br />

(condition variables).<br />

Nedostaci monitora [13] jesu:<br />

- performanse: lakši su za programiranje, ali ponekad sporiji od semafora;<br />

- pravila signalizacije (signaling disciplines): mogući su izvor konfuzije; jedno od dva pravila za<br />

signalizaciju, tzv. Signal and Continue, može biti problematično kod korištenja, kad se<br />

sinkronizacijski uvjet promijeni prije nego čekajuća dretva uđe u monitor (upravo to pravilo koristi<br />

Java; drugo pravilo je Signal and Wait);<br />

- ugnježđeni pozivi monitora (nested monitor calls): ako metoda r1 monitora M1 poziva r2 od M2, a<br />

r2 sadrži operaciju wait, da li se međusobno isključivanje treba odnosti na M1 i M2, ili samo M2?<br />

43


Kako se navodi u [10], zaključavanje, bez obzira na varijantu, ima i mana. Npr. moderni JVM-ovi<br />

mogu optimizirati baratanje lokotima, ali kada više dretvi istovremeno traže isti lokot, JVM najčešće treba<br />

"pomoć" operacijskog sustava, pri čemu dretve najčešće bivaju suspendirane (dok se lokot ne otključa).<br />

Zapravo, "pametni" JVM-ovi mogu koristiti statističke podatke (profiling data) za odluku da li je bolje<br />

suspendirati dretvu, ili koristiti spin zaključavanje (spin locking).<br />

Zaključavanje ima i druge mane. Ako je dretva koja drži lokot odgođena na duže vrijeme, nijedna<br />

dretva koja treba taj lokot ne može napredovati. Taj problem se uvećava kada lokot čeka dretva višeg<br />

prioriteta od one koja drži lokot – to se naziva inverzija prioriteta (priority inversion). Ako je dretva koja<br />

drži lokot permanentno blokirana (npr. zbog beskonačne petlje, deadlocka, livelocka i dr.), nijedna dretva<br />

koja čeka taj lokot neće moći napredovati. No, najveću manu zaključavanja autori u [8] vide u tome što<br />

"nitko stvarno ne zna kako organizirati i održavati veliki sustav temeljen na zaključavanju".<br />

Srećom, danas postoji već spomenuta CAS operacija za sinkronizaciju (ili njoj ekvivalentne), koja je<br />

po svojoj osnovi optimistička, tj. nije blokirajuća (za razliku od lokota koji su, iako se danas grade na<br />

temelju CAS operacije, pesimistički, tj. blokirajući). Sljedeći primjer koda [10] prikazuje brojač koji je<br />

realiziran pomoću CAS operacije na neblokirajući (nonblocking) način - nema lokota:<br />

@ThreadSafe<br />

public class CasCounter {<br />

private SimulatedCAS value;<br />

}<br />

public int getValue() {<br />

return value.get();<br />

}<br />

public int increment() {<br />

int v;<br />

do {<br />

v = value.get();<br />

} while (v != value.compareAndSwap(v, v + 1));<br />

return v + 1;<br />

}<br />

Kako je već rečeno, CAS operacija je vrlo važna za sadašnjost i budućnost konkurentnog<br />

programiranja. Trošak korištenja CAS operacije kod današnjih procesora varira, od oko 10 do oko 150<br />

procesorskih ciklusa, pri čemu se stalno radi na ubrzavanju. Korištenje CAS-a je jako doprinijelo<br />

implementaciji neblokirajućih (bez lokota) konkurentnih algoritama i struktura podataka. Npr. U Javi 5, a<br />

naročito 6, implementirani su (pomoću CAS operacije) algoritmi i strukture podataka koji se u<br />

konkurentnom radu ponašaju dramatično brže od onih iz Java verzije 4 i ranijih verzija.<br />

U [8] autori navode i mane CAS operacije: algoritme koji koriste CAS (ili ekvivalentne operacije) vrlo<br />

je teško smisliti i često su vrlo neintuitivni. Zapravo, osnovna teškoća sa svim današnjim sinkronizacijskim<br />

operacijama (pa i CAS) je da one rade na samo jednoj riječi memorije, što tjera na korištenje kompleksnih<br />

i neprirodnih algoritama. Zapravo, postoji operacija CASD (Compare-and-Swap-Double), ali ona ažurira<br />

dvije susjedne riječi, a još nije realizirana operacija DCAS koja bi ažurirale dvije memorijske riječi na<br />

nezavisnim lokacijama. Pogotovo nije realizirana nekakva operacija multiCompareAndSet(). No, čak i da<br />

postoji, niti ona ne bi u potpunosti riješila problem sinkronizacije.<br />

Problem sa svim dosadašnjim sinkronizacijskim mehanizmima i operacijama (i onima koje postoje i<br />

navedenim nepostojećim operacijama), bez obzira da li rade ili ne rade zaključavanje, je da se ne mogu<br />

lagano komponirati, što ima veliki negativan utjecaj na modularnost konkurentnih programa. Zato je<br />

izmišljena transakcijska memorija (TM), a njena realizacija može biti softverska (STM), hardverska (HTM)<br />

ili hibridna. Transakcija [8] je sekvenca koraka koje izvršava jedna dretva. Transakcije moraju biti<br />

serijabilne (serializable), što znači da mora izgledati kao da se izvršavaju sekvencijalno (jedna iza druge) i<br />

onda kada se izvršavaju paralelno. Serijabilnost je na neki način teža varijanta linearizabilnosti<br />

(linearizability). Linearizabilnost definira atomarnost individualnog objekta. Serijabilnost definira<br />

atomarnost cijele transakcije, tj. bloka programskog koda koji može uključivati poziv metoda različitih<br />

objekata. Ispravno implementirane, transakcije nemaju problem deadlocka ili livelocka.<br />

Postoje različite softverske implementacije transakcijske memorije. Jednu implementaciju za Javu<br />

daju autori u [8] (inače, jedan autor je prvi dao ideju hardverske transakcijske memorije, a drugi autor je<br />

(su)inventor softverske transakcijske memorije). Npr. programski jezik Clojure podržava STM na razini<br />

jezika. Java za sada ne podržava STM niti na razini jezika, niti na razini biblioteka.<br />

44


U [8] je dat prikaz i hardverske transakcijske memorije (HTM). Prikazano je kako se standardna<br />

hardverska arhitektura može prilagoditi za podršku kratkotrajnih i malih (po veličini) transakcija.<br />

Napomenimo da danas postoje barem dva mikroprocesora koja podržavaju HTM - već spomenuti Vega<br />

procesor firme Azul Systems, a nedavno (kolovoz 2011.) mu se pridružio i BlueGene/Q firme IBM.<br />

Otkazan je razvoj procesora Oracle (prije Sun) Rock, koji je isto trebao podržavati HTM. Temeljna ideja<br />

za podršku HTM-a je u tome da današnji mikroprocesori podržavaju protokole usklađivanja priručne<br />

memorije (cache-coherence protocols), pa time već podržavaju većinu toga što je potrebno za realizaciju<br />

HTM-a. Oni već detektiraju i rješavaju sinkronizacijske konflikte između dretvi pisaca (writers), i između<br />

dretvi čitatelja (readers) i dretvi pisaca, te stavljaju u međuspremnik (buffer) neke probne izmjene<br />

(umjesto da ih direktno upisuju u glavnu memoriju). Treba dodati u hardver samo još neke detalje.<br />

Svaki procesor ima svoju priručnu memoriju. Priručna memorija sastoji se od grupa memorijskih<br />

riječi. Grupa se naziva linija (line) i ima oznaku (tag), koja pokazuje stanje linije. Koristi se tzv. MESI<br />

protokol, u kojem je svaka linija u jednom od sljedeća četiri stanja (MESI = početna slova tih stanja):<br />

- Modified: linija je modificirana i eventualno treba biti upisana natrag u (glavnu) memoriju;<br />

nijedan drugi procesor nema tu liniju u svom međuspremniku;<br />

- Exclusive: linija nije modificirana, i nijedan drugi procesor ju nema u međuspremniku;<br />

- Shared: linija nije modificirana, ali drugi procesori ju mogu imati u međuspremniku;<br />

- Invalid: linija ne sadrži suvisle podatke.<br />

MESI protokol detektira sinkronizacijske konflikte između individualnih čitanja i pisanja, te osigurava<br />

da se procesori usklade oko stanja (djeljive) memorije. Kada procesor čita ili piše u memoriju, emitira<br />

(broadcasts) zahtjev na sabirnicu (bus), a ostali procesori to slušaju (ponekad se to zove snooping).<br />

Pojednostavljeno se dešava sljedeće:<br />

- kada procesor daje zahtjev za učitavanje linije u ekskluzivnom modu, ostali procesori invalidiraju<br />

svoju kopiju; svaki procesor sa modificiranom kopijom mora upisati svoju kopiju u memoriju, prije<br />

nego se nastavi učitavanje;<br />

- kada procesor daje zahtjev za učitavanje linije u djeljivom modu, svi procesori koji imaju<br />

ekskluzivnu kopiju moraju joj promijeniti stanje u Shared; ostatak je kao prije;<br />

- ako priručna memorija postane puna, mora se izbaciti neka linija; ako je ta linija Shared ili<br />

Exclusive, jednostavno se zanemari; ako je Modified, mora se upisati u memoriju.<br />

Slika 4.2 prikazuje jedan slijed događaja. Prvo je (a) procesor A učitao (neku) liniju u ekskluzivnom<br />

modu. Onda je (b) procesor B isto učitao tu liniju, pa je ona sada u djeljivom modu. Zatim je (c) procesor<br />

B mijenjao tu liniju, pa je kod njega ona u statusu Modified, a kod procesora A je u statusu Invalid. Na<br />

kraju je (d) procesor B upisao tu liniju u memoriju, procesor A je osvježio svoju liniju, i oba procesora opet<br />

imaju status linije Shared:<br />

Slika 4.2: MESI protokol; Izvor: [8]<br />

Kako navode autori u [8], za podršku HTM-a treba zadržati MESI protokol kakav jeste, samo treba<br />

dodati jedan transakcijski bit za svaku oznaku linije priručne memorije (cache line’s tag). Uobičajeno je taj<br />

bit postavljen na 0. Kada se u priručnoj memoriji mijenja vrijednost kao posljedica transakcije, bit se<br />

postavlja na 1. Treba samo osigurati da se modificirane transakcijske linije ne upisuju natrag u memoriju i<br />

da invalidacija linije abortira transakciju. Mana ove sheme je zajednička mana skoro svih HTM shema.<br />

Prvo, veličina transakcije ograničena je veličinom priručne memorije (zato npr. IBM BlueGene/Q<br />

mikroprocesor ima čak 32 MB L2 memorije, koja se koristi za transakcije). Drugo, većina operacijskih<br />

sustava briše priručnu memoriju kada se dretva pasivizira, tako da trajanje transakcije može biti limitirano<br />

dužinom "vremenskog kvanta" operacijskog sustava. Po tome bi slijedilo da je HTM najbolji za<br />

kratkotrajne i male transakcije, a ostale transakcije trebale bi koristiti STM, ili kombinaciju HTM-a i STM-a.<br />

45


5. KONKURENTNO PROGRAMIRANJE U JAVI VERZIJE 1 - 4<br />

Kako navode autori u [10], iako mi sami možda nećemo kreirati dretve u našim Java programima,<br />

ipak ne možemo izbjeći višedretveni rad. Naime, svaka Java aplikacija koristi dretve. Kada se starta JVM,<br />

on kreira posebne dretve, npr. za GC (garbage collection), uz main dretvu. Kada koristimo Java AWT ili<br />

Swing framework, oni kreiraju posebnu dretvu za upravljanje korisničkim sučeljem. Kada koristimo<br />

servlete ili RMI, oni kreiraju pričuvu (pool) dretvi. Zato, kada koristimo te frameworke, moramo do neke<br />

mjere biti upoznati sa konkurentnošću u Javi. Naime, svaki takav framework uvodi u našu aplikaciju<br />

konkurentnost na implicitan način, te moramo znati napraviti da mješavina našeg koda i frameworkovog<br />

koda bude sigurna u višedretvenom radu.<br />

Svaki Java program ima barem jednu dretvu, onu koja izvršava metodu main(). Kada želimo<br />

napraviti svoju dretvu, imamo u Javi dva načina; jedan način je da napravimo klasu koja nasljeđuje klasu<br />

Thread i da nadjačamo (override) metodu run(), kao što prikazuje sljedeći primjer [14], u kojem se kreiraju<br />

dvije klase, Worker1 i Worker2:<br />

class Worker1 extends Thread {<br />

public void run() {<br />

// implement doTask1() here<br />

}<br />

}<br />

class Worker2 extends Thread {<br />

public void run() {<br />

// implement doTask2() here<br />

}<br />

}<br />

Da bi se kreirale dretva, potrebno je kreirati objekt (instancu) klase (u ovom slučaju klase Worker1<br />

i/ili Worker2) i pozvati metodu start() nad tim objektom. Time će se automatski kreirati dretva i pozvati<br />

metoda run() u njoj. U nastavku se prikazuje implementacija metode compute() (iz neke treće klase čiji<br />

ostali detalji nisu prikazani), koja kreira dvije dretve, tako da dva posla (tasks) mogu biti izvedena<br />

paralelno (ako postoje dva slobodna procesora koja ih izvode):<br />

void compute() {<br />

Worker1 worker1 = new Thread();<br />

Worker2 worker2 = new Thread();<br />

worker1.start();<br />

worker2.start();<br />

}<br />

Sada klase Worker1 i Worker2 proširimo sa sljedećim atributom i metodom:<br />

private int result;<br />

public void getResult() {<br />

return result;<br />

}<br />

Pretpostavimo da dretve snimaju rezultat izračuna u tu varijablu, a metodom getResult() ih možemo<br />

čitati. Sada želimo dobiti rezultat oba izračuna u metodi compute():<br />

return worker1.getResult() + worker2.getResult();<br />

Očito, moramo čekati da obje dretve završe prije nego dobijemo taj rezultat. To se postiže naredbom<br />

join() koja, kad se poziva nad dretvom-izvršiteljem, uzrokuje da dretva-pozivatelj čeka dok dretvaposlužitelj<br />

ne završi. U ovom slučaju programski kod dretve-pozivatelja izgleda ovako:<br />

int compute() {<br />

worker1.start();<br />

worker2.start();<br />

worker1.join();<br />

worker2.join();<br />

return worker1.getResult() + worker2.getResult();<br />

}<br />

Naravno, u ovom slučaju nije važno da li prvo pozivamo join() nad worker1 ili worker2.<br />

46


Kako je prije navedeno, postoji i drugi način za kreiranje dretvi u Javi. Prethodno prikazani način<br />

(kreiranje klase koja nasljeđuje klasu Thread), iako izgleda logičan, manje se koristi jer je manje<br />

fleksibilan. Problem je u tome što u Javi (za sada) postoji samo jednostruko nasljeđivanje ponašanja, tj.<br />

klasa (a ne samo sučelja). A, "Višestruko nasljeđivanje klasa je korisno, koliko god mi šutjeli o tome :)"<br />

(odnosno - koliko god nas pokušavali uvjeriti u suprotno; uzgred, izgleda da se neki oblik višestrukog<br />

nasljeđivanja ponašanja priprema u Javi 8). Bez višestrukog nasljeđivanja klasa, ako naša klasa "potroši"<br />

jednostruko nasljeđivanje za klasu Thread, ne može naslijediti od neke druge klase. Zbog toga se češće<br />

koristi drugi način kreiranja dretve. Prvo se napiše "pomoćna" klasa koja nasljeđuje sučelje (interface)<br />

Runnable, pri čemu mora implementirati metodu run(). Primjer [13]:<br />

public class RunThread implements Runnable {<br />

String id;<br />

public RunThread(String id) {<br />

this.id = id;<br />

}<br />

public void run() {<br />

// do something when executed<br />

System.out.println("This is thread " + id);<br />

}<br />

}<br />

Onda se objekt te "pomoćne" klase šalje konstruktoru koji kreira objekt klase Thread (tj. dretvu) u<br />

kodu naše "glavne" klase:<br />

Thread mt = new Thread(new RunThread("mt"));<br />

mt.start(); ...<br />

Do sada prikazani rad sa dretvama u Javi izgleda prilično jednostavno. No, problemi nastaju kada se<br />

dvije dretve (ili više njih) upliću jedna drugoj u posao, npr. tako da modificiraju isti objekt. To može stvoriti<br />

netočne rezultate i naziva se race condition, npr. u ovom slučaju [14]:<br />

class Counter {<br />

private volatile int value = 0;<br />

public int getValue() {<br />

return value;<br />

}<br />

public void setValue(int someValue) {<br />

value = someValue;<br />

}<br />

public void increment() {<br />

value++; -- napomena: niti sama naredba value++ nije atomarna<br />

}<br />

}<br />

Pretpostavimo da neka metoda u nekoj drugoj klasi kreira objekt klase Counter i sadrži sljedeći kod:<br />

x.setValue(0);<br />

x.increment();<br />

int i = x.getValue();<br />

Pitanje je: koju vrijednost ima varijabla i na kraju ovih naredbi? Ako je riječ o jednodretvenom<br />

programu, onda je vrijednost 1. No u konkurentnom radu brojač može biti modificiran od drugih dretvi,<br />

tako da rezultat ovisi o ispreplitanju naredbi ove dretve sa naredbama neke druge dretve. Npr. ako druga<br />

dretva konkurentno izvodi naredbu<br />

x.setValue(2);<br />

varijabla i na kraju navedenih naredbi prve dretve može imati vrijednost 1, 2 ili 3, tj. rezultat ovisi o<br />

slučajnom redoslijedu izvođenja naredbi dvije dretve (zapravo, dodatni problem je i u tome što sama<br />

naredba value++ nije atomarna, već se u stvarnosti razlaže na tri interne naredbe: temp = value; temp =<br />

temp + 1; value = temp). Naravno, to nije ono što se želi. Taj se problem rješava pomoću sinkronizacije<br />

koja se zove međusobno isključivanje (mutual exclusion), za što Java ima jednostavno rješenje još od<br />

verzije Java 1. Svaki objekt u Javi ima lokot (lock; nasljeđuje se automatski od superklase Object), kojega<br />

istovremeno može držati (zaključati) samo jedna dretva.<br />

47


Objekt koji će služiti kao lokot može se kreirati npr. ovako:<br />

Object lock = new Object();<br />

Dretva koja će tražiti lokot (tj. zaključati lokot) to radi pomoću naredbe synchronized, koja označava<br />

početak tzv. synchronized bloka (inače synchronized i volatile su jedine Java ključne riječi vezane za<br />

konkurentnost; ostalo su metode klase Object ili metode klasa specijaliziranih za konkurentnost):<br />

synchronized(lock) {<br />

// critical section<br />

}<br />

Kada dretva dođe do početka tog bloka, pokuša zaključati lokot objekta koji je naveden kao<br />

argument naredbe synchronized. Ako je lokot zaključan od neke druge dretve, polazna dretva čeka dok<br />

on ne postane otključan. Nakon toga ga polazna dretva drži zaključanim sve do kraja tog bloka. Problem<br />

iz prethodnog primjera mogli bismo riješiti pomoću synchronized npr. ovako (u prvoj, odnosno drugoj<br />

dretvi; naravno, moramo biti sigurni da je varijable lock u oba koda referenciraju isti objekt):<br />

// prva dretva<br />

synchronized(lock) {<br />

x.setValue(0);<br />

x.increment();<br />

int i = x.getValue();<br />

}<br />

// druga dretva<br />

synchronized(lock) {<br />

x.setValue(2);<br />

}<br />

Osim bloka, i cijela metoda (funkcija / procedura) može imati synchronized na početku:<br />

synchronized type method(args) {<br />

// body<br />

}<br />

što je, zapravo, isto kao i ovo:<br />

type method(args) {<br />

synchronized(this) {<br />

// body<br />

}<br />

}<br />

Prethodno je slično konceptu monitora, koji je prikazan u 4. točki, ali dizajneri Jave su napravili<br />

određena odstupanja od tog koncepta. Svaki objekt u Javi ima unutarnji (intrinsic) lokot i unutarnju<br />

kondiciju (condition). Ako je metoda deklarirana pomoću ključne riječi synchronized, ona djeluje kao<br />

monitor. Kondicijskim varijablama se pristupa pomoću naredbi wait / notifyAll / notify, što će biti prikazano<br />

u nastavku. Međutim, Java objekt se razlikuje od monitora [9] u tri važne stvari, kompromitirajući time<br />

sigurnost dretve (thread safety) :<br />

- atributi ne moraju biti privatni;<br />

- metode ne moraju biti sinkronizirane;<br />

- unutarnji lokot je pristupačan klijentima.<br />

Zbog toga je jedan od inventora monitora, Per Brinch Hansen, 1999. godine izjavio: "Zaprepašćuje<br />

me da je ovaj nesigurni Java paralelizam shvaćen tako ozbiljno od programske zajednice, četvrt stoljeća<br />

nakon invencije monitora i programskog jezika Concurrent Pascal." [Java’s Insecure Parallelism, ACM<br />

SIGPLAN Notices 34:38–45, April 1999.]<br />

Kao što vrijedi za monitor, tako vrijedi i za Java klase - zaštita pristupa djeljivim varijablama nije<br />

jedini razlog zašto dretve moraju biti međusobno sinkronizirane. Često puta treba odgoditi izvođenje<br />

metode (ili dijela metode) u nekoj dretvi, dok se ne zadovolji određeni uvjet (a taj uvjet nije samo<br />

otključavanje određenog lokota). To se zove sinkronizacija na temelju uvjeta (condition synchronization),<br />

koja se u Javi implementira pomoću naredbi wait / notifyAll / notify, koje se pozivaju nad sinkroniziranim<br />

objektima.<br />

48


Jedan primjer problema koji traži sinkronizaciju na temelju uvjeta je tzv. problem proizvođač-potrošač<br />

(producer-consumer problem), koji je,u različitim varijantama, čest u praksi. Može se apstraktno opisati<br />

na ovaj način [14]:<br />

- Proizvođač: u svakoj iteraciji (beskonačne) petlje, proizvodi podatke koje potrošač konzumira;<br />

- Potrošač: u svakoj iteraciji (beskonačne) petlje, troši podatke koje je proizveo proizvođač.<br />

Proizvođači i potrošači komuniciraju preko djeljivog međuspremnika (buffer) koji implementira red<br />

(queue), za koji smatramo (u ovom primjeru) da je neograničen, pa će nam biti važno samo da li je<br />

prazan. U primjeru [14] se prikazuje samo dio klase, a ne kompletan programski kod. Prvo pretpostavimo<br />

da imamo klasu Buffer (koja implementira neograničeni red) i da imamo jedan objekt te klase:<br />

Buffer buffer = new Buffer();<br />

Proizvođači dodaju podatke na kraj reda, koristeći metodu (reda) void put(int item), a potrošači<br />

skidaju podatak sa reda koristeći metodu int get(). Broj podataka koji se nalaze u redu može se dobiti<br />

pomoću metode int size(). Pretpostavimo sada da u klasi Consumer imamo sljedeću metodu:<br />

public void consume() {<br />

int value;<br />

synchronized(buffer) {<br />

value = buffer.get(); // incorrect: buffer could be empty<br />

}<br />

}<br />

Metoda nije dobra, jer ne provjerava da li je red (tj. međuspremnik) prazan, što može prouzročiti<br />

grešku kod izvođenja (runtime error). Dretva treba čekati dok red bude neprazan i tek tada pročitati<br />

podatak iz njega. Čekanje se u Javi može napraviti pomoću metode wait(), koja se može pozvati samo<br />

nad objektom koji je prethodno zaključan, tj. samo unutar synchronized bloka. Wait() tada blokira tekuću<br />

dretvu i otpušta lokot koji je dretva držala. Slijedi primjer [14]:<br />

public void consume() throws InterruptedException {<br />

int value;<br />

synchronized(buffer) {<br />

while (buffer.size() == 0) {<br />

buffer.wait();<br />

}<br />

value = buffer.get();<br />

}<br />

}<br />

Sada lokot može preuzeti (zaključati) neka druga dretva, koja može mijenjati stanje navedene<br />

kondicije. Da obavijesti prvu dretvu o promjeni kondicije, druga dretva poziva notify(), što odblokira prvu<br />

dretvu, koja čeka na taj lokot, ali druga dretva ne otključa lokot odmah, već tek na kraju svog<br />

synchronized bloka (unutar kojega je i pozvala notify()). U 4. točki smo naveli da kod monitora dva<br />

osnovna tzv. pravila signalizacije (signaling disciplines) mogu biti Signal and Wait ili Signal and Continue<br />

(Java koristi samo ovo drugo). Primjer u kojem proizvođač obavještava potrošača o promjeni kondicije;<br />

public void produce() {<br />

int value = random.produceValue();<br />

synchronized(buffer) {<br />

buffer.put(value);<br />

buffer.notify();<br />

}<br />

}<br />

Proizvođač je proizveo neki slučajni broj, zaključao red, spremio podatak u njega i pozvao notify(),<br />

čime je odblokirao jednu (bilo koju!) dretvu koja je čekala na taj lokot. Na kraju synchronized bloka (što je<br />

u ovom slučaju bilo odmah iza) je i otključao taj lokot. No, odblokirana dretva ne može biti sigurna da je<br />

taj uvjet valjan i kada ona dođe na red, jer je u međuvremenu neka treća dretva mogla potrošiti podatak i<br />

red je možda opet prazan. Stoga je dretva potrošač morala ispitivati uvjet u while petlji. Važno je i to da<br />

notify() uvijek odblokira samo jednu (bilo koju!) dretvu koja čeka na određeni lokot. Stoga je u praksi puno<br />

sigurnije pozivati notifyAll(), koja odblokira sve dretve koje čekaju na određeni lokot.<br />

49


Metode wait(), notify() / notifyAll() rade interno sa tzv. unutarnjim redovima kondicija (intrinsic<br />

condition queues). Vidjet ćemo da u Javi 5 postoji njihova generalizacija, koja omogućava da programeri<br />

eksplicitno rade sa kondicijama.<br />

Na slici 5.1 prikazan je dijagram promjene stanja Java dretvi. Vidi se (i) da dretva prelazi iz stanja<br />

Ready (češće se to stanje naziva Runnable) u stanje Waiting nakon što pozove wait(), a obrnuti prijelaz<br />

se zbiva kada druga dretva (što se iz slike ne vidi) pozove notify() / notifyAll():<br />

Slika 5.1: Dijagram promjene stanja Java dretvi; Izvor: [13]<br />

Preciznije se zbivanje može pratiti kroz sljedeće dvije slike. Na slici 5.2 prikazana su tri koraka kod<br />

prijelaza dretve iz stanja Running (u kojem se dretva izvršava u procesoru) u stanje Waiting. Prvo dretva<br />

poziva metodu wait() (1), naravno, uvijek unutar synchronized bloka, čime otključa lokot i prelazi u stanje<br />

Waiting (2). Sada neka dretva koja je Ready može preći u stanje Running, jer se procesor oslobodio.<br />

Slika 5.2: Promjena stanja nakon wait() operacije; Izvor: [13]<br />

Slika 5.3 prikazuje nastavak zbivanja - poziva se notify() ili notifyAll(). Nakon što neka druga dretva<br />

pozove notify() ili notifyAll() (1) (naravno, uvijek unutar synchronized bloka), jedna dretva (ako je notify())<br />

ili sve dretve (ako je notifyAll()) koje čekaju na lokot koji ima ta druga dretva, prelazi (2) iz stanja Waiting u<br />

Ready. Naravno, rekli smo da dretva koja poziva notify() / notifyAll() ne otključava lokot odmah, već tek<br />

kod izlaska iz synchronized bloka (to je signalizacijsko pravilo Signal and Continue). Mora se primijetiti da<br />

ova slika ne prikazuje metodu notify() u svim njenim detaljima.<br />

Slika 5.3: Promjena stanja nakon notify() operacije; Izvor: [13]<br />

50


Slika 5.4 prikazuje stanja Java dretvi na malo drugačiji način. Ovdje je stanje Waiting detaljnije<br />

razloženo u tri posebna stanja: Blocked, Waiting i Timed waiting (a Ready se naziva Runnable). No, niti<br />

ovdje zbivanja koja implicitno imaju naredbe notify() / notifyAll() nisu prikazana potpuno detaljno.<br />

Napomenimo da dretva prelazi u stanje Waiting ne samo nakon naredbe wait() (i join()), već i kod čekanja<br />

na objekte klase Lock ili Condition iz java.util.concurrent librarya, uvedenog u Java 5 verziji.<br />

Slika 5.4: Dijagram promjene stanja Java dretvi; Izvor: [9]<br />

Spomenimo da uz osnovnu varijantu metode wait() postoje i varijante wait(long millis) i wait(long<br />

millis, int nanos) koje uzrokuju da dretva čeka na obavijest od druge dretve ili na istek definiranog<br />

vremena. Java metode wait() / notify / notifyAll pripadaju klasi Object, od koje ih nasljeđuju sve druge<br />

klase. Inače, Java metode notify / notifyAll se u izvornoj terminologiji monitora zovu signal / signal_all.<br />

Na kraju, prikažimo kako može nastati deadlock, kada se dvije dretve (ili grupa dretvi) blokiraju<br />

zauvijek, jer jedna dretva čeka lokot koji ima druga, i obrnuto. Primjer iz [14]:<br />

public class C extends Thread {<br />

private Object a;<br />

private Object b;<br />

public C(Object x, Object y) {<br />

a = x;<br />

b = y;<br />

}<br />

public void run() {<br />

synchronized(a) {<br />

synchronized(b) {<br />

...<br />

}<br />

}<br />

}<br />

}<br />

Pretpostavimo sada da se izvodi sljedeći kod, gdje su a1 i b1 objekti tipa Object:<br />

C t1 = new C(a1, b1);<br />

C t2 = new C(b1, a1);<br />

t1.start();<br />

t2.start();<br />

Budući da su argumenti a1 i b1 međusobno permutirani kod kreiranja dretvi t1 i t2, može doći do<br />

takve sekvence poziva u kojem dretva t1 zaključa objekt a1, dretva t2 zaključa objekt b1, i onda su obje<br />

dretve blokirane. Za razliku od sustava za upravljanje bazom podataka (što smo vidjeli u 1. točki), Java<br />

sustav ovdje neće detektirati (i onda riješiti) deadlock. Zato programer mora paziti da do deadlocka ne<br />

dođe. U Javi 5 postoji mogućnost da se program lakše napiše na način da ne dođe do deadlocka.<br />

51


6. KONKURENTNO PROGRAMIRANJE U JAVI VERZIJE 5, 6, 7<br />

Konkurentnost u Javi od verzije 1 do verzije 4 praktički se nije mijenjala, osim što su se rješavali<br />

bugovi i sl. Suštinu "alata" za konkurentno programiranje činili su: klasa Object, tj. njen unutarnji (intrinsic)<br />

lokot (atribut te klase) i njene metode wait(...) / notify / notifyAll, Java ključne riječi synchronized i volatile,<br />

klasa Thread i sučelje Runnable.<br />

U Javi verzije 5, koja se pojavila 2004. godine, uvedeno je dosta novina na drugim područjima (npr.<br />

generičke klase, bolje kolekcije i dr.), ali i na području konkurentnog programiranja. JSR 166, koji se<br />

odnosi na konkurentnost, temeljen je uglavnom na paketu edu.oswego.cs.dl.util.concurrent, kojega je<br />

napravio Doug Lea. Kroz novi paket java.util.concurrent uvedene su sljedeće nove mogućnosti:<br />

- Executors (thread pools, scheduling);<br />

- Futures;<br />

- Concurrent Collections;<br />

- Locks (ReentrantLock, ReadWriteLock...);<br />

- Conditions;<br />

- Synchronizers (Semaphores, Barriers...);<br />

- Atomic variables;<br />

- System enhancements.<br />

U Java verziji 6, koja se pojavila godinu i pol nakon verzije 5, nije se pojavilo ništa revolucionarno, ali<br />

su se na području konkurentnog programiranja (kao i na drugim područjima) "iznutra" poboljšale<br />

biblioteke, bilo da su se riješili bugovi ili poboljšale performanse. U Java verziji 7, koja je izašla u ljeto ove<br />

godine (2011.) u području konkurentnog programiranja novost je Fork/Join Framework.<br />

U ovoj točki prikazat će se (ukratko) samo neke mogućnosti uvedene u Javi 5 (sa poboljšanjima u<br />

Javi 6), i to ReentrantLock, ReadWriteLock, Conditions i Atomic variables.<br />

Do Java 5 verzije, jedini mehanizmi za koordinaciju pristupa djeljivim podacima bili su synchronized<br />

(koji koristi unutarnji lokot) i volatile. Java 5 donijela je i ReentrantLock, što je (klasa za) eksplicitan lokot.<br />

Kako navode autori u [10], on nije zamjena za implicitan, unutarnji lokot, već alternativa koju je bolje<br />

koristiti u nekim (ali ne svim) slučajevima. Klasa ReentrantLock implementira sučelje Lock, koje ima ove<br />

metode:<br />

public interface Lock {<br />

void lock();<br />

void lockInterruptibly() throws InterruptedException;<br />

boolean tryLock();<br />

boolean tryLock(long timeout, TimeUnit unit)throws InterruptedException;<br />

void unlock();<br />

Condition newCondition();<br />

}<br />

Zaključavanja pomoću objekata klase ReentrantLock ima istu semantiku kao i synchronized, ali ima i<br />

dodatne mogućnosti. Najčešći oblik korištenja je sljedeći [10]:<br />

Lock lock = new ReentrantLock();<br />

...<br />

lock.lock();<br />

try {<br />

// update object state<br />

// catch exceptions and restore invariants if necessary<br />

} finally {<br />

lock.unlock();<br />

}<br />

Za razliku od implicitnog zaključavanja i otključavanja kod synchronized, ovdje se zaključavanje i<br />

otključavanje mora raditi eksplicitno, a vrlo je važno da se otključavanje stavi u finally blok, inače lokot<br />

može ostati stalno zaključan. Moglo bi se reći da je to korak nazad u odnosu na synchronized, jer je sad<br />

moguće (dodatno) pogriješiti. No, mogućnost da se zaključavanje i otključavanje lokota napravi u<br />

različitim dijelovima koda ponekad je nužna (iako je takav kod manje čitljiv), a sa synchronized se to nije<br />

moglo izvesti. Preporuča se korištenje dosadašnje synchronized varijante ako nam ne treba ova<br />

mogućnost ili dodatne mogućnosti klase ReentrantLock, koje su navedene u nastavku.<br />

52


ReentrantLock ima ove dodatne mogućnosti:<br />

- pomoću metode tryLock() moguće je vidjeti da li je lokot slobodan; ako jeste, zaključa se, a ako<br />

nije, metoda odmah vraća exception; ovo je slično kao SQL naredba SELECT ... FOR UPDATE<br />

NOWAIT;<br />

- pomoću metode tryLock(long timeout,TimeUnit unit) moguće je vidjeti da li je lokot slobodan; ako<br />

jeste, zaključa se, a ako nije, metoda vraća exception nakon isteka zadanog vremena; ovo je<br />

slično kao SQL naredba SELECT ... FOR UPDATE WAIT timeout;<br />

- pomoću metode lockInterruptibly() dretva može (pokušati) zaključati lokot na taj način da<br />

aktivnost koja se može prekinuti (cancellable activities) može prekinuti dretvu dok čeka na lokot;<br />

- metoda newCondition() omogućava definiranje kondicija (condition) uz lokot.<br />

Sljedeći primjer [10] prikazuje korištenje metode tryLock(long timeout,TimeUnit unit):<br />

public boolean trySendOnSharedLine<br />

(String message, long timeout, TimeUnit unit)throws InterruptedException<br />

{<br />

long nanosToLock = unit.toNanos(timeout)<br />

if (!lock.tryLock(nanosToLock, NANOSECONDS)) return false;<br />

try {<br />

return sendOnSharedLine(message);<br />

} finally {<br />

lock.unlock();<br />

}<br />

}<br />

Sljedeći primjer [10] prikazuje korištenje metode lockInterruptibly():<br />

public boolean sendOnSharedLine(String message)<br />

throws InterruptedException<br />

{<br />

lock.lockInterruptibly();<br />

try {<br />

return cancellableSendOnSharedLine(message);<br />

} finally {<br />

lock.unlock();<br />

}<br />

}<br />

Treba napomenuti da zapravo i metoda tryLock(long timeout,TimeUnit unit) ima mogućnost<br />

prekidanja, a ne samo mogućnost čekanja (određeno vrijeme) da se lokot otključa. Prikazane metode<br />

omogućavaju programiranje na način da se izbjegne deadlock.<br />

Slika 6.1 prikazuje kako je u Java 5 verziji ReentrantLock bio značajno bolje propusnosti (kod većeg<br />

broja dretvi) od synchronized varijante, ali je u verziji Java 6 to izjednačeno:<br />

Slika 6.1: Propusnosti ReentrantLock-a u odnosu na propusnost unutarnjeg lokota; Izvor: [10]<br />

53


Kod kreiranja ReentrantLock lokota mogu se definirati dvije varijante: fer i ne-fer lokot. Fer lokoti<br />

osiguravaju da dretve dobivaju lokote po redoslijedu prispijeća zahtjeva. Default su ne-fer lokoti, isto kao<br />

kod synchronized varijante. Ako nam nije nužno potreban fer lokot, bolje je koristiti ne-fer lokot, zbog<br />

puno veće propusnosti, što prikazuje slika 6.2:<br />

Slika 6.2: Propusnost fer i ne-fer ReentrantLock lokota; Izvor: [10]<br />

Osim dvije krivulje za fer i ne-fer lokote, vidi se i krivulja koja prikazuje korištenje<br />

ConcurrentHashMap kolekcije. Uglavnom je bolje koristiti konkurentne kolekcije, koje često koriste<br />

neblokirajuće algoritme (tj. sinkronizaciju bez lokota), nego vlastita rješenja.<br />

Osim ReentrantLock lokota, postoje i lokoti klase ReentrantReadWriteLock, koja implementira<br />

sučelje ReadWriteLock:<br />

public interface ReadWriteLock {<br />

Lock readLock();<br />

Lock writeLock();<br />

}<br />

Strategija zaključavanja koju implementiraju ovakvi lokoti je: istovremeno može raditi više čitatelja<br />

koji blokiraju pisce, ali može raditi samo jedan pisac, koji blokira čitatelje i (druge) pisce. Slika 6.3<br />

prikazuje propusnost koju ima ReentrantReadWriteLock u odnosu na ReentrantLock:<br />

Slika 6.3: Propusnost "običnih" i read-write reentrant lokota; Izvor: [10]<br />

U Java 5 verziji pojavili su se i objekti-kondicije (condition objects). Kao što su eksplicitni lokoti<br />

generalizacija unutarnjih lokota, tako su i objekti-kondicije generalizacija unutarnjih redova kondicija<br />

(intrinsic condition queues). Kondicija (condition) se povezuje sa Lock objektom na taj način da se pozove<br />

Lock.newCondition na već kreiranom lokotu (Lock objektu). Za razliku od unutarnjih lokota i njihovih<br />

redova kondicija, gdje je uz jedan unutarnji lokot vezan samo jedan red kondicija, kod eksplicitnih lokota<br />

može se vezati više kondicija za jedan lokot, ako postoji potreba. Kondicije imaju metode await, signal,<br />

signalAll, koje su ekvivalentne metodama wait, notify, notifyAll kod unutarnjih redova kondicija.<br />

54


Ovako izgleda sučelje Condition:<br />

public interface Condition {<br />

void await() throws InterruptedException;<br />

boolean await(long time, TimeUnit unit) throws InterruptedException;<br />

long awaitNanos(long nanosTimeout) throws InterruptedException;<br />

void awaitUninterruptibly();<br />

boolean awaitUntil(Date deadline) throws InterruptedException;<br />

void signal();<br />

void signalAll();<br />

}<br />

Primjer korištenja kondicija za implementaciju ograničenog međuspremnika (vidi se da se na jedan<br />

lokot vežu dvije kondicije, te da se koriste nove metode await i signal):<br />

class BoundedBuffer {<br />

Lock lock = new ReentrantLock();<br />

Condition notFull = lock.newCondition(); // Povezivanje jednog lokota<br />

Condition notEmpty = lock.newCondition(); // i dvije kondicije<br />

Object[] items = new Object[100];<br />

int putptr, takeptr, count;<br />

}<br />

public void put(Object x)throws IE {<br />

lock.lock();<br />

try {<br />

while (count == items.length) notFull.await();<br />

items[putptr] = x;<br />

if (++putptr == items.length) putptr = 0;<br />

++count;<br />

notEmpty.signal();<br />

} finally {<br />

lock.unlock();<br />

}<br />

}<br />

public Object take() throws IE {<br />

lock.lock();<br />

try {<br />

while (count == 0) notEmpty.await();<br />

Object x = items[takeptr];<br />

if (++takeptr == items.length) takeptr = 0;<br />

--count;<br />

notFull.signal();<br />

return x;<br />

} finally {<br />

lock.unlock();<br />

}<br />

}<br />

Vidjeli smo neka (a ima ih još dosta) poboljšanja u zaključavanju u Javi 5. No, kako kažu autori u<br />

[10], mnoge klase u paketu java.util.concurrent, kao što su Semaphore i ConcurrentLinkedQueue, pružaju<br />

bolje performanse i skalabilnost u odnosu na stare klase (koje su koristile synchronized), ne zato što<br />

koriste nove vrste lokota, već zato što uopće ne koriste lokote - koriste atomarne varijable (atomic<br />

variables) i neblokirajuću sinkronizaciju (sinkronizacija bez lokota). Neblokirajući algoritmi značajno su<br />

kompleksniji od blokirajućih, ali pružaju bolje performanse i skalabilnost, nemaju problema npr. sa<br />

deadlockom, pa su najčešći predmet novijih istraživanja na području konkurentnih algoritama.<br />

No, kako naglašava autor u [6], pisanje neblokirajućih konkurentnih algoritama je posao za eksperte.<br />

Navodi da onaj tko misli da zna pisati takve algoritme treba proći tzv. Goetzov test (Brian Goetz je<br />

dugogodišnji stručnjak za konkurentno programiranje u Javi, trenutačno Java Language Architect u firmi<br />

Oracle): "Ako znate pisati JVM visokih performansi za moderne mikroprocesore, tada ste kvalificirani da<br />

razmišljate o tome da li smijete izbjeći lokote za sinkronizaciju (tj. pisati neblokirajuće algoritme)".<br />

55


Atomarne varijable su na neki način generalizacija volatilnih varijabli (volatile variables) koje su<br />

postojale i prije Jave 5. Postoji dvanaest klasa atomarnih varijabli, podijeljenih u četiri grupe, a najvažnija<br />

je grupa skalarnih varijabli (scalars), koju čine klase AtomicInteger, AtomicLong, AtomicBoolean i<br />

AtomicReference. Atomarne varijable su, kao i lokoti u novim verzijama Jave, implementirane uglavnom<br />

uz pomoć CAS (compare-and-swap) operacije, koja je opisana u 4. točki. Jedino kad određeni hardver ne<br />

podržava tu operaciju (što je rijetkost, jer svi procesori već desetak godina podržavaju CAS ili ekvivalent),<br />

onda JVM umjesto CAS obično koristi spinn lock (zaključavanje pomoću radnog čekanja). JVM-ovi su,<br />

kao i operacijski sustavi, koristili CAS (ako je postojao na određenom hardveru) i prije Jave 5, ali tek od<br />

Jave 5 mogu Java klase (uključujući i one koje mi pišemo) koristiti CAS operaciju.<br />

U nastavku se prikazuju dvije realizacije [10] generatora pseudoslučajnih brojeva - pomoću klase<br />

ReentrantLock i pomoću klase AtomicInteger i operacije CAS [10]:<br />

public class ReentrantLockPseudoRandom extends PseudoRandom {<br />

private final Lock lock = new ReentrantLock(false);<br />

private int seed;<br />

ReentrantLockPseudoRandom(int seed) {this.seed = seed;}<br />

public int nextInt(int n) {<br />

lock.lock();<br />

try {<br />

int s = seed;<br />

seed = calculateNext(s);<br />

int remainder = s % n;<br />

return remainder > 0 ? remainder : remainder + n;<br />

} finally {lock.unlock();}<br />

}<br />

}<br />

public class AtomicPseudoRandom extends PseudoRandom {<br />

private AtomicInteger seed;<br />

AtomicPseudoRandom(int seed) {this.seed = new AtomicInteger(seed);}<br />

public int nextInt(int n) {<br />

while (true) {<br />

int s = seed.get();<br />

int nextSeed = calculateNext(s);<br />

if (seed.compareAndSet(s, nextSeed)) {<br />

int remainder = s % n;<br />

return remainder > 0 ? remainder : remainder + n;<br />

}<br />

}<br />

}<br />

}<br />

Na slici 6.4 prikazuje se propusnost oba rješenja. Prikazana je i krivulja za tzv. ThreadLocal varijable<br />

(imaju najbolje performanse), a to su varijable koje imaju svoju posebnu instancu za svaku dretvu, na<br />

temelju thread local storage mehanizma - to je nešto slično kao kada u bazi podataka jedna sesija ne vidi<br />

mijenjane, ali nekomitirane, podatke druge sesije, jer čita svoju vlastitu verziju u UNDO tablespaceu.<br />

Slika 6.4: Propusnost ReentrantLock i AtomicInteger kod srednjeg opterećenja; Izvor: [10]<br />

56


7. EIFFEL OOPL<br />

Eiffel je 1985. godine dizajnirao (a 1986. je napravljen prvi compiler) Bertrand Meyer, jedan od<br />

najvećih autoriteta na području OOPL-a. Prvo izdanje njegove knjige OOSC (1988.), značajno je djelo<br />

informatičke literature (aktualno je 2. izdanje iz 1997.). Ta je knjiga upoznala javnost sa OO jezikom Eiffel<br />

(tada verzije 2). Eiffel je od početka je podržavao višestruko nasljeđivanje, generičke klase, obradu<br />

iznimaka, garbage collection i metodu Design by Contract (DBC), a kasnije su mu dodani agenti<br />

(vjerojatno će nešto slično imati Java 8 pod imenom closures ili lambda expressions; C# ih već ima),<br />

nasljeđivanje implementacije (uz nasljeđivanje tipa) i metoda za konkurentno programiranje Simple<br />

Concurrent Object-Oriented Programming (SCOOP). U široj je javnosti daleko manje poznat nego C++ i<br />

Java, ali ga mnogi autoriteti smatraju danas najboljim OOPL jezikom. Eiffel je od 2005. godine ECMA<br />

standardiziran, a od 2006. ISO standardiziran.<br />

Slijedi primjer Eiffel klase. Napomenimo da konstruktor metoda u Eiffelu ne mora imati isto ime kao<br />

klasa u kojoj se nalazi, ali smo namjerno zadržali isto ime, kao što npr. mora biti u Javi:<br />

class ZIVOTINJA<br />

create zivotinja<br />

feature {ANY}<br />

ime : STRING<br />

visina_cm: DOUBLE<br />

zivotinja (p_ime: STRING; p_visina_cm: REAL) is<br />

do<br />

ime := p_ime<br />

visina_cm := p_visina_cm<br />

end<br />

prikazi_podatke is<br />

do<br />

print (" Ime: "); print (ime)<br />

print (", Visina (cm): "); print (visina_cm)<br />

print (", Visina (inch): "); print (visina_inch)<br />

end<br />

visina_inch: REAL is<br />

do<br />

Result := visina_cm / 2.54<br />

end<br />

end<br />

Vidimo da se u Eiffelu ne mora koristiti znak za odvajanje naredbi " ; ", ali je preporuka da se koristi<br />

ako imamo više naredbi u istom retku (zbog čitljivosti). Primijetimo da u funkciji ne postoji ključna riječ<br />

return, već Eiffel ima posebnu predefiniranu varijablu Result. Također, primijetimo da Eiffel (a to ima i<br />

PL/SQL) omogućava tzv. uniformni pristup (uniform access), tj. poziv atributa ne razlikuje se od poziva<br />

funkcije bez parametara. Npr. u proceduri prikazi_podatke funkciju pozivamo sa visina_inch, dok npr.<br />

Java traži da se koriste zagrade i kad metoda nema parametara, pa se mora pisati visina_inch().<br />

Uniformni pristup se smatra značajnom mogućnošću OOPL jezika.<br />

Eiffel ima vrlo jednostavno i vrlo fleksibilno definiranje pristupa, jer za svaki atribut/metodu možemo<br />

definirati koja mu klasa može pristupati. Npr, ako ne želimo dati niti jednoj klasi pristup atributu visina_cm<br />

i funkciji visina_inch, pristup konstruktoru zivotinja želimo dozvoliti samo klasama TEST1 i TEST2, a<br />

pristup atributu ime i proceduri prikazi_podatke želimo dozvoliti svim klasama, napisat ćemo:<br />

feature {NONE} visina_cm ...; visina_inch ...;<br />

feature {TEST1, TEST2} zivotinja ...;<br />

feature {ANY} ime ...; prikazi_podatke ...;<br />

Važno je naglasiti da u Eiffelu dozvola pristupa atributu znači dozvolu čitanja atributa, ne i dozvolu<br />

pisanja. Vrijednosti atributa može mijenjati samo metoda iz klase u kojoj je atribut definiran (ili iz njene<br />

podklase), pomoću set procedura. Zbog toga u Eiffelu ne treba raditi get funkcije, dok Java mora imati get<br />

funkcije ako želimo atribute zaštiti od upisa izvan klase. Zanimljivo je da Eiffel može sakriti atribute nekog<br />

objekta čak i od drugih objekata (instanci) iste klase, pomoću {NONE} ili, što je isto, pomoću {}. Eiffel ne<br />

poznaje sakrivanje atributa/metoda od podklase (nema nešto kao Java private), jer Meyer drži da to nije<br />

u skladu sa OO modelom.<br />

57


Eiffel podržava jednostruko i višestruko nasljeđivanje (klasa). No, postoje dvije vrste nasljeđivanja -<br />

nasljeđivanja tipa (zove se i semantičko nasljeđivanje, ili nasljeđivanje sučelja) i nasljeđivanja<br />

implementacije (zove se i sintaktičko nasljeđivanje, ili nasljeđivanje programskog koda). Prva vrsta<br />

nasljeđivanja je "pravo" nasljeđivanje, u kojem podklasa predstavlja podtip. Druga vrsta nasljeđivanja je<br />

"praktično" nasljeđivanje, gdje se želi iskoristiti neki postojeći programski kod, ali se ne želi koristiti<br />

polimorfizam. Eiffel je dobio nasljeđivanje implementacije naknadno, po uzoru na jezik C++.<br />

Neki drže višestruko nasljeđivanje vrlo važnim svojstvom OOPL jezika. Npr. Meyer drži da je u<br />

mnogim konkretnim situacijama potrebno da klasa može naslijediti dvije ili više klasa i duhovito kaže da je<br />

odgovor na pitanje "Da li moja klasa C treba naslijediti klasu A ili klasu B (budući da moj jezik podržava<br />

samo jednostruko nasljeđivanje)?" često isto tako težak kao i odgovor na pitanje "Da li da izaberem<br />

mamu ili tatu?". Višestruko nasljeđivanje je naročito korisno u slučaju kada postoje dva (ili više) jednako<br />

važna kriterija za kreiranje hijerarhije klasa (jednostruko nasljeđivanje dopušta samo jednu hijerarhiju) i u<br />

slučaju kada podklasa od jedne nadklase nasljeđuje tip, a od druge nadklase nasljeđuje implementaciju,<br />

tzv. mix-in nasljeđivanje (primjer: klasa ARRAYED_STACK nasljeđuje od apstraktne klase STACK i klase<br />

ARRAY). Slijedi Eiffel (nepotpuni) primjer klase C koja nasljeđuje od klasa A i B, pri čemu klasa C<br />

nadjačava jedan atribut i jednu metodu iz klase A i jednu metodu iz klase B:<br />

class C<br />

inherit<br />

A redefine atribut_iz_a, metoda_iz_a end<br />

B redefine metoda_iz_b end<br />

feature<br />

...<br />

end<br />

Kod višestrukog nasljeđivanja najčešće se navode dva glavna problema. Jedan je problem kada<br />

roditeljske klase imaju atribute/metode istog imena, ali različitog značenja. Eiffel za to ima vrlo<br />

jednostavno rješenje – preimenovanje (barem jednog) atributa/metode pomoću rename. Drugi je problem<br />

kada imamo tzv. ponavljajuće (repeated) nasljeđivanje, npr. u primjeru gdje su klase B i C djeca klase A,<br />

a klasa D je dijete i od B i od C, pa izlazi da je klasa D dva puta (indirektno) dijete od klase A (to se<br />

naziva i dijamantnim nasljeđivanjem, zbog sličnosti crteža takvih klasa sa skicom dijamanta). Ako<br />

atributi/metode klase A nisu nadjačani u klasama B i C, Eiffel za to ima najjednostavnije moguće rješenje<br />

– ne treba ništa napraviti, jer duplih atributa/metoda niti nema. Ako su pak atributi/metode iz klase A<br />

redefinirani u klasi B i/ili C, tada postoje dva slučaja – da je kod nadjačavanja u klasama B/C zadržano<br />

isto ime atributa/metode kao u klasi A, ili da je ime promijenjeno. Prvi slučaj (ista imena) se najčešće<br />

svodi na drugi, preimenovanjem jednog atributa/metode (a rjeđe se koristi "eliminacija" jednog<br />

atributa/metode, pomoću undefine). U drugom slučaju (različita imena) Eiffel traži da se eksplicitno<br />

izabere (pomoću select) željeni atribut/metoda, što je potrebno da bi se razriješila dilema izbora prave<br />

metode kod dinamičkog pozivanja metoda (zbog polimorfičnog pridruživanja).<br />

Eiffel šalje parametre referentnog tipa kao reference, a expanded parametre šalje kao vrijednosti.<br />

Bez obzira kako se parametri šalju, Eiffel ne dozvoljava da se oni u metodi mijenjaju, niti pomoću naredbe<br />

pridruživanja "parametar := nesto", niti pomoću naredbe kreiranja objekta "create parametar;". Ali, iako<br />

Eiffel metoda ne može mijenjati objekt predstavljen parametrom, može mijenjati njegove atribute (bilo<br />

direktno, bilo pozivom drugih metoda). Zanimljivo je pitanje promjene signature, tj. pitanje da li parametri<br />

u nadjačanoj metodi mogu imati drugačiji tip od parametara u metodi iz nadklase i (ako mogu) kakav<br />

mora biti taj tip. Postoje tri (glavne) mogućnosti:<br />

1. tip parametra se ne može mijenjati - no variance;<br />

2. može se mijenjati tako da bude podtip u odnosu na bazni – covariance;<br />

3. može se mijenjati tako da bude nadtip - contravariance.<br />

Eiffel podržava covariance i za parametre metoda i za povratnu (return) vrijednost funkcije i za<br />

atribute. Npr. Java je do verzije 1.4 imala u potpunosti no variance pristup, ali od verzije 1.5 (ili 5.0)<br />

podržava covariance za povratne vrijednosti funkcije (i PL/SQL se ponaša kao Java 1.5).<br />

Eiffel je imao generičke klase od početka, dok ih Java dobila u verziji 1.5. Možemo reći da generičke<br />

klase zapravo nisu prave klase, nego predlošci za klase, jer imaju tzv. generičke parametre. Npr. u Eiffelu<br />

ovako izgleda generička klasa STACK [G] (generički parametar nazvan je G, a može se zvati i drugačije):<br />

class STACK [G]<br />

feature<br />

element_na_vrhu: G is<br />

do ... end<br />

...<br />

end<br />

58


Generička klasa se koristi kao klijent neke (druge) klase, u kojoj se (drugoj klasi) atribut, varijabla ili<br />

parametar deklarira pomoću generičke klase, tako da se generički parametar zamijeni sa nekom (trećom)<br />

klasom. Npr. klasa STACK_KLIJENT može sadržavati dva atributa definirana na sljedeći način (generički<br />

parametar G zamijenjen je klasom ZIVOTINJA, odnosno klasom REAL):<br />

atribut1: STACK [ZIVOTINJA]<br />

atribut2: STACK [REAL]<br />

Eiffel ima (kao i Java) i tzv. ograničenu generičnost (constrained genericity), gdje se generički<br />

parametar ograničava nekom određenom klasom, pomoću operatora ->. U slučaju ograničene<br />

generičnosti, klasa koja zamjenjuje generički parametar mora biti ili ista kao klasa koja ograničava<br />

generički parametar, ili podklasa te klase. Npr. ako bismo ovako definirali (ograničenu) generičku klasu<br />

STACK:<br />

class STACK [G -> ZIVOTINJA] ... end<br />

tada bismo imali sljedeće:<br />

atribut1: STACK [BAKTERIJA] -- greška, nije podklasa od ZIVOTINJA<br />

atribut2: STACK [ZIVOTINJA] -- OK, može biti ista klasa<br />

atribut3: STACK [KUCNI_LJUBIMAC] -- OK, to je podklasa od ZIVOTINJA<br />

Design By Contract (DBC) je metoda čiji je autor također Meyer. Stoga nije čudno da Eiffel u<br />

potpunosti podržava DBC. Za sada niti jedan drugi OOPL ne podržava DBC u potpunosti, barem ne na<br />

razini jezika. DBC je opširno opisan u [12]. Pojednostavljeno rečeno, DBC se zasniva na ideji da svaka<br />

metoda (procedura ili funkcija), uz "standardni" programski kod, treba imati još dva dodatna dijela -<br />

pretkondiciju (precondition) i postkondiciju (postcondition). Klasa treba imati još jedan dodatni dio -<br />

invarijantu (invariant). Ugovor (contract) se zasniva na tome da metoda "traži" od svog pozivatelja (neke<br />

druge metode) da zadovolji uvjete definirane u pretkondiciji (plus uvjete definirane u invarijanti), a ona<br />

(pozvana metoda) se tada "obvezuje" da će na kraju zadovoljiti uvjete definirane u postkondiciji (plus<br />

uvjete definirane u invarijanti). Ideja je na neki način upravo suprotna od tzv. defanzivnog programiranja,<br />

koje zagovora da se u svim mogućim trenucima pokušava što više toga provjeriti.<br />

Eiffel za specifikaciju DBC elemenata koristi ključne riječi require (odnosno require else u<br />

nadjačanoj metodi, kod nasljeđivanja) za označavanje pretkondicije, ensure (odnosno ensure then u<br />

nadjačanoj metodi) za postkondicije i invariant za invarijante klasa. Navedene naredbe su najvažnije za<br />

DBC podršku, ali Eiffel ih ima još. Naredba check služi za provjeru nekog uvjeta u bilo kom trenutku. Za<br />

provjeru programskih petlji postoje dvije naredbe: variant provjerava da li se cjelobrojni izraz smanjuje<br />

kod svakog prolaza u petlji, a invariant (opet ista riječ kao za označavanje invarijante klase, ali je u<br />

kontekstu petlje značenje drugačije) provjerava da li je određeni uvjet u petlji zadovoljen u svakom<br />

prolazu.<br />

U Eiffelu metoda ne može obraditi iznimku koja se desila zbog nezadovoljavanja pretkondicije –<br />

jednostavno, pozvana metoda nema što raditi ako se druga metoda (pozivatelj) ne drži ugovora! Dakle,<br />

za pojavu iznimke u vrijeme izvršavanja programskog koda pretkondicije "krivac" je metoda-pozivatelj,<br />

dok je za pojavu iznimke u vrijeme izvršavanja programskog koda postkondicije "krivac" metodaizvršavatelj.<br />

Nadjačane metode ne mogu imati bilo kakve pretkondicije ili postkondicije, već nadjačana metoda<br />

mora imati jednaku ili slabiju pretkondiciju (tj. može zahtijevati od metode koja ju je pozvala ili isto što i<br />

metoda nadklase, ili manje od toga) i mora imati jednaku ili jaču postkondiciju (tj. mora osigurati barem<br />

ono što je osiguravala metoda nadklase, ili više od toga). Zato se za definiranje pretkondicije u<br />

nadjačanoj metodi koristi oblik require else (umjesto require), a za definiranje postkondicije u<br />

nadjačanoj metodi koristi se ensure then.<br />

Može se postaviti pitanje utjecaja izvršenja pretkondicija, postkondicija i invarijanti na brzinu<br />

izvođenja programa. Nažalost, utjecaj postoji, a naročito je skupa provjera invarijanti. Stoga se u Eiffel-u<br />

može odrediti nekoliko stupnjeva provjere. Najslabija provjera (ali sa najmanjim negativnim utjecajem na<br />

brzinu izvođenja) je provjera samo pretkondicija (ta se provjera obično ostavlja i nakon završetka faze<br />

testiranja, tj. ostaje u produkcijskom kodu). Sljedeći stupanj uključuje provjeru postkondicija, slijedi<br />

provjera invarijanti, zatim provjera petlji i na kraju provjera pomoću check naredbi. Najveći stupanj<br />

provjere se obično koristi samo kod testiranja, jer se takvi programi izvršavaju i do 2-3 puta sporije u<br />

odnosu na programe koji nemaju nikakvih provjera.<br />

Treba naglasiti da su pretkondicije, postkondicije i invarijante korisne čak i kada nisu realizirane kao<br />

programski kod, nego samo kao komentar (najčešće zato što je nešto teško ili nemoguće izraziti – Eiffel<br />

nema operatore univerzalnog i egzistencijalnog kvantifikatora iz predikatnog računa), jer poboljšavaju<br />

dokumentiranost izvornog koda. Zbog DBC podrške, može se reći da je Eiffel i specifikacijski (a ne samo<br />

programski) jezik.<br />

59


Slijedi Eiffel programski kod za realizaciju stoga (OOSC2 str. 390.-391.). Zapravo, to nije kompletan<br />

programski kod, već samo tzv. kratki oblik klase, koji ne prikazuje izvršni kod metoda (zato to nije class,<br />

već class interface). Kratki oblik klase ne prikazuje niti skrivene implementacijske detalje, tako da ne<br />

vidimo da klasa ima jedan skriveni atribut tipa niz (implement: ARRAY [G]) koji služi za implementaciju<br />

stoga:<br />

class interface STACK [G]<br />

creation make<br />

feature – inicijalizacija<br />

-- stog od n elemenata<br />

make (n: INTEGER) is<br />

require non_negative_capacity: n >= 0<br />

ensure capacity_set: capacity = n<br />

end<br />

feature -- pristup<br />

-- maksimalni broj elemenata<br />

capacity: INTEGER<br />

-- broj elemenata stoga<br />

el_count: INTEGER<br />

-- element na vrhu stoga<br />

item: G is<br />

require not_empty: not empty<br />

end<br />

feature – statusi<br />

-- da li je stog prazan?<br />

empty: BOOLEAN is<br />

ensure empty_definition: Result = (el_count = 0)<br />

end<br />

-- da li je stog pun?<br />

full: BOOLEAN is<br />

ensure full_definition: Result = (el_count = capacity)<br />

end<br />

feature – promjena<br />

–- dodaj x na vrh stoga<br />

put (x: G) is<br />

require not_full: not full<br />

ensure not_empty: not empty<br />

added_to_top: item = x<br />

one_more_item: el_count = old el_count + 1<br />

end<br />

-– makni element sa vrha<br />

remove is<br />

require not_empty: not empty<br />

ensure not_full: not full<br />

one_fewer: el_count = old el_count - 1<br />

end<br />

invariant<br />

count_non_negative: 0


8. KONKURENTNO PROGRAMIRANJE U EIFFELU – SCOOP METODA<br />

Metoda SCOOP (Simple Concurrent Object-Oriented Programming) ima prilično davne korijene.<br />

Njen kreator, Bertrand Meyer (koji je i kreator jezika Eiffel), prikazao je osnovne ideje te metode još 1990.<br />

godine na TOOLS Europe, a preradio ih je 1993. Detaljan prikaz dao je 1997. u [12]. Kasnije je SCOOP<br />

metoda eksperimentalno realizirana i poboljšavana na ETH Zurich, te se koristi naročito za nastavne i<br />

znanstvene potrebe. Formalni prikaz te metode zaokružio je 2007. godine P. Nienaltowski u doktorskoj<br />

disertaciji kod prof. Meyera. Nedavno je (lipanj 2011.) firma Eiffel Software (www.eiffel.com) uključila<br />

SCOOP metodu u svoj proizvod EiffelStudio v.6.8. Moglo bi se reći da je SCOOP zaseban (mini) jezik za<br />

konkurentno programiranje, jer eksperimentalne implementacije postoje i izvan jezika Eiffel, npr. postoje i<br />

za jezik Java. SCOOP se i dalje razvija, npr. rade se istraživanja na sljedećim područjima:<br />

- prevencija i detekcija deadlocka;<br />

- uvođenje softverske transakcijske memorije;<br />

- distribuirani SCOOP.<br />

Kod SCOOP metode vrlo je važan pojam procesor, ali se pod tim pojmom ne misli na fizički<br />

procesor, već na apstraktni procesor, koji može biti i fizički procesor (u nastavku će se za njega koristiti<br />

termin CPU), proces operacijskog sustava, dretva operacijskog sustava i sl. Da se smanji zabuna, u<br />

nastavku će se koristiti oblik (apstraktni) procesor (a ne samo procesor, kao što se koristi u [12], [13] i<br />

[14]). Za razliku od CPU-a, čiji je broj ograničen, možemo držati da je broj (apstraktnih) procesora<br />

praktički neograničen. Kako se navodi u [12], (apstraktni) procesor je jedna od tri sile računanja kod<br />

OOPL programiranja: neka akcija (ili metoda, tj. funkcija ili procedura) izvodi se na određenom<br />

(apstraktnom) procesoru nad određenim objektom (instancom klase), kako prikazuje slika 8.1:<br />

Slika 8.1: Tri sile kod računanja (The three forces of computation); Izvor: [12]<br />

Temeljna ideja vezana za (apstraktne) procesore u SCOOP metodi je: svaki objekt je dodijeljen<br />

samo jednom (apstraktnom) procesoru, koji se naziva rukovatelj (handler) objektom. S druge strane,<br />

jedan (apstraktni) procesor može biti rukovatelj za više objekata. Kad se kreira novi objekt, runtime sistem<br />

(na temelju programskih uputa) odlučuje da li će mu se dodijeliti neki rukovatelj od postojećih, ili će se<br />

kreirati novi (apstraktni) procesor kao rukovatelj za novokreirani objekt. Ta veza ostaje do kraja - objekt je<br />

uvijek vezan za samo jednog rukovatelja, a to u konačnici znači da se nad istim objektom istovremeno<br />

može izvoditi samo jedna metoda, jer metode određenog objekta može izvoditi samo rukovatelj tog<br />

objekta.<br />

Kada se u nekoj metodi, koja se izvodi nad nekim objektom, poziva metoda nad objektom kojim<br />

rukuje drugi rukovatelj (tj. koji nije isti kao rukovatelj prvog objekta), taj se poziv zove asinkroni poziv ili<br />

odvojeni (separate) poziv. U tom slučaju rukovatelj prvog objekta može nastaviti rad, ne čekajući da<br />

pozvana metoda završi. Za razliku od toga, poziv metode nad drugim objektom koji ima istog rukovatelja<br />

kao i prvi objekt, je sinkroni poziv ili neodvojeni poziv – to je standardna situacija iz sekvencijalnog<br />

programiranja, gdje rukovatelj mora čekati da jedna metoda završi prije nego nastavi izvršavati drugu<br />

(naravno, zanemarujemo fizičke detalje CPU-a, mogućnost instrukcijskog paralelizma i sl.).<br />

Ostalo je otvoreno pitanje na koji način runtime sistem određuje kojeg će rukovatelja dodijeliti<br />

objektu. U odnosu na nekonkurentni Eiffel, SCOOP metoda uvodi samo još jednu ključnu riječ - separate.<br />

Uz uobičajenu deklaraciju varijable (napomena: Eiffel izvorno koristi termin entitet za atribute, lokalne<br />

varijable i argumente metoda)<br />

x : X<br />

koja označava da je varijabla x referenca na objekt tipa (tj. klase) X, sada se može pisati i<br />

x : separate X<br />

čime se izražava da kod izvođenja programa x može biti referenca na objekt koji ima drugog<br />

rukovatelja u odnosu na objekt u kojem se ta referenca nalazi. Takva se referenca zove odvojena<br />

referenca, a objekt na koji pokazuje zove se odvojeni objekt.<br />

61


Slika 8.2 prikazuje tri objekta: x, y i z. Objektu x je rukovatelj (apstraktni) procesor p, a objektima y i<br />

z rukovatelj je (apstraktni) procesor q. Objekt x ima atribut y, koji predstavlja udaljenu referencu, jer ta<br />

referenca pokazuje na objekt y, koji ima drugog rukovatelja. Za razliku od toga, objekt y ima atribut z koji<br />

je ne-odvojena referenca na ne-odvojeni objekt z, jer objekti y i z imaju istog rukovatelja.<br />

Slika 8.2: Odvojena referenca: u objektu x, atribut y referencira objekt<br />

na drugom (apstraktnom) procesoru; Izvor: [14]<br />

Primjer [12] pojasnit će do sada navedeno. Prtpostavimo da u klasi WORKER, metoda task nešto<br />

radi i stavlja rezultat u atribut output:<br />

class WORKER<br />

feature<br />

output: INTEGER<br />

do_task (input: INTEGER) do ... end<br />

end<br />

Klasa MANAGER ima dva atributa - reference tipa WORKER, ali jedna referenca je odvojena, a<br />

druga je ne-odvojena. U nekoj metodi te klase pozivaju se metode task nad odvojenim objektom worker1<br />

i nad ne-odvojenim objektom worker2, a onda se rezultati izvođenja zbrajaju:<br />

class MANAGER<br />

feature<br />

worker1 : separate WORKER<br />

worker2 : WORKER<br />

-- in some routine:<br />

do<br />

. . .<br />

worker1.do_task (input1)<br />

worker2.do_task (input2)<br />

result := worker1.output + worker2.output<br />

end<br />

end<br />

Zbivanja kod izvođenja ovog programskog koda mogu se ovako opisati: procedura task nad<br />

odvojenim objektom worker1 poziva se asinkrono, tj. program ne čeka da ona završi, već odmah prelazi<br />

na sljedeću proceduru task nad objektom worker2, koju izvodi sinkrono. Kada je ta druga procedura<br />

gotova, izvršava se sljedeća naredba, koja zbraja dva rezultata. Tek u ovom trenutku mora se čekati da<br />

procedura task nad objektom worker1 završi, jer je sada potreban rezultat te procedure. To se čekanje<br />

obavlja automatski od strane SCOOP mehanizma, i zove se wait-by-necessity (čekanje po potrebi). U<br />

ovom primjeru je rad sa odvojenim objektima bio lagan, jer je sistem sam znao da li je poziv sinkron ili<br />

asinkron i kada treba čekati na rezultat.<br />

62


U nastavku će biti prikazano kako se u SCOOP-u radi međusobno isključivanje (mutual exclusion) u<br />

slučajevima kada se odvojeni objekti međusobno upliću jedan drugome u rad, tj. kod tzv. race condition.<br />

Primjer rada sa brojačima je ekvivalentan Java primjeru iz 5. točke (oboje je iz [12]):<br />

class COUNTER<br />

feature<br />

value : INTEGER<br />

set_value (a_value: INTEGER)<br />

do<br />

value := a_value<br />

end<br />

increment<br />

do<br />

value := value + 1<br />

end<br />

end<br />

Pretpostavimo da postoji varijabla x deklarirana kao separate COUNTER i pratimo sljedeći niz<br />

naredbi:<br />

x.set value (0)<br />

x.increment<br />

i := x.value<br />

Istovremeno se u nekom odvojenom (apstraktnom) procesoru odvija naredba:<br />

x.set value (2)<br />

Kao i u ekvivalentnom Java primjeru u 5. točki, zbog mogućeg ispreplitanja ovih naredbi u<br />

paralelnom radu, vrijednost varijable i iz prvog koda može biti 1, 2 ili 3. U Javi se to moglo spriječiti<br />

sinkronizacijom pomoću (npr.) synchronized. U Eiffelu se koristi jednostavno pravilo, koje se zove pravilo<br />

odvojenih argumenata (separate argument rule): runtime sistem automatski zaključava (apstraktne)<br />

procesore koji rukuju odvojenim objektima koji su (objekti) poslani kao argumenti metode. Ako je<br />

(apstraktni) procesor zaključan, ne može ga se koristiti, pa se ne može pozvati niti jedna metoda nad<br />

objektom kojemu je rukovatelj zaključani (apstraktni) procesor. Izmijenimo prethodni kod (tri instrukcije)<br />

na sljedeći način, tako da ih stavimo u proceduru koja će imati odvojeni objekt kao argument:<br />

compute (x: separate COUNTER)<br />

do<br />

x.set_value (0)<br />

x.increment<br />

i := x.value<br />

end<br />

Pogledajmo sada poziv compute (x) i pretpostavimo da je (apstraktni) procesor p rukovatelj za x.<br />

Kako je prije rečeno, budući da je x odvojeni argument te procedure, procesor p mora biti zaključan.<br />

Tekući procesor, koji izvodi proceduru compute, automatski čeka dok runtime sistem ne zaključa<br />

procesor p. Kada je p zaključan, tijelo procedure compute može se izvršavati bez problema (ne postoje<br />

višestruki lokoti na jedan procesor), pa će varijabla i na kraju procedure uvijek ima vrijednost 1. SCOOP<br />

forsira takvo ponašanje, tj. svi pozivi nad odvojenim objektima moraju se uokviriti u procedure kojima se<br />

odvojeni objekt šalje kao argument.<br />

Npr. ovo je neispravno (kompajler javlja grešku):<br />

x : separate X<br />

compute<br />

do x.f end<br />

a ovo je ispravno:<br />

x : separate X<br />

compute (x1: separate X)<br />

do x1.f end<br />

63


Prikažimo sada u SCOOP-u sinkronizaciju na temelju uvjeta (condition synchronization), koja se u<br />

Javi implementirala npr. pomoću naredbi wait / notifyAll / notify, na istom primjeru proizvođača i potrošača<br />

kao u 5. točki. Pretpostavimo da imamo generičku klasu BUFFER[T] koja implementira neograničeni red<br />

(unbounded queue):<br />

buffer: separate BUFFER[INTEGER]<br />

i sljedeću proceduru u klasi potrošača:<br />

consume (a_buffer: separate BUFFER[INTEGER])<br />

require<br />

not (a_buffer.count = 0)<br />

local<br />

value: INTEGER<br />

do<br />

value := a_buffer.get<br />

end<br />

Primijetimo da smo koristili pretkondiciju kako bismo osigurali da buffer nije prazan kada iz njega<br />

čitamo. Pitanje je što će se desiti ako je buffer prazan? U sekvencijalnom slučaju desila bi se iznimka<br />

(exception). Međutim, u konkurentnom radu pretkondicije na odvojene objekte imaju drugu semantiku -<br />

rukovatelj odvojenog objekta se otključa, čeka se dok se ne zadovolji zahtjev, a onda se rukovatelj<br />

odvojenog objekta opet zaključa. Pretkondicija se u konkurentnom radu pretvara u uvjet za čekanje (wait<br />

condition). To se ponašanje može iskazati kao pravilo čekanja (wait rule): "Poziv metode koja ima<br />

odvojene argumente izvršit će se onda kada su svi odgovarajući rukovatelji slobodni (nisu zaključani) i<br />

kada su zadovoljene sve pretkondicije. Rukovatelji su ekskluzivno zaključani za vrijeme trajanja metode."<br />

Kao i u Javi, tako se i u SCOOP metodi može desiti deadlock. Primjer [12]:<br />

class C<br />

creation<br />

make<br />

end<br />

feature<br />

a : separate A<br />

b : separate A<br />

make (x : separate A, y : separate A)<br />

do<br />

a := x<br />

b := y<br />

end<br />

f do g (a) end<br />

g (x : separate A) do h (b) end<br />

h (y : separate A) do ... end<br />

Pretpostavimo sada da se izvršava sljedeći kod, gdje su objekti c1 i c2 tipa separate C, objekti a i b<br />

su tipa separate A, objekt a ima rukovatelja p, objekt b ima rukovatelja q:<br />

create c1.make (a, b)<br />

create c2.make (b, a)<br />

c1.f<br />

c2.f<br />

Budući da su kod inicijalizacija objekata c1 i c2 argumenti permutirani, moguća je sekvenca poziva<br />

kod koje je u jednom slučaju zaključan rukovatelj p, a čeka se da se oslobodi rukovatelj q, i obrnuto.<br />

Nastao je deadlock.<br />

Deadlock se trenutačno ne može automatski detektirati u SCOOP-u, pa je programerova<br />

odgovornost da radi programski kod slobodan od deadlocka (deadlock-free). No, kako se navodi u [12],<br />

radi se na implementaciji sheme koja prevenira deadlock, a ona je temeljena na redoslijedu zaključavanja<br />

koji prevenira cikličko zaključavanje (cyclical locking).<br />

64


ZAKLJUČAK<br />

Iako i dalje vrijedi Mooreov zakon (naravno, to nije zakon niti u matematičkom, niti u fizikalnom<br />

smislu, to je statistička prognoza), koji tvrdi da se broj tranzistora na mikroprocesorskom čipu<br />

udvostručuje otprilike svake dvije godine, danas se kaže: "vrijeme jednostavnog povećanja brzine<br />

programa je prošlo".<br />

Radni takt procesora praktički je prestao rasti oko 2005. godine. Razlog za to je prije svega veliko<br />

povećanje potrošnje struje procesora na velikim brzinama. Zbog toga su se proizvođači okrenuli<br />

drugačijem načinu povećanja performansi procesora. Umjesto povećanja brzine, povećali su broj CPU-a<br />

na jednom mikroprocesorskom čipu, tj. počeli su proizvoditi višejezgrene procesore. No, dok smo kod<br />

jednojezgrenih procesora povećanjem takta procesora dobili linearno povećanje brzine programa, kod<br />

višejezgrenih procesora program najčešće moramo pisati drugačije da bismo iskoristili raspoložive jezgre,<br />

tj. moramo preći na konkurentno programiranje.<br />

Vrlo je važno postići visoku paralelnost programa, a razlog za to objašnjava tzv. Amdahlov zakon.<br />

Npr. ako imamo 10 procesora i ako je moguće paralelizirati 90% programa, onda je maksimalno<br />

povećanje brzine 5,26 puta, što je skoro dva puta manje od broja procesora. Ako je moguće paralelizirati<br />

99% programa, onda je povećanje 9,17 puta.<br />

Nažalost, konkurentne programe nije lako pisati. Kako je naglasio autor u [6] (na kraju poglavlja o<br />

konkurentnosti): "Nakon rada kroz ovo poglavlje, možete primijetiti da rad sa dretvama u Javi izgleda vrlo<br />

kompleksno i teško za korektnu upotrebu. Dodatno, izgleda malo neproduktivno - iako dretve rade<br />

paralelno, morate investirati veliki trud da implementirate tehnike koje ih sprečavaju da na loš način utječu<br />

jedna na drugu. Ako ste ikada pisali programe u zbirnom jeziku (assembleru), kad pišete programe sa<br />

dretvama, imate sličan osjećaj: svaki mali detalj je važan, i nemate sigurnosnu mrežu u obliku provjere od<br />

strane kompajlera."<br />

Nije lako pisati tzv. blokirajuće algoritme, koji koriste različite vrste lokota za (blokirajuću)<br />

sinkronizaciju. Svi se ti lokoti danas uglavnom zasnivaju na mikroprocesorskoj funkciji (operaciji)<br />

Compare And Swap (CAS), ili njoj ekivalentnoj. No, CAS (i CASD, Compare-and-Swap-Double) nisu<br />

novost - bile su dio IBM 370 arhitekture od 1970. godine, iako je tek 1991. matematički dokazano da<br />

"registri koji koriste compareAndSet() i get() operacije imaju beskonačni broj konsenzusa", što bi vrlo<br />

pojednostavljeno (do banalizacije) značilo da je CAS operacija "jako dobra za konkurentno<br />

programiranje". No, korištenje lokota (tj. zaključavanje), bez obzira što se za implementaciju lokota koristi<br />

operacija CAS, ima dosta mana. Najveću manu zaključavanja autori u [8] vide u tome što "nitko stvarno<br />

ne zna kako organizirati i održavati veliki sustav temeljen na zaključavanju".<br />

Još je teže pisati neblokirajuće konkurentne algoritme, koji ne koriste zaključavanje. I oni se interno<br />

temelje (uglavnom) na CAS operaciji, Dakle, CAS operacija je vrlo važna za sadašnjost i budućnost<br />

konkurentnog programiranja. No CAS operacija ima i mane: neblokirajuće algoritme koji koriste CAS (ili<br />

ekvivalentne operacije) vrlo je teško smisliti i često su vrlo neintuitivni. Zapravo, osnovna teškoća sa svim<br />

današnjim sinkronizacijskim operacijama (pa i CAS) je da one rade na samo jednoj riječi memorije, što<br />

tjera na korištenje kompleksnih i neprirodnih algoritama. Problem sa većinom dosadašnjim<br />

sinkronizacijskih mehanizama i operacija, bez obzira da li rade ili ne rade zaključavanje, je da se ne mogu<br />

lagano komponirati, što ima veliki negativan utjecaj na modularnost konkurentnih programa.<br />

Zato je izmišljena transakcijska memorija (TM), a njena realizacija može biti softverska (STM),<br />

hardverska (HTM) ili hibridna. Transakcija je sekvenca koraka koje izvršava jedna dretva. Transakcije<br />

moraju biti serijabilne (serializable), što znači da mora izgledati kao da se izvršavaju sekvencijalno (jedna<br />

iza druge) i onda kada se izvršavaju paralelno. Ispravno implementirane, transakcije nemaju problem<br />

deadlocka ili livelocka, ali najvažnije je da je pomoću njih lakše pisati konkurentne programe. Postoje<br />

različite softverske implementacije transakcijske memorije. Npr. programski jezik Clojure podržava STM<br />

na razini jezika, a neki jezici podržavaju STM na razini biblioteka.<br />

Što se tiče HTM-a, danas postoje barem dva mikroprocesora koja podržavaju HTM - Vega procesor<br />

firme Azul Systems (već 5-6 godina), a nedavno (kolovoz 2011.) mu se pridružio i BlueGene/Q firme IBM.<br />

Temeljna ideja za podršku HTM-a je u tome da današnji mikroprocesori podržavaju protokole<br />

usklađivanja priručne memorije (cache-coherence protocols), pa time već podržavaju većinu toga što je<br />

potrebno za realizaciju HTM-a.<br />

Postoje i neka softverska rješenja konkurentnog programiranja koja (za sada) ne koriste STM, ali<br />

izgledaju naprednija nego npr. rješenja u Javi. Jedno takvo rješenje je Simple Concurrent Object Oriented<br />

Programming (SCOOP), model koji je realiziran u OOPL jeziku Eiffel (iako postoje eksperimentalne<br />

realizacije i u drugim jezicima, pa i u Javi). Suština te metode je da objektima ekskluzivno rukuju njihovi<br />

rukovatelji - apstraktni procesi, i ne zaključavaju se objekti, već procesi. Uobičajena semantika Eiffel<br />

pretkondicije se u SCOOP-u mijenja – neuspjeh zadovoljenja pretkondicije ne uzrokuje exception, već<br />

čekanje na zadovoljavanje uvjeta. Vrijeme će pokazati da li je taj model uspješan.<br />

65


LITERATURA<br />

1. Bloch, J. (2008): Effective Java (2.izdanje), Addison-Wesley / Sun Microsystems<br />

2. Budin, L., Golub, M., Jakobović, D., Jelenković, L. (2010): Operacijski sustavi, Element, Zagreb<br />

3. Cliff C. (2010): Azul's Experiences with Hardware / Software Co-Design (prezentacija),<br />

Azul Systems, blogs.azulsystems.com/cliff (kolovoz 2011.)<br />

4. Cliff C., Göetz B. (2009): Not Your Father's Von Neumann Machine -<br />

A Crash Course in Modern Hardware (prezentacija), JavaOne 2009,<br />

http://www.azulsystems.com/events/javaone_2009/session/2009_J1_HardwareCrashCourse.pdf<br />

(kolovoz 2011.)<br />

5. Drepper U. (2007): What Every Programmer Should Know About Memory (white paper),<br />

Red Hat Inc., http://www.akkadia.org/drepper/cpumemory.pdf (kolovoz 2011.)<br />

6. Eckel B. (2006): Thinking in Java (4.izdanje), Prentice Hall<br />

7. Hennessy, J.L., Patterson D.A. (2007): Computer Architecture - A Quantitative Approach<br />

(4.izdanje), Elsevier / Morgan Kaufmann Publishers<br />

8. Herlihy, M., Shavit, N. (2008): The Art of Multiprocessor Programming,<br />

Elsevier / Morgan Kaufmann Publishers<br />

9. Horstmann, C.S., Cornell, G. (2008): Core Java: Volume 1 - Fundamentals (8.izdanje),<br />

Prentice Hall / Sun Microsystems<br />

10. Göetz B. i ostali (2006): Java Concurrency in Practice, Addison-Wesley<br />

11. Lea D. (1999): Concurrent Programming in Java - Design Principles and Patterns (2.izdanje),<br />

Addison-Wesley<br />

12. Meyer, B. (1997): Object-Oriented Software Construction, Prentice Hall<br />

13. Meyer, B., Nanz S. (2010): Concepts of Concurrent Computation (materijali sa kolegija),<br />

ETH Zuerich - Chair of Software Engineering,<br />

http://se.inf.ethz.ch/old/teaching/2010-S/0268/index.html#lectures_slides (kolovoz 2011.)<br />

14. Nanz S. i dr. (2010): A Comparative Study of the Usability of Two Object-oriented<br />

Concurrent Programming Languages, ETH Zuerich & University of Toronto,<br />

http://se.inf.ethz.ch/people/nanz/publications/nanz-et-al_arxiv1011.6047.pdf (kolovoz 2011.)<br />

15. Reinhold M. (2011): Divide and Conquer Parallelism with the Fork/Join Framework (prezentacija),<br />

Oracle Java Platform Group,<br />

http://www.oracle.com/us/technologies/java/fork-join-framework-428206.pdf www (kolovoz 2011.)<br />

Oracle priručnici za bazu 11g Release 2 (2009):<br />

16. Oracle Database Concepts<br />

17. Oracle Database PL/SQL Packages and Types Reference<br />

66


Alen Prodan<br />

Login d.o.o.<br />

Mihačeva draga b.b.<br />

51000 Rijeka<br />

+385 91 156 44 68<br />

alen.prodan@login.hr<br />

http://www.login.hr<br />

KORIŠTENJE HISTOGRAMA U OPTIMIZACIJI SQL NAREDBI<br />

OPTIMIZING SQL STATEMENTS WITH HISTOGRAMS<br />

SAŽETAK<br />

Histogrami nadopunjuju raspoložive statistike o tablicama omogućujući detaljniji uvid u distribuciju<br />

vrijednosti podataka pohranjenih u stupcima tablice. Općeniti stav i preporuka je da se histogrami<br />

koriste u slučajevima izrazito neravnomjerne distribucije vrijednosti unutar kolona tablice, što<br />

predstavlja prevladavajući, ali ne i jedini mogući scenarij praktičnog korištenja histograma. Kroz rad<br />

čitatelj upoznaje što su histogrami i kako se generiraju različite vrste histograma,te načine njihove<br />

aplikacije u rješavanju različitih tipova problema optimizacije SQL naredbi.<br />

ABSTRACT<br />

Histograms complement the available table statistics, providing detailed insight into the<br />

distribution of column data.The prevalent and most basic histogram use case scenario is with<br />

nonuniform data distributions.Histograms provide improved selectivity estimates in the presence of<br />

data skew, but besides that, there are more problem types histograms can solve. This paper provides<br />

an overview of histograms, how to build them and how Oracle use them to solve different problem<br />

types.<br />

UVOD<br />

U odsutnosti histograma, CBO ne raspolaže sa informacijom o raspodijeli vrijednosti unutar<br />

kolona pojedine tablice. U takvim okolnostima CBO pretpostavlja ravnomjernu raspodijelu, što znači<br />

da se svaka pojedina vrijednost (distinct value) pojavljuje jednak broj puta. Kod ravnomjerne<br />

raspodijele, CBO izračunava selektivnost filtera „where kolona = konstanta“ kao 1/num_distinct, a<br />

kardinalnost skupa se izračunava kao num_rows/num_distinct. Preciznost kod izračuna selektivnosti i<br />

kardinalnosti izrazito je bitna ne samo za odabir načina pristupa podacima (table/index access path),<br />

već i za određivanje join mehanizma i redoslijeda kojim tablice ulaze u join.<br />

1. VRSTE HISTOGRAMA<br />

Oracle koristi histograme za preciznije izračunavanje selektivnosti i kardinalnosti kod<br />

neravnomjernih distribucija vrijednosti unutar stupaca tablice pri čemu se koriste dva tipa histograma.<br />

Frequency histogram koristi se za skupove koji imaju = num_distinct, a num_distinct


stupac N1, nad kojim je generiran FH histogram. Stupac T1.N1 sadrži retke sa sljedećom<br />

raspodijelom vrijednosti.<br />

Primjer 1. Frequency histogram nad stupcem sa 3 različite (distinct) vrijednosti<br />

VRIJEDNOST ENDPOINT_VALUE ENDPOINT_NUMBER<br />

RAZLIKA<br />

2 2 3 (3-0) = 3<br />

4 4 4 (4-3) = 1<br />

8 8 7 (7-4) = 3<br />

Frequency histogram možemo grafički prikazati na sljedeći način:<br />

Stupci ENDPOINT_VALUE i ENDPOINT_NUMBER predstavljaju vrijednosti iz<br />

USER_TAB_HISTOGRAMS viewa. Stupac RAZLIKA predstavlja frekvenciju pojavnosti svake<br />

pojedine (distinct) vrijednosti (2,4,8) unutar stupca T1.N1. Za uočiti je da se u data dictionary ne<br />

pohranjuje frekvencija za pojedinu vrijednost u obliku [vrijednost, frekvencija], već kumulativni zbroj<br />

(running total). U našem primjeru, postoji (3-0) = 3 retka koja imaju vrijednost 2, zatim (4-3) = 1 redak<br />

za vijednost 4, te (7-4) = 3 retka za vrijednost 8, a kumulativno gledano, u tablici postoji 7 redaka za<br />

koje je T1.N1


Primjer 2. Height balanced histogram bez popularnih vrijednosti<br />

ENDPOINT_VALUE 1 3 6 9<br />

VRIJEDNOST 1 2 3 4 5 6 7 8 9<br />

ENDPOINT_NUMBER 0 1 2 3<br />

RAZLIKA (1–0) = 1 (2-1) = 1 (3-2) = 1<br />

Redak VRIJEDNOST sadrži vrijednosti iz tablice, odnosno vrijednosti za koje se generira<br />

histogram. ENDPOINT_VALUE i ENDPOINT_NUMBER prikazuju vrijednosti iz<br />

USER_TAB_HISTOGRAMS viewa. ENDPOINT_VALUE predstavlja vrijednost u tablici koja se nalazi<br />

na fizičkoj poziciji koja je uzorkovana, dok ENDPOINT_NUMBER predstavlja broj intervala (bucketa).<br />

HB histogramom se retci u pojedinom stupcu mapiraju u mrežu koja se sastoji od N intervala. U<br />

konkretnom slučaju, budući da tablica sadrži 9 redaka, te da je generiran histogram sa 3 intervala<br />

(N=3), svaki od intervala pokriva broj_redaka / N = 3 retka. Granice intervala označene su<br />

podebljanim okomitim linijama, a uzorkovane vrijednosti nalaze se u zasjenjenim stupcima. Redak<br />

RAZLIKA pokazuje da li se neka od vrijednosti (ENDPOINT_VALUE) pojavljuje uzastopno u više od<br />

jednog intervala (RAZLIKA > 1), što bi značilo da se radi o popularnoj vrijednosti.<br />

Na sljedećem primjeru prikazan je slučaj kada se ista vrijednost (ENDPOINT_VALUE) pojavljuje<br />

unutar dva uzastopna uzorkovana intervala.<br />

Primjer 3. Height balanced histogram sa popularnom vrijednosti<br />

ENDPOINT_VALUE 1 3 9 9<br />

VRIJEDNOST 1 2 3 4 9 9 9 9 9<br />

ENDPOINT_NUMBER 0 1 2 3<br />

RAZLIKA (1-0) = 1 (3-1) = 2<br />

Vrijednost 9 uzorkovana je dva puta i to na fizičkim pozicijama 6. i 9. retka. Ipak, u HB histogramu<br />

postoji samo jedan redak za kojega je ENDPOINT_VALUE=9, ali je pripadajući ENDPOINT_NUMBER<br />

povećan, te sada iznosi 2. To je rezultat kompresije koju prilikom kreiranja histograma provodi Oracle.<br />

Kompresija omogućuje da se sa manje fizičkih zapisa (redaka koji čine histogram) opišu vrijednosti u<br />

stupcu tablice. U konkretnom primjeru, jače zatamnjeni stupac na fizičkoj poziciji 6. retka iako<br />

uzorkovan u fazi generiranja histograma, fizički nije direktno zapisan u samu strukturu histograma<br />

zbog prije spomenute kompresije. Vrijednosti koje se u uzorkovanju pojavljuju više od jednom, imaju<br />

vrlo značajnu ulogu, a nazivamo ih popularnim vrijednostima.<br />

1.2.1. Popularnost i uloga New Density formule<br />

Kod HB histograma, popularne su vrijednosti one za koje vrijedi da je (ENDPOINT_NUMBER(n) –<br />

ENDPOINT_NUMBER(n-1)) > 1. Popularne vrijednosti imaju značajne statističke razlike u odnosu na<br />

nepopularne vrijednosti, a to su one vrijednosti za koje vrijedi da je (ENDPOINT_NUMBER(n) –<br />

ENDPOINT_NUMBER(n-1)) = 1. Za popularne vrijednosti frekvencija pojavnosti se prilično precizno<br />

može utvrditi na temelju broja intervala (buckets) u kojima je vrijednost uzorkovana, te na temelju<br />

podatka o broju redaka koje svaki interval sadrži. Za nepopularne vrijednosti to nije moguće. Na<br />

sljedećem grafikonu prikazan je skup od 9 redaka, nad kojima je kreiran HB histogram sa 3 intervala<br />

(bucketa). Na prikazu su zatamnjene pozicije na kojima se pojavljuje ista vrijednost, a razrađeno je 6<br />

mogućih scenarija koji ukazuju na problem određivanja frekvencije pojavnosti nepopularnih vrijednosti.<br />

Frekvencija pojavnosti nepopularnih vrijednosti se može kretati u intervalu od 1 do 2 * N -1, a bez da<br />

se takva vrijednost detektira kao popularna vrijednost u histogramu.<br />

Scenario<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

Intervali (Buckets) za N = 3<br />

0 1 2 3<br />

69


Zbog tog razloga se za izračun frekvencije pojavnosti nepopularnih vrijednosti koristi druga<br />

statistička veličina pod nazivom density. Od verzije 11g baze podataka, CBO ne koristi staru density<br />

vrijednost koju izračunava DBMS_STATS paket i koja je pohranjena u data dictionary, već izračunava<br />

interno novu vrijednost koja je zabilježena u 10053 trace datoteci pod nazivom NewDensity i koja se<br />

koristi za izračun selektivnosti predikata iz WHERE uvjeta SQL naredbi u prisutnosti histograma.<br />

Izračun i korištenje nove density vrijednosti regulirano je skrivenim inicijalizacijskim parametrom<br />

_optimizer_enable_density_improvements. Način izračuna NewDensity vrijednosti i njezine primjene u<br />

izračunu selektivnosti za SQL naredbe koje referenciraju nepopularne vrijednosti prikazane su u<br />

sljedećem primjeru. Tablica T3 sa stupcem N1 sadrži 25 redaka i neravnomjernu raspodijelu<br />

vrijednosti unutar stupca N1. Vrijednosti u stupcu N1 izgledaju kao što slijedi u primjeru 4:<br />

Primjer 4. Izračun i primjena NewDensity vrijednosti za procjenu selektivnost nepopularnih vrijednosti<br />

select n1, count(*)<br />

from t3<br />

group by n1<br />

order by n1;<br />

N1 COUNT(*)<br />

1 4<br />

5 6<br />

6 1<br />

7 1<br />

8 11<br />

9 1<br />

10 1<br />

Nad stupcem N1 generiran je HB histogram sa 5 intervala (bucketa).<br />

ENDPOINT_VALUE ENDPOINT_NUMBER EPn – EPn-1<br />

1 0 0<br />

5 2 2<br />

8 4 2<br />

10 5 1<br />

Distribuciju vrijednosti, alternativno možemo prikazati i na sljedeći način:<br />

EV 1 5 5 8 8 10<br />

V 1 1 1 1 5 5 5 5 5 5 6 7 8 8 8 8 8 8 8 8 8 8 8 9 10<br />

EN 0 1 2 3 4 5<br />

EV = ENDPOINT_VALUE<br />

V = VRIJEDNOST<br />

EN = ENDPOINT_NUMBER<br />

R = RAZLIKA<br />

HB histogram je prepoznao vrijednosti 5 i 8 kao popularne vrijednosti. Vrijednost 1, iako se<br />

pojavljuje 4 puta nije prepoznata kao popularna vrijednost, budući da se sljedeća pozicija uzorkovanja<br />

nalazi na fizičkoj poziciji 5. retka (sortirano), u kojem je vrijednost N1 = 5. Zasjenjeni stupci označavaju<br />

uzorkovane retke. Jače zatamnjeni stupci označavaju retke koji jesu uzorkovani u fazi generiranja<br />

histograma, ali se ne prikazuju u histogramu zbog mehanizma kompresije. U histogramu se vrijednosti<br />

(ENDPOINT_VALUE) 5 i 8 pojavljuju samo jednom, ali im je pripadajuća ENDPOINT_NUMBER<br />

vrijednost 2, što ukazuje da je riječ o popularnim vrijednostima. Iscrtkanom linijom označen je prijelaz<br />

između različitih (distinct) vrijednosti unutar granica pojedinog intervala.<br />

U nastavku slijedi isječak iz trace datoteke generirane sa 10053 eventom za testni SQL upit.<br />

select n1<br />

from t3<br />

where n1 = 1;<br />

70


SINGLE TABLE ACCESS PATH<br />

Single Table Cardinality Estimation for T3[T3]<br />

Column (#1):<br />

NewDensity:0.040000, OldDensity:0.100000 BktCnt:5, PopBktCnt:4, PopValCnt:2, NDV:7<br />

gdje je:<br />

OldDensity stara density vrijednost pohranjena u data dictionary<br />

BktCnt broj intervala (bucketa)<br />

PopBktCnt broj popularnih intervala<br />

PopValCnt broj popularnih vrijednosti<br />

NDV broj različitih vrijednosti (NDV = number of distinct values)<br />

NewDensity se izračunava koristeći sljedeću formulu 1 :<br />

NewDensity = ((BktCnt – PopBktCNt) / BktCnt) / (NDV – PopValCnt)<br />

odnosno, ako uvrstimo gornje vrijednosti dobivamo:<br />

NewDensity = ((5 – 4) / 5) / ( 7 – 2) = 0.2 / 5 = 0.04<br />

Što predstavlja NewDensity formula ? Kada CBO ne raspolaže informacijom o raspodijeli<br />

vrijednosti za pojedinu kolonu, optimizer pretpostavlja da se radi o ravnomjernoj distribuciji. Ukoliko je<br />

nad kolonom tablice generiran HB histogram, konceptualno je moguće podijeliti tablicu u dva<br />

podskupa: popularni i nepopularni. SQL naredba sa filterom “where kolona = konstanta” će selektirati<br />

vrijednosti iz jednog od ta dva skupa. Kada SQL naredba selektira iz popularnog skupa, tada se<br />

density ili pak NewDensity ne koriste, jer je podatak o frekvenciji pojavnosti zapisan u samom HB<br />

histogramu. Međutim, ukoliko bi prethodno opisani SQL zahvaćao podatke iz nepopularnog skupa<br />

tada nam histogram više nije od pomoći. Za nepopularne vrijednosti u tablici distribucija je nepoznata,<br />

pa CBO pretpostavlja ravnomjernu distribuciju. Umnožak broj_redaka * density predstavlja<br />

aproksimaciju prosječne frekvencije pojavnosti svake pojedine vrijednosti koja nije prikazana u<br />

histogramu kao popularna vrijednost. U gornjem primjeru, ako je broj popularnih intervala PopBktCnt =<br />

4, broj popularnih distinct vrijednosti 2, a ukupan broj redaka u tablici iznosi 25, to znači da ukupan<br />

broj nepopularnih redova iznosi (5-4) / 5 = 0.2 * 25 = 5, dok je ukupan broj nepopularnih distinct<br />

vrijednosti 7 – 2 = 5, pa je selektivnost 0.2 / 5 = 0.04, a kardinalnost 0.2 / 5 = 0.04 * 25 = 1.<br />

1.2.2. Stabilnost Height Balanced histograma<br />

Ponekad, čak i male promjene nad tablicom, kao što je dodavanje retka, brisanje retka ili pak<br />

ažuriranje postojećeg retka, mogu uzrokovati nestajanje nepopularnih vrijednosti iz histograma.<br />

Popularne vrijednosti sa druge strane, ponašaju se puno stabilnije, odnosno rjeđe nestaju iz<br />

histograma, iako se može dogoditi da popularna vrijednost postane nepopularna. Npr. promjenimo li<br />

samo jedan redak u tablici iz Primjera 2. za koji je N1 = 9 u N1 = 10, vrijednost 9 prestaje biti<br />

popularna vrijednost:<br />

VRIJEDNOST ENDPOINT_VALUE ENDPOINT_NUMBER<br />

RAZLIKA<br />

1 1 0<br />

2 2<br />

3 3 1 (1 – 0) = 1<br />

4 4<br />

9 9<br />

9 9 2 (2 -1 ) = 1<br />

9 9<br />

9 9<br />

10 10 3 (3 – 2) = 1<br />

1 [Dell’Era, New Density calculation in 11g]<br />

71


Takav oblik nestabilnosti karakterističan je samo za HB histograme, budući da se kod FH histograma<br />

mapa vrijednosti gradi zbrajajući frekvencije pojavnosti za svaku pojedinu (distinct) vrijednost u stupcu<br />

tablice, za razliku od HB kod kojih se mapa vrijednosti gradi na temelju uzorkovanja, pa struktura<br />

histograma zavisi o tome na kojem će se mjestu nalaziti granice intervala (bucketa).<br />

2. SPECIFIČNE PRIMJENE HISTOGRAMA<br />

Primjena histograma nije limitirana isključivo na precizniji izračun selektivnosti i kardinalnosti kod<br />

neravnomjernih raspodijela vrijednosti, te posljedično na primjereniji izbor načina pristupa podacima<br />

(access path), join mehanizma i redoslijeda međusobnog vezivanja tablica putem join mehanizma.<br />

Histogrami mogu pomoći i u procjeni selektivnosti kod korištenja neprimjerenih tipova podataka ali i<br />

kod pojave ekstremnih vrijednosti u inače savršeno ravnomjernoj raspodijeli vrijednosti 2 .<br />

Pretpostavimo sljedeći slučaj, u kojem se neprimjereno koristi number tip podatka za pohranu<br />

datumskih vrijednosti, umjesto da se za iste koristi propisani date tip. Za potrebe testa, pripremiti ćemo<br />

tablicu sa podacima za interval od 01.12.2010 do 01.01.2011. (32 retka). Tablica sadrži dva stupca, a<br />

u oba stupca su unešene iste datumske vrijednosti u intervalu od 01.12.2010 do 01.01.2011, uz<br />

razliku da se u stupcu D vrijednosti pohranjuju koristeći nativni date tip, dok se u stupcu N vrijednosti<br />

pohranjuju koristeći number tip. Sa DBMS_STATS paketom, prikupiti će se statistike, ali bez<br />

histograma (SIZE 1).<br />

create table t<br />

as<br />

select to_date('01.12.2010', 'dd.mm.yyyy')+rownum-1 d,<br />

to_number(to_char(to_date('01.12.2010', 'dd.mm.yyyy')+rownum-1, 'yyyymmdd')) n<br />

from dual<br />

connect by level 'FOR ALL COLUMNS SIZE 1' );<br />

SQL upitom selektirati ćemo retke iz tablice za razdoblje od 31.12.2010 do 01.01.2011, prvo za stupac<br />

D – nativni date tip:<br />

select d, n<br />

from t_dtype<br />

where d between to_date('31.12.2010', 'dd.mm.yyyy') and to_date('01.01.2011', 'dd.mm.yyyy')<br />

D N<br />

-------- ----------<br />

31.12.10 20101231<br />

01.01.11 20110101<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 696206505<br />

-----------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

-----------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 2 | 28 | 2 (0)| 00:00:01 |<br />

|* 1 | TABLE ACCESS FULL| T_DTYPE | 2 | 28 | 2 (0)| 00:00:01 |<br />

-----------------------------------------------------------------------------<br />

Očekivano, upit je vratio dva retka, a procjena optimizera bila je vrlo precizna. Ponovimo li isti upit<br />

postavljajući filter nad N kolonu, odnosno number tip, dobivamo sljedeći rezultat:<br />

2 [J. Lewis: CBO Fundamentals, Apress, 2006]<br />

72


select d, n<br />

from t_dtype<br />

where n between 20101231 and 20110101<br />

D N<br />

-------- ----------<br />

31.12.10 20101231<br />

01.01.11 20110101<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 696206505<br />

-----------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

-----------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 32 | 448 | 2 (0)| 00:00:01 |<br />

|* 1 | TABLE ACCESS FULL| T_DTYPE | 32 | 448 | 2 (0)| 00:00:01 |<br />

-----------------------------------------------------------------------------<br />

Upit je vratio ista dva retka, međutim izračunata selektivnost drastično odstupa od stvarnog<br />

stanja. Zašto dolazi do krive procjene ? Zbog pogrešnog korištenja number tipa za pohranu datumskih<br />

vrijednosti, Oracle ne razumije da su zapravo 20121231 i 20110101 u kalendarskom smislu dvije<br />

uzastopne vrijednosti. Numerički, traženi raspon vrijednosti iznosi 20110101 – 20101231 = 8870, dok<br />

ukupni rang vrijednosti (max – min) iznosi 20110101 – 20101201 = 8900. Već parcijalnim izračunom<br />

vidljivo je da optimizer procjenjuje selektivnost kao 8870 / 8900 = 99.6% redaka u tablici, a to u našem<br />

slučaju iznosi 32 retka. Generiranjem HB histograma sa 20 intervala (bucketa) nad N stupcem,<br />

ponavljamo isti SQL upit, ali ovoga puta je selektivnost preciznije izračunata, budući da uz pomoć<br />

histograma optimizer zna da svaki interval (bucket) u prosjeku ima 32 / 20 = 1.6 redaka.<br />

D N<br />

-------- ----------<br />

31.12.10 20101231<br />

01.01.11 20110101<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 696206505<br />

-----------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

-----------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 2 | 28 | 2 (0)| 00:00:01 |<br />

|* 1 | TABLE ACCESS FULL| T_DTYPE | 2 | 28 | 2 (0)| 00:00:01 |<br />

-----------------------------------------------------------------------------<br />

Drugi zanimljivi primjer korištenja histograma, odnosi se na slučaj u kojem histogram pomaže pri<br />

izračunu selektivnosti za nizove vrijednosti unutar kojih se pojavljuju ekstremi. Pretpostavimo tablicu<br />

koja u sebi sadrži 365 redaka, odnosno po jedan redak za svaki dan u 2010. godini. Nadalje,<br />

pretpostavimo da se nakon uspješnog procesiranja slogovi ne brišu iz tablice, već se u stupcu datum,<br />

vrijednost datuma postavlja na 01.01.1970 i na takav način diferencira procesirane od neprocesiranih<br />

redaka. Efekt će biti prikazan na primjeru.<br />

create table t_eks<br />

as<br />

select to_date('01.01.2010', 'dd.mm.yyyy')+rownum-1 d<br />

from dual<br />

connect by level 'FOR ALL COLUMNS SIZE 1' );<br />

73


Nakon kreiranja tablice i prikupljanja statistika, za početak bez histograma, iz tablice će biti selektirani<br />

podaci za 12/2010.<br />

select count(*)<br />

from t_eks<br />

where d between<br />

to_date('01.12.2010' , 'dd.mm.yyyy') and to_date('31.12.2010' , 'dd.mm.yyyy')<br />

COUNT(*)<br />

----------<br />

31<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 2718855673<br />

----------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

----------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 1 | 8 | 2 (0)| 00:00:01 |<br />

| 1 | SORT AGGREGATE | | 1 | 8 | | |<br />

|* 2 | TABLE ACCESS FULL| T_EKS | 31 | 248 | 2 (0)| 00:00:01 |<br />

----------------------------------------------------------------------------<br />

Očekivano, SQL upit je vratio 31 redak, a optimizer je također ispravno procjenio selektivnost. Sada<br />

ćemo jedan od redaka ažurirati na vrijednost 01.01.1970, te osvježiti statistike, ali ponovno bez<br />

generiranja histograma:<br />

update t_eks set d = to_date('01.01.1970', 'dd.mm.yyyy') where rownum = 1;<br />

commit;<br />

exec dbms_stats.gather_table_stats(user, 'T_EKS', method_opt=>'FOR COLUMNS D SIZE 1');<br />

Upit je vratio očekivanih 31 redak, međutim, procjenjena selektivnost u planu izvršavanja sada<br />

dramatično odstupa:<br />

COUNT(*)<br />

----------<br />

31<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 2718855673<br />

----------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

----------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 1 | 8 | 2 (0)| 00:00:01 |<br />

| 1 | SORT AGGREGATE | | 1 | 8 | | |<br />

|* 2 | TABLE ACCESS FULL| T_EKS | 2 | 16 | 2 (0)| 00:00:01 |<br />

----------------------------------------------------------------------------<br />

Razlog je u tome što Oracle izračunava selektivnost “between“ ranga vrijednosti na sljedeći način:<br />

(željeni rang vrijednosti) / (ukupni rang vrijednost) + 2/num_distinct<br />

što u prvom slučaju iznosi:<br />

(31.12.2010 – 01.12.2010) / (31.12.2010 – 01.01.2010) + 2/365 = 30 / 364 + 2/365 = 0.0879 *<br />

365 = 32<br />

74


Nakon ažuriranja jednog od redaka, došlo je do promjene minimalne vrijednosti unutar stupca, te<br />

dramatičnog povećanja ukupnog raspona vrijednosti (max – min vrijednost). Ukupni raspon vrijednosti<br />

povećan je sa 364 na 14974, što znači da prema prije navedenoj formuli selektivnost iznosi:<br />

(31.12.2010 – 01.12.2010) / (31.12.2010 – 01.01.1970) + 2/365 = 30 / 14974 + 2/365 =<br />

0.00748 *365 = 2<br />

Kreiranjem histograma, traženi interval se ne aplicira više na cijeli rang vrijednosti unutar kolone<br />

tablice, već samo na raspon vrijednosti jednog ili više intervala koji obuhvaćaju tražene vrijednosti, u<br />

našem slučaju riječ je o intervalu broj 2. Rezultat je dramatično povećana preciznost izračuna<br />

selektivnosti.<br />

ENDPOINT ENDPOINT_NUMBER WIDTH HEIGHT<br />

-------- --------------- ---------- ----------<br />

01.01.70 0<br />

02.07.10 1 14792 ,0022<br />

31.12.10 2 182 ,1758<br />

Uz prisutnost histograma, selektivnost traženog ranga vrijednosti se izračunava na sljedeći način:<br />

(31.12.2010 – 01.12.2010) / (31.12.2010 – 02.07.2010) + 2 * density = 30 / 182 + 2 *<br />

0.002739726 = 0.164835 * 182 = 31.<br />

Ponovimo li prijašnji upit, možemo vidjeti da je uz pomoć histograma ponovno točno procjenjena<br />

selektivnost.<br />

select count(*)<br />

from t_eks<br />

where d between<br />

to_date('01.12.2010' , 'dd.mm.yyyy') and to_date('31.12.2010' , 'dd.mm.yyyy')<br />

COUNT(*)<br />

----------<br />

31<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 2718855673<br />

----------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

----------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 1 | 8 | 2 (0)| 00:00:01 |<br />

| 1 | SORT AGGREGATE | | 1 | 8 | | |<br />

|* 2 | TABLE ACCESS FULL| T_EKS | 30 | 240 | 2 (0)| 00:00:01 |<br />

----------------------------------------------------------------------------<br />

3. IZRADA VLASTITOG FREQUENCY HISTOGRAMA<br />

Za stupce koji sadržavaju više od 254 različitih (distinct) vrijednosti, nije moguće generirati<br />

precizan Frequency histogram. U takvim okolnostima koristi se Height balanced histogram čiji je glavni<br />

nedostatak smanjena preciznost kojom se opisuju podaci u tablici. Moguće je da određene retke sa<br />

visokom frekvencijom pojavnosti Oracle ne detektira kao popularne vrijednosti prilikom kreiranja<br />

histograma. Ukoliko korisnici sustava učestalo pretražuju slogove koji sadržavaju te vrijednosti važno<br />

je postići dobru procjenu selektivnosti, jer je to temelj za formiranje kvalitetnih planova izvršavanja.<br />

Izradom vlastitog Frequency histograma moguće je detaljnije opisati popularne vrijednosti i postići<br />

bolju procjenu selektivnosti, a samim time i kvalitetnije planove izvršavanja. Postupak će biti prikazan<br />

na sljedećem primjeru. Koristeći sljedeću SQL naredbu, kreirana je tablica sa 100000 redaka i sa<br />

100000 različitih (distinct) vrijednost u stupcu N1.<br />

75


create table t4<br />

as<br />

select<br />

rownum n1<br />

from dual<br />

connect by level


declare<br />

l_statrec DBMS_STATS.statrec;<br />

l_val_array DBMS_STATS.numarray;<br />

l_distcnt number;<br />

l_density number;<br />

l_nullcnt number;<br />

l_avgclen number;<br />

begin<br />

dbms_stats.get_column_stats(<br />

ownname=>user,<br />

tabname=>'T4',<br />

colname=>'N1',<br />

distcnt=> l_distcnt,<br />

density=> l_density,<br />

nullcnt=> l_nullcnt,<br />

srec => l_statrec,<br />

avgclen => l_avgclen<br />

);<br />

select n1, c<br />

bulk collect into l_val_array, l_statrec.bkvals<br />

from<br />

(<br />

select n1, c<br />

from<br />

(<br />

select n1, count(*) c<br />

from t4<br />

group by n1<br />

order by c desc<br />

)<br />

where rownum l_statrec,<br />

numvals=>l_val_array<br />

);<br />

select 1/(2*count(*)) into l_density from t4;<br />

dbms_stats.set_column_stats(<br />

ownname=>user,<br />

tabname=>'T4',<br />

colname=>'N1',<br />

distcnt=> l_distcnt,<br />

density => l_density,<br />

nullcnt => l_nullcnt,<br />

srec => l_statrec,<br />

avgclen => l_avgclen<br />

);<br />

END;<br />

77


Analizirajući generirani FH histogram, vidimo da su ovog puta popularne vrijednosti zabilježene kao<br />

takve i u samom histogramu, što je vidljivo iz sljedećeg isječka histograma:<br />

ENDPOINT_VALUE ENDPOINT_NUMBER<br />

-------------- ---------------<br />

... ...<br />

98 196<br />

99 198<br />

100 300<br />

123 301<br />

200 502<br />

300 803<br />

400 1204<br />

500 1705<br />

... ....<br />

Ponovimo li prethodni upit nad tablicom iz primjera, vidimo da sada plan izvršavanja prijavljuje da će<br />

sustav vratiti 104 retka, što je vrlo precizna procjena, s obzirom da u tablici postoje 102 retka, za koje<br />

je N1=100.<br />

select n1 from t4 where n1 = 100<br />

Execution Plan<br />

----------------------------------------------------------<br />

Plan hash value: 2560505625<br />

--------------------------------------------------------------------------<br />

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />

--------------------------------------------------------------------------<br />

| 0 | SELECT STATEMENT | | 104 | 520 | 45 (3)| 00:00:01 |<br />

|* 1 | TABLE ACCESS FULL| T4 | 104 | 520 | 45 (3)| 00:00:01 |<br />

--------------------------------------------------------------------------<br />

ZAKLJUČAK<br />

Histogrami predstavljaju moćan alat za rješavanje određenih tipova problema optimizacije SQL<br />

naredbi. Primjena histograma nije nužno vezana isključivo uz tradicionalne probleme optimizacije SQL<br />

naredbi kod neravnomjernih raspodijela vrijednosti unutar stupaca tablice, već je moguća za<br />

rješavanje određenih specifičnih situacija, kao što je pojava ekstremnih vrijednosti u normalnim<br />

raspodijelama vrijednosti ili neprimjerenog korištenja tipova podataka. Stupci sa manje od 255<br />

različitih (distinct) vrijednosti su dobri kandidati za generiranje preciznih Frequency histograma, dok je<br />

za stupce sa više od 255 vrijednost, potrebno izgraditi Height balanced histogram ili u ekstremnih<br />

slučajevima, pribjeći izradi vlastitog Frequency histograma za najpopularnije vrijednosti u tablici.<br />

LITERATURA<br />

Lewis, Jonathan: Cost Based Oracle Fundamentals, 2006.<br />

Dell'Era, Alberto: New Density calculation in 11g, 2007.; Join Over Histogram, 2007.<br />

78


KRIPTOGRAFIJA U ORACLE BAZI<br />

Zlatko Sirotić<br />

Istra informatički inženjering d.o.o., Pula<br />

e-mail: zlatko.sirotic@iii.hr<br />

SAŽETAK<br />

U radu se prvo prikazuju osnove kriptografije. Prikazuje se razlika između simetričnih kriptosustava<br />

(koji koriste isti ključ u procesu kriptiranja i procesu dekriptiranja) i asimetričnih kriptosustava<br />

(kriptosustava s javnim ključem). Nešto detaljnije se prikazuje asimetrični kriptosustav RSA. Zatim se<br />

prikazuje upotreba kriptografije u Oracle bazi. U prilogu se prikazuje matematička osnova kriptosustava<br />

RSA, te njegova programska realizacija (za prezentacijske svrhe).<br />

The paper presents the basics of cryptography. Furthermore, it shows the difference between the<br />

symmetric cryptosystem (which uses the same key in the encryption and decryption process) and<br />

asymmetric cryptosystem (cryptosystem with public key). The asymmetric cryptosystem RSA is explained<br />

in detail, as it is the use of cryptography in the Oracle database. The appendix shows the mathematical<br />

basis of the RSA cryptosystem and the implementation of its software (for presentation purposes).<br />

UVOD<br />

Sve do kraja 60-tih godina prošlog stoljeća, kriptografija se uglavnom koristila u vojne i diplomatske<br />

svrhe. Tada je došlo do širokog razvoja međunarodnih financijskih transakcija, pa se pojavila potreba za<br />

kriptosustavima koje će moći koristiti korisnici širom svijeta. Zato su uvedeni međunarodni standardi u<br />

kriptografiji. Prvo su uvedeni simetrični kriptosustavi, koji koriste isti ključ i u procesu kriptiranja i u<br />

procesu dekriptiranja, što znači da je ključ poznat i pošiljatelju i primatelju poruke (i samo njima). Kasnije<br />

su razvijeni asimetrični kriptosustavi (ili kriptosustavi s javnim ključem).<br />

U radu se prvo prikazuju sigurnosne osobine poruka (informacija). Zatim se ukratko prikazuju<br />

simetrični i asimetrični kriptosustavi. Iako Oracle baza podataka za sada izravno ne koristi asimetrične<br />

kriptosustave, u nastavku se nešto detaljnije prikazuje najčešće korišteni asimetrični kriptosustav RSA. U<br />

prilozima se daju i neki matematički pojmovi vezani za RSA kriptosustav, te prezentacijska realizacija<br />

RSA kriptosusava u Oracle Forms alatu.<br />

U nastavku se prikazuje korištenje kriptografije u Oracle bazi. Kao kod svih baza, tako i kod Oracle<br />

baze postoje dvije glavne vrste kriptiranja podataka – kriptiranje podataka koji su u tranzitu (data in<br />

transit) i kriptiranje podataka koji stoje (data at rest), a kod potonjih se uglavnom radi o podacima baze<br />

podataka koji se nalaze na diskovima. Kriptiranje podataka koji stoje radi se u Oracle bazi isključivo<br />

pomoću simetrične kriptografije, a moguće je primjenjivati "ručnu" metodu, tj. programiranje pomoću<br />

paketa DBMS_CRYPTO, ili dvije metode koje čine tzv. transparentnu enkripciju podataka (Transparent<br />

Data Encription, DTE): TDE Column Encryption i TDE Tablespace Encryption.<br />

1. SIGURNOSNE OSOBINE PORUKA (INFORMACIJA)<br />

Sigurnost računalnih komunikacija ovisi o sljedećim sigurnosnim osobinama poruka (informacija) ili,<br />

drugačije rečeno, o sljedećim zahtjevima nad porukama (informacijama):<br />

- povjerljivost (tajnost, privatnost, engl. confidentiality): poruku (informaciju) koju osoba A<br />

šalje osobi B ne može pročitati nitko treći;<br />

- integritet (besprijekornost, netaknutost, engl. integrity): osoba B je sigurna da poruka<br />

(informacija) koju je poslala osoba A nije promijenjena (od neke treće osobe);<br />

- raspoloživost (engl. availability): poruke (informacije) moraju uvijek biti na raspolaganju<br />

ovlaštenim osobama, unatoč mogućim nepogodama / nesrećama ili zlonamjernim napadima;<br />

79


- autentičnost (vjerodostojnost, engl. authenticity): osoba B zna da je samo osoba A mogla<br />

poslati poruku koju je ona (osoba B) primila;<br />

- neporecivost (nepobitnost, ne-nepriznavanje, engl. non-repudiation): osoba A ne može<br />

zanijekati da je poslala poruku koju je osoba B primila (ako ju zaista poslala).<br />

Može se napomenuti sljedeće:<br />

- prva tri zahtjeva (povjerljivost, integritet, raspoloživost) se često smatraju osnovnim<br />

zahtjevima;<br />

- raspoloživost se ne može povećati pomoću kriptografije, čak se ponekad može i smanjiti<br />

(kriptiranje i dekriptiranje poruka traje neko vrijeme);<br />

- često se navodi i šesti zahtjev, autorizacija (engl. authorization): autentificirani korisnik može<br />

pristupati samo sadržajima koji su mu dopušteni, i to na način koji mu je dopušten;<br />

autorizacijom se dodatno osiguravaju povjerljivost i/ili integritet; autorizacija se ne rješava<br />

(direktno) pomoću kriptografije;<br />

- zahtjev autentičnosti i neporecivosti (poruke) izgledaju slično, pa se može činiti da su<br />

ekvivalentni; no, autentičnost ne implicira neporecivost, jer bi npr. osoba B mogla sama sebi<br />

poslati poruku kriptiranu simetričnim ključem i tvrditi da je poruku poslala osoba A (koja<br />

jedina, uz osobu B, zna taj ključ); no, ako se primjenjuje asimetrični kriptosustav, onda osoba<br />

B ne može sama sebi poslati kriptiranu poruku u ime osobe A (jer samo osoba A ima tajni<br />

ključ) i može se sigurno tvrditi da je to poruka od osobe A; s druge strane, neporecivost ne<br />

implicira autentičnost, jer se osoba C može lažno predstaviti kao da je osoba A i koristiti svoj<br />

javni i privatni ključ (C može znati javni ključ osobe A, ali ne može znati tajni ključ osobe A).<br />

Drži se da je zahtjev neporecivosti (poruke) jedini zahtjev koji se ne može elegantno riješiti pomoću<br />

simetričnih kriptosustava. No, asimetrični kriptosustavi puno su pogodniji i za rješavanje zahtjeva<br />

integriteta i autentičnosti. S druge strane, zahtjev povjerljivosti (naročito kod velikih poruka) najčešće se<br />

rješava pomoću simetričnih kriptosustava, koji su puno brži i traže ključeve manjih veličina (za istu razinu<br />

sigurnosti) u odnosu na asimetrične kriptosustave. Kod zahtjeva povjerljivosti, asimetrični kriptosustavi se<br />

najčešće koriste samo za razmjenu simetričnog ključa (kojim će se kriptirati poruka i osigurati njena<br />

povjerljivost).<br />

2. SIMETRIČNI I ASIMETRIČNI KRIPTOSUSTAVI<br />

Do kraja 60-tih godina prošlog stoljeća glavna primjena kriptografije bila je u vojne i diplomatske<br />

svrhe, pa su pojedine države (ili čak organizacije) imale svoje specifične kriptosustave. No, tada je došlo<br />

do širokog razvoja međunarodnih financijskih transakcija, pa se pojavila potreba za kriptosustavima koje<br />

će moći koristiti korisnici širom svijeta, tj. pojavila se potreba uvođenja (međunarodnih) standarda u<br />

kriptografiji.<br />

Na temelju programa i javnog natječaja za zaštitu računalnih i komunikacijskih podataka koji je<br />

1972./73. inicirao američki National Bureau of Standard (NBS), 1976. je prihvaćen kao standard<br />

kriptosustav koji je dobio ime Data Encryption Standard (DES), a koristi 56-bitne ključeve. Taj je standard<br />

bio u širokoj upotrebi sve do kraja 20. stoljeća (iako se koristi i danas), ali je već početkom 90-tih godina<br />

postalo jasno da je samo pitanje vremena kad će DES postati nesiguran, što se prvi put javno pokazalo<br />

1998. godine. Zato je 1997. godine National Institute of Standards and Technology (NIST), organizacija<br />

koja je naslijedila NBS, raspisala natječaj za kriptosustav koji će naslijediti DES. Kao privremeni standard<br />

određen je prošireni DES standard imena 3DES (trostruki DES), koji koristi 168-bitne ključeve. Nasljednik<br />

DES-a izabran je 2000. godine i dobio je ime Advanced Encryption Standard (AES), a koristi 128, 192, ili<br />

256-bitne ključeve.<br />

Navedeni kriptosustavi su simetrični kriptosustavi, tj. koriste isti ključ i u procesu kriptiranja<br />

(enkripcije, šifriranja) i u procesu dekriptiranja (dekripcije, dešifriranja), što znači da je ključ poznat i<br />

pošiljatelju i primatelju poruke (i samo njima). No, taj simetrični ključ ima manu da se mora (na siguran<br />

način) razmijeniti među sudionicima u komunikaciji, što nije veliki problem kod zatvorenih sustava s malim<br />

brojem sudionika u komunikaciji, ali je problem kod današnjih otvorenih sustava s nepoznatim i velikim<br />

brojem sudionika. Zato su razvijeni asimetrični kriptosustavi (ili kriptosustavi s javnim ključem).<br />

Glavna ideja je da se konstruiraju kriptosustavi kod kojih je na temelju poznavanja funkcije kriptiranja<br />

praktički nemoguće izračunati funkciju dekriptiranja. Svaki sudionik u komuniciranju ima svoj javni ključ,<br />

80


koji može biti poznat svima, i svoj tajni ključ, koji je poznat samo njemu. Kriptiranje se radi javnim ključem<br />

primatelja, a dekriptiranje tajnim ključem primatelja (kod digitalnog potpisa je drugačije!), tako da samo<br />

primatelj može pročitati poruku. Asimetrični kriptosustavi nisu zamjena za simetrične, već jedni druge<br />

nadopunjuju, čime se dobivaju hibridni kriptosustavi.<br />

Može se dati ovakva usporedba između simetričnih kriptosustava (SK) i asimetričnih kriptosustava<br />

(AK):<br />

- sigurnost: kod AK, samo privatni ključ mora biti tajan, a javni ključ se može slobodno<br />

distribuirati; kod SK, zajednički (simetrični) ključ mora biti poznat dvjema (ili više) sudionicima<br />

u komunikaciji; nije dokazano da su AK sigurni, ali isto vrijedi i za SK, osim u slučaju kada se<br />

simetrični ključ upotrebljava samo jedanput;<br />

- dugotrajnost ključa: kod AK, isti par ključeva se može koristiti dugo vremena, a kod SK je<br />

poželjno mijenjati ključ kod svake sesije;<br />

- upravljanje ključevima (engl. key management): ako je n broj sudionika u međusobnoj<br />

komunikaciji, SK traži ukupno n * (n – 1) / 2 ključeva, pri čemu svaki sudionik mora kod sebe<br />

pamtiti (n – 1) ključ; kod AK, treba ukupno n javnih ključeva, koji se mogu slobodno pohraniti<br />

na nekom pristupačnom mjestu (bazi javnih ključeva), a svaki sudionik mora pamtiti samo<br />

svoj tajni ključ (u pravilu pamti i svoj javni ključ, da ne mora za njega pristupati bazi);<br />

- razmjena ključeva: kod AK se ne moraju razmjenjivati ključevi između sudionika; razmjena<br />

ključeva kod SK je obavezna; budući da je to opasno, upravo se AK koristi za sigurnu<br />

razmjenu simetričnog ključa, čime se onda omogućava SK (zajedno je to hibridni<br />

kriptosustav);<br />

- efikasnost: AK su značajno sporiji od SK; npr. RSA kriptosustav je oko 1000 puta sporiji od<br />

DES kriptosustava;<br />

- veličina ključeva: ključevi za AK su značajno veći od ključeva za SK (za istu razinu<br />

sigurnosti); npr. privatni ključ u RSA mora imati barem 1024 bita, dok je kod većine SK 128<br />

bitova dovoljno.<br />

U nastavku su dati neki vrlo važni pojmovi kod primjene asimetričnih kriptosustava (primjenjuju se<br />

samostalno, ili zajedno sa simetričnim kriptosustavima).<br />

Sažetak (hash, digest): za razliku od funkcije kriptiranja, koja je matematički gledano injektivna<br />

funkcija, tj. funkcija koja dva različita X-a preslikava u dva različita Y-a, funkcija sažetka može preslikavati<br />

više X-eva u isti Y, što znači da nema inverznu funkciju. Koristi se kao pomoćno sredstvo, npr. kod<br />

spremanja hash-a lozinki (umjesto samih lozinki) u bazu podataka, kod digitalnog potpisa i dr.<br />

Digitalna omotnica: njome se postiže povjerljivost poruke. Za to bi se mogli koristiti i samo<br />

simetrični ključevi. No, budući da je razmjena nekriptiranih simetričnih ključeva opasna, pošiljatelj kreira<br />

novi simetrični ključ (samo za tu sesiju), pomoću tog ključa kriptira izvornu poruku, a onda simetrični ključ<br />

kriptira pomoću javnog ključa primatelja, te onda šalje oboje - poruku kriptiranu simetričnim ključem i<br />

kriptirani simetrični ključ. Primatelj prvo dekriptira kriptirani simetrični ključ (svojim tajnim ključem, što<br />

znači da samo on to može napraviti), a onda tako dobivenim simetričnim ključem dekriptira izvornu<br />

poruku. Navedeno je prikazano na slici 1.<br />

Digitalni potpis: njime se postiže integritet i neporecivost poruke. Pošiljatelj uz izvornu<br />

(nekriptiranu) poruku šalje i izvornu poruku kriptiranu pomoću svog tajnog ključa (suprotno od uobičajene<br />

sheme asimetričnog kriptiranja, npr. one kod digitalne omotnice!). Primatelj pomoću javnog ključa<br />

pošiljatelja dekriptira poruku i uspoređuje ju s izvornom. Budući da samo pošiljatelj zna svoj privatni ključ,<br />

osiguran je integritet i neporecivost poruke. Zapravo, u praksi se najčešće ne kriptira izvorna poruka, već<br />

sažetak (hash) izvorne poruke, a razlozi su (barem) sljedeći: sažetak je kraći od izvorne poruke, pa se<br />

brže kriptira/dekriptira (važno je, jer su asimetrični kriptosustavi spori), ukupna poruka je kraća, izvorna<br />

poruka se može isto kriptirati (što onda čini digitalni pečat). U ovoj varijanti primatelj uspoređuje dobiveni<br />

sažetak s onim koji sam izračunava, kako je prikazano na slici 2.<br />

81


Slika 1. Digitalna omotnica; Izvor [8]<br />

Slika 2. Digitalni potpis; Izvor [8]<br />

Digitalni pečat: njime se postiže povjerljivost, integritet i neporecivost poruke. Digitalni pečat je<br />

kombinacija digitalne omotnice i digitalnog potpisa, tj. digitalni pečat je digitalno potpisana digitalna<br />

omotnica.<br />

Digitalni certifikat: njime se postiže autentičnost poruke. Digitalni certifikat je (specijalna) poruka<br />

koja je (najčešće) digitalno potpisana od certifikacijskog centra (engl. Certification Authority, CA), kome<br />

se po definiciji vjeruje. Ta (specijalna) poruka sadrži barem par podataka - identifikator i javni ključ<br />

pošiljatelja. U praksi certifikat obično sadrži i podatak o roku valjanosti, primijenjenim algoritmima za<br />

sažimanje i kriptiranje kod potpisivanja, i dr. Pomoću digitalnog certifikata primatelj može provjeriti da li je<br />

dobiveni (od nekog pošiljatelja) javni ključ jednak onome koji piše u digitalnom certifikatu, tj. da li je<br />

pošiljatelj autentičan (onaj kojim se predstavlja).<br />

82


3. OPIS RSA KRIPTOSUSTAVA<br />

Diffie-Hellmanov postupak za razmjenu tajnog ključa<br />

Iako je RSA prvi kriptosustav s javnim ključem (objavljen 1977. godine), začetnicima kriptografije<br />

javnog ključa smatraju se Diffie i Hellman, koji su 1976. godine objavili postupak (protokol) za razmjenu<br />

tajnog (simetričnog) ključa. Njihov postupak, iako služi za sigurnu razmjenu simetričnog ključa (tj. kod<br />

njihovog postupka se ne radi o javnim i tajnim ključevima, odnosno asimetričnom kriptosustavu), dao je<br />

ključnu ideju za realizaciju kriptosustava s javnim ključem – ideju da se konstruiraju kriptosustavi kod<br />

kojih bi iz poznavanja funkcije kodiranja bilo praktički nemoguće (u nekom razumnom vremenu) izračunati<br />

funkciju dekodiranja. Tada bi funkcija kodiranja mogla biti javna.<br />

Diffie-Hellman postupak za razmjenu ključeva zasnovan je na činjenici da je u nekim grupama<br />

potenciranje puno jednostavnije od logaritmiranja (problem diskretnog logaritma).<br />

Kriptosustavi s javnim ključem i RSA kriptosustav<br />

U kriptosustavu s javnim ključem svaki korisnik ima dva ključa: javni E K i tajni K D (slova E i D<br />

označavaju glavnu namjenu tih ključeva: Enkripcija i Dekripcija). Ako Ana želi poslati Branku poruku P,<br />

onda je ona kodira pomoću Brankovog javnog ključa K EB i pošalje Branku šifrat C:<br />

C = E(<br />

P,<br />

K EB)<br />

.<br />

Branko dekodira šifrat koristeći svoj tajni ključ K DB :<br />

P = D(<br />

C,<br />

K DB)<br />

tj.<br />

P = D(<br />

E(<br />

P,<br />

K EB),<br />

K DB)<br />

.<br />

Napomena: u engleskoj literaturi uobičajena imena za glavne sudionike u komunikaciju su Alice i<br />

Bob (kod nas Ana i Branko), a ti su likovi uvedeni upravo u prvom radu o RSA kriptosustavu.<br />

RSA je prvi i najpoznatiji kriptosustav s javnim ključem, objavljen 1977. godine, a nazvan je po<br />

svojim tvorcima Ronaldu Rivestu, Adi Shamiru i Leonardu Adlemanu. Njegova sigurnost je zasnovana<br />

prvenstveno na teškoći faktorizacije velikih prirodnih brojeva. No, otvoreno je pitanje je li razbijanje RSA<br />

kriptosustava, tj. određivanje x iz poznavanja x n<br />

e mod ekvivalentno faktorizaciji od n.<br />

Postupak izgradnje RSA kriptosustava<br />

1. Odaberu se dva tajna velika prosta broja p i q, svaki veličine barem 512 bitova (a<br />

preporučljivo je i 1024).<br />

2. Izračunava se umnožak n = p q.<br />

3. Izračunava se umnožak ϕ(n) = (p – 1) (q – 1).<br />

4. Odabere se broj e < ϕ(n) i relativno prost u odnosu na ϕ(n),<br />

tj. takav da je nzd (e, ϕ(n)) = 1.<br />

5. Izračunava se broj d < ϕ(n) tako da bude:<br />

e d ≡ 1 (mod ϕ(n)),<br />

što se može napisati i kao:<br />

e d ≡ k ϕ(n) + 1<br />

(može se primijetiti da zato što su broj e i umnožak e d relativno prosti u odnosu na ϕ(n),<br />

automatski je i broj d relativno prost u odnosu na ϕ(n)).<br />

6. Brojevi e i n se obznanjuju i čine javni ključ.<br />

7. Brojevi p, q, d su tajni, pri čemu je d tajni ključ (zajedno sa n, koji je javno poznat).<br />

83


Kriptiranje se obavlja funkcijom kriptiranja:<br />

e<br />

C = E(<br />

P,<br />

K ) = RSA(<br />

P,<br />

K ) = P mod n,<br />

E<br />

a dekriptiranje funkcijom dekriptiranja:<br />

P = D(<br />

C,<br />

K<br />

D<br />

) =<br />

RSA<br />

−1<br />

( C,<br />

E<br />

K<br />

D<br />

) = C<br />

d<br />

e<br />

d<br />

mod n = ( P mod n)<br />

mod n = P<br />

U nastavku se pokazuje da je taj postupak korektan, tj. da je:<br />

P P (mod n)<br />

ed ≡ .<br />

ed<br />

mod n<br />

Zapravo, mora se primijetiti da je navedeni postupak korektan samo ako je veličina poruke P manja<br />

od n. Ako je poruka P ≥ n (što je u pravilu često), onda se izvorna poruka P razbija na poruke<br />

od kojih je svaka manja od n, te se svaka zasebno kriptira i dekriptira.<br />

P P ,..., P<br />

1,<br />

2<br />

r<br />

Provjera korektnosti RSA kriptosustava<br />

Treba pokazati da je:<br />

P P (modn)<br />

ed ≡ .<br />

Budući da je:<br />

e d ≡ k ϕ(n) + 1 = k (p – 1) (q – 1) + 1,<br />

može se za one P koji nisu kongruentni s 0 (mod p), što znači da nisu višekratnici od p, koristiti mali<br />

Fermatov teorem (prikazan u prilogu A) i dobiti:<br />

P<br />

ed<br />

= P<br />

k (p - 1) (q-<br />

1) + 1<br />

k (q - 1)<br />

(p - 1)<br />

k (q-<br />

1)<br />

= P(<br />

P ) ≡ P(<br />

1)<br />

≡ P (mod p)<br />

To je, također, trivijalno ispunjeno i kada je P višekratnik od p, jer je tada:<br />

P ≡ 0 (mod p)<br />

,<br />

pa općenito vrijedi:<br />

P ≡ P (mod p)<br />

ed<br />

.<br />

Analogno vrijedi i za q, pa se iz (posebnog slučaja) kineskog teorema o ostatcima (prilog A) dobiva:<br />

ed<br />

P<br />

ed<br />

≡ P (mod p)<br />

∧ P ≡ P (mod q)<br />

⇔<br />

ed<br />

P ≡ P (mod n)<br />

.<br />

Neke praktične napomene vezane za RSA kriptosustav<br />

Važna praktična pitanja su:<br />

1. Kako dobiti dva velika prosta broja p i q?<br />

2. Kako odabrati javni ključ e?<br />

3. Kako izračunati tajni ključ d?<br />

Odgovori mogu biti sljedeći:<br />

1. Budući da je teškoća faktorizacije velikih prirodnih brojeva osnova za sigurnost RSA<br />

kriptosustava, ne možemo faktorizacijom naći dokazivo proste brojeve p i q. Zato se nalaze<br />

vjerojatno prosti brojevi, npr. pomoću heurističkog ispitivanja po Miller-Rabinu (prikazano u<br />

prilozima A i B). Zbog sigurnosti je preporučljivo da p i q ne budu preblizu jedan drugome, da p -<br />

1 i q - 1 imaju barem jedan veliki prosti faktor, ali ne zajednički, jer je poželjno da p - 1 i q - 1<br />

nemaju velikih zajedničkih faktora.<br />

2. Za javni ključ e nekad se preporučivalo uzeti broj 3, ali se pokazalo da nije dobro imati jako mali<br />

broj e, pa se danas preporučuje staviti 2 1 65537<br />

16<br />

e = − = , što je broj koji je i pogodan za<br />

računanje. No, može ga se i generirati nekim (pseudo)slučajnim postupkom.<br />

3. Tajni ključ d može se izračunati na temelju proširenog Euklidovog algoritma (prilog A i B).<br />

84<br />

.<br />

.


Neke druge metode za zasnivanje kriptosustava s javnim ključem<br />

RSA kriptosustav spada u asimetrične kriptosustave čija je sigurnost zasnovana prvenstveno na<br />

teškoći faktorizacije velikih prirodnih brojeva. Drži se da je teškoća faktorizacije velikih prirodnih brojeva<br />

ekivalentna teškoći nalaženja "klasičnog" diskretnog logaritma, tako da su kriptosustavi koji primjenjuju<br />

jednu ili drugu metodu u načelu isto sigurni (kod istih veličina ključeva). Primjer poznatog kriptosustava<br />

koji koristi metodu "klasičnog" diskretnog logaritma je kriptosustav ElGamal, nazvan po svom autoru<br />

(Taher ElGamal).<br />

No, asimetrični kriptosustavi koji rade na temelju teškoće nalaženja diskretnog logaritma u grupi<br />

eliptičkih krivulja nad konačnim poljem K za istu sigurnost traže značajno manje ključeve. Takvi se<br />

kriptosustavi zovu kriptosustavi temeljeni na eliptičkim krivuljama (Elliptic Curve Cryptosystem, ECC).<br />

Procjenjuje se da su danas (oko 2010. godine) ekvivalentno sigurni RSA ključevi duljine 1369 bita i ECC<br />

ključevi duljine 146 bita (ECC su skoro 10 puta manji), a da će 2040. godine (zbog procijenjenog<br />

povećanja snage klasičnih, ne-kvantnih računala) ekvivalentno sigurni RSA i ECC ključevi biti duljine<br />

3214 i 191 bita (ECC su skoro 17 puta manji). To je osobito važno kod onih primjena kod kojih je prostor<br />

za pohranu ključeva ograničen (npr. kod pametnih kartica). Treba napomenuti da su u Java 7 uvedene<br />

funkcije za kriptiranje pomoću eliptičkih krivulja.<br />

4. KRIPTIRANJE PODATAKA U TRANZITU<br />

Kriptiranje podataka koji su u tranzitu nije vezano samo za baze podataka i takvo se kriptiranje<br />

uglavnom koristilo i prije kriptiranja podataka koji stoje u bazi. Kada je riječ o Oracle bazi, postoje rješenja<br />

kriptiranja podataka u tranzitu koja su vezana uz Oracle bazu, ali postoje i rješenja nezavisna od Oracle<br />

baze. No, obje varijante kriptiranja podataka u tranzitu imaju isti cilj, zaštiti tri vrste paketa (podataka<br />

baze) koji se prenose mrežom:<br />

1. paketi koji služe za inicijaciju sesije između klijenta i servera baze podataka;<br />

2. paketi koje klijent šalje bazi, uključujući SQL naredbe;<br />

3. paketi koje baza, kao odgovore, šalje klijentu.<br />

Jasno je zašto se želi zaštiti 3.vrstu paketa, jer su to podaci, a i 2.vrstu paketa, SQL naredbe, jer se<br />

i u njima mogu nalaziti neki tajni podaci (npr. broj kreditne kartice u SQL upitu i sl.).<br />

No, važno je zaštiti i 1.vrstu paketa (podaci za inicijaciju sesije), bez obzira što Oracle baza uvijek<br />

tokom logon procesa prenosi lozinku u kriptiranom obliku (bez obzira da li je promet mrežom kriptiran ili<br />

nije). Ako promet mrežom nije kriptiran, tokom postupka identifikacije/autentikacije na Oracle bazu može<br />

se pojaviti jedna potencijalna ranjivost.<br />

Postupak identifikacije/autentikacije (kod baze 11g) pojednostavljeno ide tako da klijent prvo<br />

pošalje bazi korisničko ime. Baza na temelju korisničkog imena potraži u sistemskim tablicama hash<br />

vrijednost lozinke za tog korisnika (lozinka se nikada ne sprema u Oracle bazu, pa ni kriptirana). Baza<br />

generira slučajni ključ za novu sesiju, taj ključ kriptira pomoću hash vrijednosti lozinke (koristeći AES<br />

algoritam) i šalje klijentu tako kriptirani ključ sesije. Klijent dekriptira primljeni serverski ključ sesije,<br />

koristeći hash vrijednost lozinke koju je korisnik unio. Zatim klijent generira vlastiti (klijentski) ključ sesije,<br />

te uz pomoć oba ključa sesije (serverskog i klijentskog) kriptira lozinku (koristeći AES), te ju šalje serveru,<br />

zajedno s kriptiranim klijentskim ključem sesije (kojega isto kriptira pomoću hash vrijednost lozinke,<br />

koristeći AES). Server sada može dekriptirati klijentski ključ sesije, te uz pomoć njega i svog ključa sesije<br />

dekriptirati primljenu lozinku, izračunati njen hash i na kraju ga usporediti sa hash vrijednošću koja je<br />

spremljena u bazi. Ranjivost navedenog postupka sastoji se u tome da napadač koji na neki način sazna<br />

hash vrijednost lozinke iz baze može, osluškujući mrežu, dekriptirati serverski i klijentski ključ sesije, te<br />

onda dekriptirati i lozinku. Ako je promet mrežom kriptiran, te ranjivosti nema. Naravno, može se primijetiti<br />

da postoji značajna ranjivost baze ako netko nepozvan može saznati hash vrijednost lozinki iz baze.<br />

Sam proces kriptiranja podataka u tranzitu može se raditi pomoću dva Oracle rješenja, koja se<br />

dobivaju samo uz opciju Advanced Security Options (ASO). Jedno je rješenje tzv. Network Data<br />

Encryption (NDE), a drugo se zasniva na Secure Socket Layer (SSL). Preporuča se korištenje NDE<br />

rješenja, jer je jednostavnije od SSL varijante.<br />

Osim ta dva Oracle rješenja, moguće je koristiti i nezavisna softverska ili hardverska rješenja, npr.<br />

različite varijante tuneliranja (jedna od njih je Secure Shell - SSH), Internet Security Protocol (IPSec),<br />

ili hardverske akceleratore (koji, za razliku od softverskih rješenja, ne opterećuju procesore<br />

klijenta/servera), npr. mrežne kartice koje podržavaju enkripciju/dekripciju.<br />

85


5. KRIPTIRANJE PODATAKA NA DISKOVIMA<br />

Kriptiranje podataka koji nisu u tranzitu, a najčešće je riječ o podacima na diskovima, postalo je<br />

predmet velike pažnje zadnjih 10-tak godina. Naime, bez obzira na sve druge načine osiguravanja<br />

podataka u bazi, vidjelo se da su jako opasni oni slučajevi u kojima se ukradu podaci na diskovima, pa<br />

onda napadači imaju dovoljno vremena i mogućnosti da pristupe osjetljivim podacima i kada nemaju<br />

direktan pristup kroz bazu podataka. Podaci iz baze podataka mogu, ako nisu kriptirani, biti relativno lako<br />

dostupni i van sustava za upravljanje bazom podataka, npr. može se i sa običnim uređivačem teksta<br />

dobiti uvid u podatke, S druge strane, nije dovoljno da budu zaštićeni samo podaci koji se direktno nalaze<br />

u bazi podataka, već i podaci koji su nastali npr. backup-om tih podataka.<br />

Poduzeća (ali i druge organizacije) danas pristupaju kriptiranju podataka na diskovima najčešće iz<br />

tri razloga (ili kombinacije tih razloga):<br />

- da bi spriječili lošu reputaciju koju dobiju nakon što se otkrije da su napadači otuđili osjetljive<br />

podatke;<br />

- da izbjegnu ili smanje financijske troškove koje imaju zbog odšteta koje su dužne nadoknaditi<br />

oštećenim stranama;<br />

- da budu u skladu s različitim regulatornim propisima o zaštiti podataka, naročito zaštiti<br />

privatnih podataka.<br />

Kriptiranju podataka na diskovima može se pristupiti na tri različita načina:<br />

- "ručno" kriptiranje se radi kroz aplikaciju/aplikacije, programiranjem; dobra strana takvog<br />

načina kriptiranja je da je vrlo fleksibilno – programiranjem se može postići manje-više sve<br />

što se želi; loše strane su brojne; kriptiranje kroz aplikaciju ne može se izvesti na brzinu, jer<br />

su aplikacije kompleksne i treba puno toga u njima mijenjati; kriptiranje uvijek pogoršava<br />

performanse, a kriptiranje vlastitim programiranjem najčešće je najsporije; kod kriptiranja<br />

vlastitim programiranjem često se zaboravi neko područje (neka aplikacija), pa onda napadač<br />

može iskoristiti tu slabost i kroz nju dobiti nekriptirane podatke; na kraju, najveća mana<br />

kriptiranja vlastitim programiranjem je da se ne može na adekvatan način zaštiti ključeve za<br />

kriptiranje;<br />

- "automatsko" kriptiranje kroz sustav za upravljanje bazom podataka; bolje je od prethodne<br />

varijante; SUBP sustavi danas imaju dosta napredne mogućnosti "transparentnog" kriptiranja,<br />

kod kojega aplikacija niti "ne zna" da su podaci kriptirani; no, za razliku od programiranja kroz<br />

aplikaciju, "transparentno" kriptiranje ne pomaže kod sakrivanja podataka od onih koji imaju<br />

pristup bazi;<br />

- "automatsko" kriptiranje na razini diskovnog sustava; u ovom slučaju ne kriptiraju se samo<br />

podaci u bazi, već svi (željeni) podaci na diskovima, bili u bazi podataka ili ne; ovaj način<br />

kriptiranja podataka možda je najtransparentniji (za aplikaciju) i najjednostavniji; u nastavku<br />

se ovaj način kriptiranja ne prikazuje, već se prikazuju samo prva dva načina kriptiranja, koja<br />

su vezana za bazu podataka.<br />

Kod kriptiranja podataka u bazi podataka, bilo programiranjem ili "automatski" kroz SUBP, postoje<br />

različite varijante korištenja ključeva za kriptiranje (napomena: u načelu se uvijek radi o simetričnom<br />

kriptiranju):<br />

- postoji jedan ključ za kriptiranje podataka u cijeloj bazi podataka;<br />

- postoji jedan ključ za svaku tablicu baze podataka (ili neki drugi dio baze podataka, npr.<br />

tablespace baze podataka);<br />

- postoji jedan ključ za svaki stupac koji se kriptira;<br />

- postoji jedan ključ za svaki redak koji se kriptira;<br />

- različite kombinacije prethodnog.<br />

86


Također, vrlo je važno (ako ne i najvažnije) pitanje – gdje se sprema ključ (ključevi):<br />

- u bazu podataka;<br />

- u datoteke izvan baze podataka (na serveru baze podataka, aplikacijskom serveru ili klijentu):<br />

- u programski kod aplikacije; iako ovo rješenje izgleda primamljivo, ono je najlošije, jer postoje<br />

različiti načini dekodiranja (disasembliranja) programa i dolaska do ključa koji je sakriven u<br />

programu.<br />

6. KRIPTIRANJE PODATAKA POMOĆU PAKETA DBMS_CRYPTO<br />

Kako je već prije navedeno, "ručno" kriptiranje (kroz aplikaciju, programiranjem) podataka u bazi<br />

vrlo je zahtjevno i u načelu se ne preporučuje. Traži puno vremena za izvedbu, ima najlošije<br />

performanse, omogućuje ostavljanje "rupa" u kriptiranju, a najveći je problem kod njega – kako upravljati<br />

ključevima za kriptiranje. Bez obzira na te mane, u Oracle 11g nekada se mora koristiti "ručno" kriptiranje,<br />

a najvažnija dva slučaja jesu:<br />

- na raspolaganju je samo Standard edicija baze, koja nema mogućnosti za "transparentno"<br />

kriptiranje (koje je dodatna opcija u Enterprise ediciji);<br />

- želi se kriptirati (neke) podatke i korisnicima baze - "transparentno" kriptiranje ne može sakriti<br />

podatke korisnicima baze.<br />

Za "ručno" kriptiranje koristi se paket (na bazi) DBMS_CRYPTO.<br />

DBMS_CRYPTO ima sljedeće mogućnosti:<br />

- podržava kriptografske algoritme: DES, 3DES, 3DES_2KEY, AES, RC4; ako nema nekog<br />

posebnog razloga, preporučljivo je koristiti algoritam AES, koji omogućava kriptiranje sa 128,<br />

192 ili 256-bitnim ključevima;<br />

- kriptografski hash algoritmi: MD5, SHA-1, MD4;<br />

- MAC algoritmi (algoritmi za autentikaciju poruka) HMAC_MD5, HMAC_SH1;<br />

- kriptografski generatori pseudoslučajnih brojeva u formatu RAW, NUMBER,<br />

BINARY_INTEGER;<br />

- kriptiranje blokova podataka: kriptiranje ulančavanjem blokova (Cipher Block Chaining, CBC)<br />

gdje se prethodni kriptirani blok zbraja (XOR) sa novim blokom prije kriptiranja, dvije varijante<br />

koje su slične prethodnom - CFB (Cipher Feedback Chaining) i OFB (Output Feedback<br />

Chaining), te varijanta koju bi trebalo izbjegavati – ECB (Electronic Notebook), jer kod nje isti<br />

ulaz uvijek daje isti izlaz, pa se na temelju statističke analize teksta može pokušati dekriptirati<br />

poruka;<br />

- ispunjavanje (padding) podataka nulama ili pomoću metode PBCS5 (preporučljivo).<br />

U nastavku slijedi prikaz korištenja paketa DBMS_CRYPTO, koji uključuje i usporedbu performansi<br />

bez / sa kriptiranjem. Prvo se radi pomoćni paket:<br />

create or replace package encryption_wrapper as<br />

function encrypt (p_string in varchar2, p_key in varchar2)<br />

return raw;<br />

function decrypt (p_raw in raw, p_key in varchar2)<br />

return varchar2;<br />

end;<br />

87


create or replace package body encryption_wrapper as<br />

g_encrypt_typ constant PLS_INTEGER default<br />

DBMS_CRYPTO.ENCRYPT_AES256<br />

+ DBMS_CRYPTO.CHAIN_CBC<br />

+ DBMS_CRYPTO.PAD_PKCS5;<br />

function padkey (p_key in varchar2)<br />

return raw is<br />

begin<br />

return utl_raw.cast_to_raw(rpad(p_key,32));<br />

end;<br />

function encrypt (p_string in varchar2, p_key in varchar2)<br />

return raw<br />

is<br />

begin<br />

return<br />

dbms_crypto.encrypt<br />

(src => UTL_I18N.STRING_TO_RAW (p_string, 'AL32UTF8'),<br />

typ => g_encrypt_typ,<br />

key => padkey (p_key));<br />

end;<br />

function decrypt (p_raw in raw, p_key in varchar2)<br />

return varchar2<br />

is<br />

begin<br />

return utl_i18n.raw_to_char (<br />

dbms_crypto.decrypt<br />

(src => p_raw,<br />

typ => g_encrypt_typ,<br />

key => padkey (p_key)),<br />

'AL32UTF8');<br />

end;<br />

end;<br />

Prethodni paket koristi se za kriptiranje tablice T (koristi se i pomoćna tablica STAGE, iz koje se<br />

puni pomoćna tablica T):<br />

create table stage as<br />

select object_name from all_objects;<br />

create table t (<br />

last_name varchar2(30),<br />

encrypted_name raw(32)); -- ovaj će se stupac kriptirati<br />

Ovo je primjer punjenja tablice T iz tablice STAGE bez kriptiranja, metodom redak po redak, koja<br />

je najsporija:<br />

declare<br />

l_start number := dbms_utility.get_cpu_time;<br />

begin<br />

for x in (select object_name from stage) loop<br />

insert into t (last_name) values ( x.object_name );<br />

end loop;<br />

dbms_output.put_line<br />

((dbms_utility.get_cpu_time - l_start) || ' hsecs' );<br />

end;<br />

431 hsecs (= 4,31 sekundi rada CPU-a).<br />

88


Slijedi primjer punjenja tablice T iz tablice STAGE sa kriptiranjem:<br />

truncate table t;<br />

declare<br />

l_start number := dbms_utility.get_cpu_time;<br />

begin<br />

for x in (select object_name from stage) loop<br />

insert into t (encrypted_name)<br />

values (<br />

encryption_wrapper.encrypt<br />

(x.object_name, 'Secret Key Secret Key Secret Key'));<br />

end loop;<br />

dbms_output.put_line<br />

((dbms_utility.get_cpu_time - l_start) || ' hsecs' );<br />

end;<br />

2502 hsecs<br />

Vidi se da je INSERT sa kriptiranjem oko 6 puta sporiji od INSERT-a bez kriptiranja. Daleko veće<br />

razlike, na štetu kriptiranja, dobile bi se kada bi se unos podataka radio masovnom (bulk) metodom, tj.<br />

više redaka odjednom. Slično kao INSERT ponašaju se i UPDATE i SELECT naredbe. Jedino DELETE<br />

ne ovisi o (ne)kriptiranju.<br />

7. PROBLEMATIKA KLJUČEVA I ORACLE WALLET<br />

Kako je već prije navedeno, jedan od najvećih problema kod kriptiranja podataka u bazi je – gdje<br />

spremiti ključ(eve) za kriptiranje. Ključ se može staviti npr. u programe, ali (kako je već navedeno)<br />

znalcima je relativno lako doći do ključeva skrivenih u programu. Moguće ih je staviti u bazu podataka, no<br />

onda onaj koji ukrade bazu podataka, ukrade i ključeve. Moguće ih je staviti u datoteke izvan baze<br />

podataka. No onda te datoteke moraju biti kriptirane, a slijedi pitanje gdje držati ključ za kriptiranje tih<br />

datoteka, itd. Također, treba napomenuti da je rješenje po kojemu prije pristupa podacima korisnik (na<br />

neki način) predaje ključeve, vrlo nepraktično, osim ako se koristi hardverski modul za sigurnost<br />

(Hardware Security Module, HSM).<br />

Osim pitanja gdje spremiti ključ(eve), postavljaju se i neka druga praktična pitanja. Poznato je da<br />

ključeve za kriptiranje treba svako toliko mijenjati. No, ako imamo backup(e) podataka koji su kriptirani<br />

starim ključem(ključevima), onda imamo potrebu čuvanja tog starog ključa(ključeva).<br />

Uglavnom, vidi se da problem upravljanja ključevima za kriptiranje nije jednostavno riješiti. Oracle u<br />

Enterprise ediciji, sa ASO opcijom, nudi jedno rješenje koje naziva Oracle Wallet (novčanik). Wallet je<br />

datoteka izvan baze (zapravo, može biti više datoteka, tj. više wallet-a) koja sadrži ključeve za kriptiranje<br />

(i dekriptiranje, jer je riječ o simetričnim algoritmima), a sadržaj te datoteke je kriptiran lozinkom. Lozinka<br />

se zadaje prilikom kreiranja wallet-a, ali se može naknadno mijenjati. Prije nego se otvori baza podataka<br />

(iako može i kasnije), administrator baze podataka (ili netko drugi koji zna lozinku) otvori wallet, a onda<br />

baza podataka može koristiti ključeve koji su pohranjeni u wallet-u za kriptiranje/dekriptiranje podataka u<br />

bazi. Moguće je koristiti i tzv. auto-login wallet, koji se sam pokrene kod startanja baze. Iako može<br />

izgledati kako takav auto-login način rada nema smisla, on ima smisla u onim slučajevima kada netko<br />

može ukrasti podatke ali ne i server, jer auto-login način rada funkcionira samo na istovjetnom serveru na<br />

kojem je instaliran. Postoji i treći način korištenja wallet-a, koji je zapravo i najsigurniji, a to je da se wallet<br />

nalazi na posebnom HSM modulu. HSM modul, osim sigurnosti, može povećati i performanse, jer on<br />

može preuzeti na sebe kriptiranje/dekriptiranje podataka i time odteretititi bazu podataka.<br />

No, najčešći način korištenja Oracle Wallet-a je pomoću lozinke, što se u nastavku ukratko<br />

prikazuje. Kao prvo, u Oracle SQLNET.ORA parametarskoj datoteci mora biti zapisano gdje se wallet<br />

nalazi, npr.:<br />

ENCRYPTION_WALLET_LOCATION=<br />

(SOURCE=(METHOD=FILE)(METHOD_DATA=<br />

(DIRECTORY=/home/ora11gr2/network/admin/)<br />

))<br />

89


Nakon toga se kreira wallet, sa:<br />

ALTER SYSTEM SET ENCRYPTION KEY<br />

IDENTIFIED BY lozinka_za_wallet;<br />

Kada se starta baza, nakon otvaranja baze mora se pokrenuti otvaranje wallet-a:<br />

ALTER SYSTEM SET ENCRYPTION WALLET OPEN<br />

IDENTIFIED BY lozinka_za_wallet;<br />

Ako se želi privremeno zatvoriti wallet, to se može napraviti sa:<br />

ALTER SYSTEM SET ENCRYPTION WALLET CLOSE<br />

IDENTIFIED BY lozinka_za_wallet;<br />

8. KRIPTIRANJE PODATAKA POMOĆU TDE COLUMN ENCRYPTION<br />

Kao i Oracle Wallet, i Transparent Data Encryption (TDE) Column Security se može koristiti samo u<br />

Enterprise ediciji baze, pri čemu je potrebna i ASO opcija. TDE Column Security služi za zaštitu<br />

određenih stupaca tablica podataka na disku, u slučaju da netko neovlašteno dođe do tih podataka izvan<br />

baze, ali su ti stupci za korisnike baze uvijek transparentno dekriptirani. Treba napomenuti da stupci nisu<br />

kriptirani samo u tablicama, već i REDO, UNDO i TEMP pomoćnim strukturama podataka na disku<br />

(naravno, i u backup podacima).<br />

Može se kreirati novi kriptirani stupac postojeće tablice, ili kriptirati postojeći stupac, ili kreirati<br />

potpuno nova tablica sa kriptiranim stupcem, što se prikazuje u nastavku:<br />

CREATE TABLE t (<br />

c1 varchar2(30),<br />

c2 varchar2(30) ENCRYPT<br />

);<br />

Ako se unese redak u tu tablicu i sa SELECT pogleda sadržaj, činit će se kao da podaci nisu<br />

kriptirani – zato jer ih baza sama transparentno dekriptira:<br />

INSERT INTO t VALUES<br />

( '***ovo NIJE kriptirano***', '***ovo JE kriptirano***');<br />

SELECT * from t;<br />

C1 C2<br />

------------------------------ ------------------------------<br />

***ovo NIJE kriptirano*** ***ovo JE kriptirano***<br />

Ako se privremeno zatvori wallet i onda pokuša unijeti novi redak sa oba stupca, vidjet će se da se<br />

tada ne može unijeti kriptirani stupac, ali može se unijeti nekriptirani stupac i poslati NULL za kriptirani<br />

stupac (jer je kod definicije stupaca omogućena NULL vrijednost). Također, ako je wallet zatvoren ne<br />

može se dati SELECT nad kriptiranim stupcima, ali može nad nekriptiranim:<br />

ALTER SYSTEM SET ENCRYPTION WALLET CLOSE<br />

IDENTIFIED BY lozinka_za_wallet;<br />

INSERT INTO t VALUES<br />

( '***ovo NIJE kriptirano***', '***ovo JE kriptirano***');<br />

*<br />

ERROR at line 1:<br />

ORA-28365: wallet is not open<br />

INSERT INTO t VALUES<br />

( '***ovo NIJE kriptirano***', NULL);<br />

90


SELECT c2 FROM t;<br />

*<br />

ERROR at line 1:<br />

ORA-28365: wallet is not open<br />

SELECT c1 FROM t;<br />

C1<br />

------------------------------<br />

***ovo NIJE kriptirano***<br />

***ovo NIJE kriptirano***<br />

Kada se navodi ključna riječ ENCRYPT, postoje tri opcije:<br />

- USING 'algorithm': može se birati AES ili DES enkripcija; u pravilu nema smisla koristiti stari<br />

DES algoritam; default je 192-bitni AES (može se birati i 128 ili 256);<br />

- IDENTIFIED BY password: time se može specificirati određeni ključ za enkripciju stupca (i<br />

isto sprema u wallet), a inače se ključ sam generira, za svaki stupac posebno; specificirani<br />

ključ je potreban npr. onda kada kriptirane podatke treba seliti na drugu bazu pomoću<br />

eksterne tablice;<br />

- SALT ili NO SALT: default je SALT, tj. da baza sama doda određene slučajne (random)<br />

bajtove na početku kriptiranih podataka; time je enkripcija jača, jer istovjetni izvorni podaci<br />

nisu više istovjetni nakon kriptiranja, pa je kriptoanaliza otežana; korištenje NO SALT treba<br />

ograničiti samo za stupce koji se indeksiraju (indeksirani stupci moraju imati uvijek iste<br />

kriptirane podatke za iste izvorne podatke).<br />

TDE Column Security nije bez mana.<br />

Jedna mana su smanjene perfomanse u odnosu na bazu bez kriptiranja. To smanjenje performansi<br />

je zavisno od toga što se radi. No, uvijek je brže od rješenja koje se može dobiti programiranjem pomoću<br />

paketa DBMS_CRYPTO. Jedan od razloga za gubljenje performansi je i taj što se podaci čuvaju u<br />

kriptiranom obliku i u memoriji, tj. u SGA strukturi baze (no, prednost toga je da netko tko bi mogao<br />

pristupiti tom dijelu memorije ne bi vidio smislene podatke).<br />

Drugo, zbog potrebe da se kriptirani podaci zaokruže na višekratnik od 16 bajtova, a i zbog<br />

dodavanja SALT podataka, TDE Column Security kriptiranje troši i više prostora na disku (i u SGA dijelu<br />

memorije).<br />

TDE Column Security ima i neka ograničenja:<br />

- ako kriptirani stupac ima indeks, taj indeks isto mora biti kriptiran (inače kriptiranje gubi<br />

smisao), ali onda kriptiranje ne može koristiti SALT opciju, jer indeksirani stupci moraju imati<br />

uvijek iste kriptirane podatke za iste izvorne podatke;<br />

- kriptirani indeksi se realno mogu koristiti samo za pretragu određene vrijednosti, ali ne i za<br />

pretragu raspona vrijednosti, jer kriptirani podaci više nemaju smisleni raspon;<br />

- kriptirani stupci se ne mogu koristiti za funkcijske indekse;<br />

- nad kriptiranim stupcima ne mogu se raditi vanjski ključevi.<br />

Kako će se vidjeti u nastavku, TDE Tablespace Security nema gore navedene restrikcije,<br />

a i performanse su generalno puno bolje u odnosu na TDE Column Security.<br />

91


9. KRIPTIRANJE PODATAKA POMOĆU TDE TABLESPACE ENCRYPTION<br />

Kao i TDE Column Security, tako se i TDE Tablespace Security može koristiti samo u Enterprise<br />

ediciji baze, pri čemu je potrebna i ASO opcija. TDE Tablespace Security po prvi put je uveden u Oracle<br />

bazi 11.1. Kako samo ime kaže, ovdje se ne kriptira samo određeni stupac, već cijeli tablespace.<br />

Za razliku od TDE Column Security, kod TDE Tablespace Security nije moguće kriptirati postojeću<br />

tablicu ili postojeći tablespace, već je potrebno kreirati novi kriptirani tablespace i onda u njega kopirati<br />

postojeće tablice koje želimo kriptirati. Kreiranje kriptiranog tablespace-a radi se sa:<br />

CREATE TABLESPACE kriptirani_tablespace<br />

DATAFILE ...<br />

ENCRYPTION DEFAULT STORAGE (ENCRYPT);<br />

Kao i kod TDE Column Security, i ovdje je moguće odabrati algoritam za enkripciju, a on može biti<br />

3DES168, AES128, AES192 ili AES256. Default je AES128, a ne AES192 kao kod TDE Column Security,<br />

jer je ovdje količina podataka kojae se kriptira/dekriptira puno veća - cijeli tablespace, a ne pojedini<br />

stupac/stupci.<br />

Svaka tablica koja se kreira u kriptiranom tablespace-u bit će u cijelosti kriptirana. Kriptiranje se<br />

radi na razini bloka tablice, a ne retka ili stupca, pa nema potrebe za zaokruživanjem podataka na<br />

višekratnik od 16 bajtova, jer je blok podataka sam po sebi višekratnik od 16 bajtova. Također, budući da<br />

je svaki blok podataka jedinstven, nije potreban SALT podatak. Rezultat je taj da TDE Tablespace<br />

Security ne zauzima dodatni prostor na disku. Dalje, TDE Tablespace Security kriptira podatke prije<br />

slanja podataka iz SGA na disk, odnosno dekriptira ih u obrnutom smjeru. To znači da su podaci u SGA u<br />

nekriptiranom obliku, što predstavlja potencijalnu ranjivost u slučaju da netko neovlašten može pristupiti<br />

SGA području (no, ta je ranjivost samo teoretska, jer takav vjerojatno lako može pristupiti i drugim<br />

dijelovima baze, pa i preuzeti DBA prava), ali je prednost u tome da se čitanje/upis u SGA radi brzo.<br />

Za razliku od podataka u SGA, podaci u REDO, UNDO i TEMP pomoćnim strukturama na disku su<br />

kriptirani (isto kao i kod TDE Column Security). No, treba uzeti u obzir da nakon kopiranja nekriptirane<br />

tablice iz nekriptiranog tablespace-a u kriptirani tablespace, te brisanja nekriptirane tablice, nije sigurno<br />

da više nema nekriptiranih podataka (te tablice). Naime, ti podaci ostaju određeno vrijeme u REDO,<br />

UNDO i TEMP pomoćnim strukturama. Naravno, ostaju i u backup-iranim podacima.<br />

ZAKLJUČAK<br />

Kriptiranje podataka važno je zbog očuvanja privatnosti, integriteta i autentičnosti poruka<br />

(informacija), te zbog osiguranja neporecivosti slanja poruke.<br />

Za kriptiranje se koriste simetrični i asimetrični kriptosustavi. Simetrični kriptosustavi su puno brži<br />

(oko 1000 puta), ali asimetrični kriptosustavi omogućavaju razmjenu ključeva među velikim brojem<br />

sudionika.<br />

Važno je kriptirati podatke u tranzitu, ali i podatke koji se nalaze na medijima (najčešće diskovima).<br />

Podatke na medijima može se kriptirati nezavisno od baze podataka, ili ih se može kriptirati unutar baze<br />

podataka.<br />

Oracle baza direktno omogućava simetrično kriptiranje. Kriptografske mogućnosti različitih edicija<br />

Oracle baze 11g su sljedeće:<br />

- Standard edicija baze ima kriptiranje pomoću paketa DBMS_CRYPTO (programiranjem); njime<br />

se može postići sve, pa i sakrivanje podataka od (nekih) korisnika u bazi, ali uz lošije<br />

performanse i uz otvoreni problem spremanja ključeva za kriptiranje;<br />

- Enterprise edicija sa dodatnom opcijom Advanced Security ima transparentno kriptiranje<br />

podataka (TDE); TDE ne služi za sakrivanje podataka od legalnih korisnika baze, već samo za<br />

zaštitu podataka u slučaju krađe cijelog računala ili sustava za pohranu podataka; ASO opcija<br />

omogućava i dvije varijante kriptiranje podataka u tranzitu - jedno je rješenje tzv. Network Data<br />

Encryption (NDE), a drugo se zasniva na Secure Socket Layer (SSL).<br />

Nažalost, značajna je razlika u cijeni između Standard edicije i Enterprise edicije sa dodatnom<br />

opcijom ASO. S druge strane, činjenica je da se vlastitim programiranjem u Standard ediciji vrlo teško<br />

može postići sigurnost ključa (ili više ključeva) koju ima skuplja varijanta. No, uvijek postoji i mogućnost<br />

korištenja transparentnog kriptiranja na razini diskovnog sustava.<br />

92


LITERATURA<br />

1. Bača, M. (2004): Uvod u računalnu sigurnost, Narodne novine, Zagreb<br />

2. Ben-Natan, R. (2009): HOWTO Secure and Audit Oracle 10g and 11g, Auerbach Publications<br />

3. Budin, L., Golub, M., Jakobović, D., Jelenković, L. (2010): Operacijski sustavi, Element, Zagreb<br />

4. Dujella, A., Maretić, M. (2007): Kriptografija, Element, Zagreb<br />

5. Knox, D. C. (2004): Effective Oracle Database 10g Security by Design, McGraw-Hill<br />

6. Kyte, T. (2009): Expert Oracle Database Architecture, Apress<br />

7. Mollin, R. A. (2007): An Introduction to Cryptography, Chapman & Hall/CRC (Taylor & Francis<br />

Group), Boca Raton<br />

8. Žagar, M. (2008): Otvoreno računarstvo – Sigurnost (prezentacijski materijali), FER, Zagreb<br />

9. Žubrinić, D. (2002): Diskretna matematika, Element, Zagreb<br />

Oracle priručnici za bazu 11g Release 2 (2009.):<br />

10. Advanced Security Administrator's Guide<br />

11. Database Security Guide<br />

12. Enterprise User Security Administrator's Guide<br />

93


PRILOG A: Neki matematički pojmovi vezani za RSA kriptosustav<br />

Djeljivost brojeva<br />

Neka su a, d ∈ Z. Kaže se da d dijeli a ako je a različito od 0 i ako je d višekratnik od a. Tu činjenicu<br />

(da d dijeli a) može se izraziti i na ove načine:<br />

d⎪a (d je djelitelj od a; ako d = 1 ili a, zove se trivijalni djelitelj, inače se zove faktor)<br />

a = k d (a je višekratnik od d).<br />

Relacija dijeli je refleksivna (a⎪a, tj. svaki broj dijeli sebe samoga), antisimetrična (ako su a i b<br />

različiti i a⎪b, ne može biti da b⎪a) i tranzitivna (ako a⎪b i b⎪c, onda a⎪c).<br />

Teorem dijeljenja<br />

Neka su zadani a ∈ Z i b ∈ N. Onda postoje jedinstveni brojevi q ∈ Z i r ∈ {0, …, b -1} takvi da je:<br />

a = q b + r (q je količnik ili kvocijent, r je ostatak ili reziduum).<br />

Činjenica da je r ostatak dijeljenja a sa b može se napisati i ovako:<br />

r = a mod b.<br />

Najveći zajednički djelitelj, relativno prosti brojevi<br />

Ako su a, b, d ∈ Z i vrijedi d⎪a i d⎪b tada je d zajednički djelitelj od a i b. Ako je barem jedan od<br />

brojeva a, b različit od nule, tada postoji njihov najveći zajednički djelitelj (najveća zajednička mjera). Da<br />

je d najveći zajednički djelitelj brojeva a i b, piše se ovako:<br />

d = nzd (a, b) (druga varijanta: d = Nzm (a, b) ).<br />

Ako je nzd (a, b) = 1, kaže se da su a i b relativno prosti.<br />

Euklidov algoritam i prošireni Euklidov algoritam<br />

Euklidov algoritam opisan je u Euklidovom djelu Elementi (4. stoljeće p.n.e.). Uobičajeno se koristi za<br />

brzo nalaženje najvećeg zajedničkog djelitelja d brojeva a i b.<br />

No, Euklidov algoritam daje i opis efektivnog postupka kojim se može doći do brojeva x, y, c koji<br />

zadovoljavaju diofantsku jednadžbu oblika:<br />

a x + b y = c (a i b su zadani, x, y, c se nalaze).<br />

Ta jednadžba ima rješenje (koje nije jednoznačno, već postoji beskonačno mnogo rješenja) ako i<br />

samo ako je minimalno rješenje za c jednako nzd (a, b). Tzv. prošireni Euklidov algoritam koristi se da se,<br />

uz nzd (a, b), nađu i brojevi x i y koji zadovoljavaju navedenu jednadžbu.<br />

Prosti brojevi (prim-brojevi) i osnovni teorem aritmetike<br />

Prosti brojevi su prirodni brojevi veći od 1 koji su djeljivi samo sa 1 i samim sobom, tj. nemaju<br />

faktore. Brojevi koji nisu prosti zovu se složeni brojevi (i imaju faktore).<br />

Osnovni teorem aritmetike kaže da se svaki prirodni broj a > 2 može prikazati na jedinstven način<br />

kao umnožak potencija svojih prostih djelitelja, pri čemu su prosti djelitelji poredani po veličini (manji<br />

lijevo):<br />

a =<br />

p<br />

e1<br />

1<br />

p<br />

e2<br />

2<br />

... p<br />

ek<br />

k<br />

.<br />

Ako je broj a složen, to se zove rastav ili faktorizacija broja a na proste faktore.<br />

Prostih brojeva ima beskonačno mnogo (dokaz je dat u Euklidovim Elementima). Broj prostih brojeva<br />

koji su manji ili jednaki broju x uobičajeno se označava sa π(x). Vrijedi:<br />

π(x) ∼ x / ln x, kad x →∞.<br />

Iz toga proizlazi da je vjerojatnost P da neki slučajno izabrani veliki broj n bude prosti:<br />

P (n je prosti broj) ≈ (n / ln n) / n = 1 / ln n.<br />

Ekvivalentnost po modulu (kongruencija po modulu)<br />

Kaže se da su brojevi a, b ∈ Z ekvivalenti po modulu m (ili kongruentni po modulu m, ili kongruentni<br />

modulo m) ako je njihova razlika djeljiva sa m, tj. ako vrijedi:<br />

m⎪(a – b) (ili a – b = k m).<br />

Tada se piše:<br />

a ≡ b (mod m) (čita se: a je ekvivalentan (kongruentan) b po modulu m).<br />

94


Može se pokazati da su tada (i samo tada) ostatci dijeljenja a sa m, odnosno b sa m jednaki:<br />

a ≡ b (mod m) ⇔ a mod m = b mod m.<br />

Relacija kongruencija po modulu m je refleksivna, simetrična i tranzitivna.<br />

Eulerova (phi) funkcija<br />

Funkcija ϕ : N → N koja prirodnom broju n pridružuje broj prirodnih brojeva koji su < n i relativno<br />

prosti sa n zove se Eulerova funkcija. Definira se da je ϕ(1) = 1.<br />

Ako je n složeni broj, koji ima rastav na proste faktore ,..., , p p p može se pokazati da je:<br />

( 1 1/<br />

) ( 1 1/<br />

) ... ( 1 1/<br />

). p<br />

p p − −<br />

( )<br />

2<br />

n n −<br />

= ϕ<br />

1 k<br />

1, 2 k<br />

Posebno za slučaj kada je n umnožak dva prosta broja p i q (n = p q), vrijedi:<br />

ϕ(n) = n (1 – 1/ p) (1 – 1/ q) = p q (1 – 1/ p) (1 – 1/ q) = (p – 1) (q – 1).<br />

Posebno za slučaj kada je n prosti broj p, vrijedi<br />

ϕ(p) = p – 1.<br />

Eulerova kongruencija (teorem)<br />

Ako su a i n relativno prosti prirodni brojevi, onda je:<br />

( )<br />

a 1<br />

n ϕ<br />

≡<br />

( mod n).<br />

Mali Fermatov teorem<br />

Za poseban slučaj Eulerove kongruencije kada je n prosti broj p, pa je ϕ(p) = p – 1, vrijedi:<br />

−<br />

(za svaki a ∈ N koji nije višekratnik od p).<br />

a p 1<br />

≡<br />

1<br />

( mod p)<br />

Drugi oblik Fermatova teorema vrijedi i ako je a višekratnik od p:<br />

a a p<br />

p<br />

≡ mod (za svaki a ∈ N).<br />

( )<br />

Pseudoprosti brojevi<br />

Mali Fermatov teorem može poslužiti (i) kada se treba generirati slučajni veliki broj za koji se sa<br />

velikom vjerojatnošću može tvrditi da je prosti broj (ako je generirani broj mali, lako se može dokazati da li<br />

je prosti, postupkom rastava na proste faktore; no, rastav velikih brojeva na proste faktore je složen i na<br />

teškoći tog rastava se i zasniva RSA algoritam).<br />

Generira se slučajni veliki neparni broj n i gleda se da li taj broj zadovoljava mali Fermatov teorem za<br />

neki slučajno odabrani broj a (koji može biti relativno mali), tj. gleda se da li vrijedi:<br />

a a n<br />

n<br />

≡ mod .<br />

( )<br />

Ako gornje ne vrijedi, n sigurno nije prosti broj. Tada se može tražiti dalje, u okolini broja n (npr. tako<br />

da se n poveća za 2, jer nijedan paran broj osim 2 nije prosti).<br />

Ako gornje vrijedi, to ne znači da je n sigurno prosti broj! Naime, postoje i pseudoprosti brojevi, za<br />

koje isto vrijedi mali Fermatov teorem za neke baze a. Može se pokazati da za svaku bazu a ≥ 2 postoji<br />

čak beskonačno mnogo pseudoprostih brojeva. Zbog toga se testiranje prostosti ne radi samo s jednom<br />

bazom a, nego se generira veći broj baza (što veći broj baza, to je veća vjerojatnost da je izabrani broj n<br />

prosti). Ako provjere sa svim bazama zadovoljavaju mali Fermatov teorem, velika je vjerojatnost da je broj<br />

n prosti. Nažalost, postoje i posebni pseudoprosti brojevi, zvani Charmichaelovi brojevi.<br />

95


Charmichaelovi brojevi i heurističko ispitivanje po Miller-Rabinu<br />

Charmichaelovi brojevi su brojevi koji su pseudoprosti u svakoj bazi a, tj. vrijedi:<br />

a a C<br />

C<br />

≡ mod za svaki a (C je ovdje oznaka za Charmichaelov broj),<br />

( )<br />

odnosno vrijedi:<br />

a C<br />

1 - C<br />

≡ 1 mod za svaki a koji je relativno prost sa Charmichaelovim brojem.<br />

( )<br />

Korseltov kriterij kaže da je n Carmichaelov ako i samo ako je n složen, kvadratno slobodan (što<br />

znači da je 1 najveći kvadrat koji dijeli n, odnosno eksponenti svih prostih faktora od n su jednaki 1) i za<br />

svaki prosti faktor p od n vrijedi da p – 1 dijeli n – 1. Može se pokazati da odavde neposredno slijedi da n<br />

mora biti produkt od barem tri različita prosta broja.<br />

Zbog toga što postoje Carmichaelovi brojevi, testiranje prostosti sa različitim bazama a ne može biti<br />

dovoljno sigurno. Naime, ako se slučajno naiđe na Carmichaelov broj (istina, vjerojatnost za to je mala,<br />

jer iako Carmichaelovih brojeva ima beskonačno mnogo, oni su puno rjeđi od prostih brojeva), onda će<br />

testiranje broja C (Carmichaelov broj) u svakoj bazi a pokazati da je zadovoljen Fermatov teorem.<br />

Zbog toga se, osim testiranja na Fermatov teorem sa različitim bazama, radi još jedno testiranje.<br />

Gleda se da li za generirani broj n postoji x različit od +1 i –1 koji zadovoljava jednadžbu:<br />

x n<br />

2<br />

≡ 1 mod<br />

(x je različito od +1 i –1).<br />

( )<br />

Ako postoji takav x, tada se kaže da je x netrivijalni drugi korijen od 1 mod n i tada je n sigurno<br />

složen broj. U suprotnom je n možda prosti broj (nije sigurno).<br />

Heurističko ispitivanje po Miller-Rabinu zasniva se upravo na navedena dva testa, tj. generirani broj<br />

n je sigurno složen ako:<br />

- za neku odabranu bazu a (u više iteracija) nije zadovoljen Fermatov teorem<br />

- ili postoji netrivijalni drugi korijen od (1 mod n).<br />

U suprotnom se sa velikom vjerojatnošću može tvrditi da je generirani broj n prosti.<br />

Kineski teorem o ostatcima<br />

Kineski teorem o ostacima (engl. Chinese Remainder Theorem - CRT) govori o rješenju sustava<br />

linearnih kongruencija. Ime mu se vezuje uz kineskog matematičara iz prvog stoljeća Sun Tzua.<br />

Neka su r m m m ,..., , 1 2 u parovima relativno prosti prirodni brojevi, te neka su r a a a ,..., , 1 2 cijeli<br />

brojevi. Tada sustav kongruencija:<br />

( m ) , x ≡ a ( mod m ) , ..., x ≡ a ( m )<br />

x ≡ a<br />

mod<br />

1<br />

ima rješenja.<br />

mod 1<br />

2<br />

Ako je x 0 jedno rješenje, onda su sva rješenja dana sa:<br />

x ≡<br />

x<br />

( m m ... m ).<br />

0 mod 1 2 r<br />

Za poseban slučaj, kada su p i q prosti i kada su svi ai jednaki a, vrijedi:<br />

x ≡ a (mod p) ∧ x ≡ a (mod q) ⇔ x ≡ a (mod p q)<br />

što se može koristiti u dokazu korektnosti RSA algoritma.<br />

2<br />

96<br />

r<br />

r


PRILOG B: Implementacija RSA kriptosustava<br />

Implementacija (u Oracle Forms razvojnom alatu) koja se prikazuje ne služi za realne svrhe, već<br />

samo za prezentaciju RSA kriptosustava. Implementacija radi samo s porukama koje su prirodni brojevi<br />

manji od broja n. Također, generirani ključevi su relativno mali, iako se mogu povećavati mijenjanjem<br />

odgovarajućih konstanti u programu (do granica koje dopušta Forms razvojni alat).<br />

Korisničko sučelje programa izgleda ovako (s primjerom podataka):<br />

Jedino polje koje je unosivo je Izvorna poruka, a ostala polja služe samo za prikaz odgovarajućih<br />

podataka. Funkcije tri gumba su sljedeće:<br />

Kriptiraj i dekriptiraj:<br />

- ako je Izvorna poruka prazna, javlja odgovarajuću grešku;<br />

- inače gleda da li su ključevi već generirani (ako nisu, generira ih);<br />

- kriptira i dekriptira izvornu poruku i prikazuje rezultat na lijevoj strani;<br />

- Status sada može biti:<br />

"Kriptiranje / dekriptiranje završeno!"<br />

ili<br />

"GREŠKA u kriptiranju/dekriptiranju - izvorna poruka je >= n!"<br />

ili<br />

"NEPOZNATA GREŠKA u kriptiranju/dekriptiranju!"<br />

(u slučaju programske greške, ili zbog ograničenja razvojnog sustava).<br />

Generiraj nove ključeve:<br />

- briše polja Kriptirana poruka i Dekriptirana poruka (polje Izvorna poruka ne briše);<br />

- generira nove ključeve;<br />

- prikazuje podatke na desnoj strani ekrana (maske);<br />

- ispisuje u polje Status poruku "Generirani novi ključevi!" .<br />

Izađi: izlaz iz programa.<br />

U nastavku se prikazuje programski kod s kratkim opisom (programski kod je komentiran).<br />

97


Procedura generiraj_nove_kljuceve poziva se iz istoimenog gumba i radi sljedeće:<br />

PROCEDURE generiraj_nove_kljuceve IS<br />

p INTEGER; q INTEGER; n INTEGER; phi INTEGER;<br />

e INTEGER; d INTEGER; k INTEGER;<br />

BEGIN<br />

/* Prvo se nalazi prosti broj p, u zadanom rasponu */<br />

p := prosti_broj (konstante.min_prosti_broj_k,<br />

konstante.max_prosti_broj_k);<br />

/*<br />

Traži se prosti broj q, takav da je<br />

razlika između p i q >= zadanoj minimalnoj razlici<br />

i da je nzd (p - 1, q - 1) konstante.max_nzd_p_minus_1_q_minus_1_k<br />

LOOP<br />

q := prosti_broj (konstante.min_prosti_broj_k,<br />

konstante.max_prosti_broj_k);<br />

END LOOP;<br />

/* Računaju se n i phi */<br />

n := p * q;<br />

phi := (p - 1) * (q - 1);<br />

/* Računa se e, relativno prost sa phi */<br />

e := vrati_e (phi);<br />

/* Nalaze se k i d, takvi da je e * d = k * phi + 1 */<br />

izracunaj_d_k (phi, e, d, k);<br />

/* Prikaz podataka */<br />

:p := p;<br />

:q := q;<br />

:n := n;<br />

:phi := phi;<br />

:k := k;<br />

:k_puta_phi_plus_1 := k * phi + 1;<br />

:e := e;<br />

:d := d;<br />

:e_puta_d := e * d;<br />

END;<br />

Konstante koje se koriste u programu nalaze se na jednom mjestu (specifikaciji paketa):<br />

PACKAGE konstante IS<br />

/*<br />

Koliko puta se heurističkom metodom provjerava<br />

da li je generirani broj prost<br />

*/<br />

broj_provjera_prostosti_k CONSTANT INTEGER := 10;<br />

/* Granice za generiranje prostih brojeva p i q */<br />

min_prosti_broj_k CONSTANT INTEGER := 10**9;<br />

max_prosti_broj_k CONSTANT INTEGER := 10**10;<br />

98


*<br />

Minimalna razlika između generiranih prostih brojeva p i q.<br />

Ako je razlika malena, lakša je kriptoanaliza RSA algoritma.<br />

*/<br />

min_razlika_izmedu_p_q_k CONSTANT INTEGER := 1000;<br />

/*<br />

Maksimalni najveći zajednički djelitelj od (p - 1) i (q - 1).<br />

Ako je nzd (p - 1, q - 1) velik,<br />

lakša je kriptoanaliza RSA algoritma.<br />

*/<br />

max_nzd_p_minus_1_q_minus_1_k CONSTANT INTEGER := 100;<br />

/*<br />

Granice za generiranje broja koji će biti<br />

početni broj za generiranje broja e.<br />

Napomena: e ne mora biti prosti broj,<br />

već mora biti relativno prost sa phi.<br />

*/<br />

e_pocetni_min_k CONSTANT INTEGER := 1000;<br />

e_pocetni_max_k CONSTANT INTEGER := 10000;<br />

END;<br />

Funkcija prosti_broj vraća (vjerojatni, ne dokazani) prosti broj u zadanom rasponu:<br />

FUNCTION prosti_broj (min_p INTEGER, max_p INTEGER)<br />

RETURN INTEGER<br />

/* Vraća prosti broj, u zadanim granicama */<br />

IS<br />

broj INTEGER;<br />

BEGIN<br />

/*<br />

Prvo se generira slučajni broj u zadanim granicama.<br />

Ako nije paran, povećava se za 1.<br />

U petlji se provjerava da li je prost.<br />

*/<br />

broj := slucajni_broj (min_p, max_p);<br />

IF broj MOD 2 = 0 THEN<br />

broj := broj + 1;<br />

END IF;<br />

WHILE slozen_broj (broj) LOOP<br />

/*<br />

Početni broj je prost, nije 2, pa je neparan.<br />

Zbog toga se e može u iteraciji povećavati za 2.<br />

*/<br />

broj := broj + 2;<br />

IF broj > max_p THEN<br />

broj := min_p;<br />

END IF;<br />

END LOOP;<br />

RETURN broj;<br />

END;<br />

99


Funkcija slucajni_broj vraća slučajni broj u zadanom rasponu:<br />

FUNCTION slucajni_broj (min_p INTEGER, max_p INTEGER)<br />

RETURN INTEGER<br />

/* Generira slučajni cijeli broj od min do max (uključujući) */<br />

IS<br />

broj INTEGER;<br />

BEGIN<br />

/*<br />

DBMS_RANDOM.VALUE (min_p, max_p) vraća decimalnu vrijednost<br />

između min_p, uključujući, i max_p, isključujući.<br />

Zato se računa DBMS_RANDOM.VALUE (min_p, max_p + 1).<br />

Vraća se u cijeli broj.<br />

*/<br />

broj := DBMS_RANDOM.VALUE (min_p, max_p + 1);<br />

RETURN broj;<br />

END;<br />

Funkcija slozen_broj vraća TRUE ako je broj sigurno složen, a FALSE ako je vjerojatno prosti broj. Ona<br />

višekratno poziva funkciju slozen_jednokratna_provjera. Obje zajedno implementiraju heurističko<br />

ispitivanje po Miller-Rabinu:<br />

FUNCTION slozen_broj (broj INTEGER) RETURN BOOLEAN IS<br />

slozen BOOLEAN := FALSE;<br />

i INTEGER := konstante.broj_provjera_prostosti_k;<br />

pom INTEGER;<br />

BEGIN<br />

WHILE i > 0 AND NOT slozen LOOP<br />

/* Slučajno se generira broj između 1 i (broj - 1) */<br />

pom := slucajni_broj (1, broj - 1);<br />

slozen := slozen_jednokratna_provjera (pom, broj);<br />

i := i - 1;<br />

END LOOP;<br />

/*<br />

Ako je slozen = TRUE, onda je sigurno složen.<br />

Inače je prost, vrlo vjerojatno.<br />

*/<br />

RETURN slozen;<br />

END;<br />

100


FUNCTION slozen_jednokratna_provjera (pom INTEGER, broj INTEGER)<br />

RETURN BOOLEAN<br />

IS<br />

TYPE binarna_tablica_t IS TABLE OF INTEGER<br />

INDEX BY BINARY_INTEGER;<br />

slozen BOOLEAN := FALSE;<br />

c INTEGER;<br />

c_binarno binarna_tablica_t;<br />

i INTEGER;<br />

d INTEGER;<br />

d_s INTEGER;<br />

BEGIN<br />

c := broj - 1;<br />

/*<br />

Prvo se c pretvara u binarni oblik,<br />

tako da se sprema u niz (tablicu) c_binarno<br />

čiji je prvi element najmanja binarna znamenka,<br />

a zadnji element najveća.<br />

*/<br />

i := 0;<br />

WHILE c > 0 LOOP<br />

i := i + 1;<br />

c_binarno(i) := c MOD 2;<br />

c := FLOOR (c / 2);<br />

END LOOP;<br />

d := 1;<br />

WHILE i > 0 AND NOT slozen LOOP<br />

d_s := d;<br />

d := (d * d) MOD broj;<br />

IF d = 1 AND d_s 1 AND d_s (broj – 1) THEN<br />

slozen := TRUE;<br />

END IF;<br />

IF c_binarno(i) = 1 THEN<br />

d := (d * pom) MOD broj;<br />

END IF;<br />

i := i - 1;<br />

END LOOP;<br />

IF i = 0 AND d 1 THEN<br />

slozen := TRUE;<br />

END IF;<br />

RETURN slozen;<br />

END;<br />

101


Funkcija vrati_e računa javni ključ e:<br />

FUNCTION vrati_e (phi INTEGER) RETURN INTEGER<br />

/* Računa e, relativno prost u odnosu na phi i manji od njega */<br />

IS<br />

e INTEGER;<br />

BEGIN<br />

/*<br />

Prvo se generira slučajni broj u zadanim granicama.<br />

Ako nije paran, povećava se za 1.<br />

U petlji se provjerava se da li je relativno prost sa phi.<br />

*/<br />

e := slucajni_broj (konstante.e_pocetni_min_k,<br />

konstante.e_pocetni_max_k);<br />

IF e MOD 2 = 0 THEN<br />

e := e + 1;<br />

END IF;<br />

WHILE nzd (phi, e) 1 LOOP<br />

/*<br />

phi = (p - 1) * (q - 1).<br />

p i q su veliki prosti brojevi, tj. neparni.<br />

Dakle, phi je paran, pa e ne može biti paran,<br />

ako će biti relativno prost u odnosu na phi.<br />

Početni e je neparan.<br />

Zbog toga se e može u iteraciji povećavati za 2.<br />

*/<br />

e := e + 2;<br />

/* Ako dođemo do phi, vraćamo se na donju granicu */<br />

IF e >= phi THEN<br />

e := konstante.e_pocetni_min_k;<br />

IF e MOD 2 = 0 THEN<br />

e := e + 1;<br />

END IF;<br />

END IF;<br />

END LOOP;<br />

RETURN e;<br />

END;<br />

102


Funkcija nzd vraća najveći zajednički djelitelj dva broja (koristeći Euklidov algoritam), a procedura<br />

izracunaj_d_k računa tajni ključ d i k, pozivajući proceduru za prošireni Euklidov algoritam:<br />

FUNCTION nzd (x INTEGER, y INTEGER)RETURN INTEGER IS<br />

a INTEGER := x;<br />

b INTEGER := y;<br />

t INTEGER;<br />

BEGIN<br />

WHILE b > 0 LOOP<br />

t := b;<br />

b := a MOD b;<br />

a := t;<br />

END LOOP;<br />

RETURN a;<br />

END;<br />

PROCEDURE izracunaj_d_k (<br />

phi INTEGER, e INTEGER,<br />

d OUT INTEGER, k OUT INTEGER)<br />

IS<br />

nzd_pom INTEGER;<br />

minus_k INTEGER;<br />

BEGIN<br />

/*<br />

Pomoću proširenog Euklidovog algoritma nalaze se d i minus_k,<br />

takvi da je e * d + phi * minus_k = nzd (e, phi).<br />

Pritom je, specifično, nzd (e, phi) = 1<br />

(jer su e i phi relativno prosti).<br />

*/<br />

prosireni_Euklidov_algoritam (e, d, phi, minus_k, nzd_pom);<br />

/*<br />

d bi mogao ispasti negativan,<br />

pa se d i minus_k povećavaju, dok d ne bude pozitivan<br />

*/<br />

WHILE d


Procedura prosireni_Euklidov_algoritam općenito nalazi x i y u diofantskoj jednadžbi koja ima oblik a x<br />

+ b y = c, a vraća i c, koji je zapravo nzd (a, b). U konkretnom slučaju procedura izracunaj_d_k šalje ovoj<br />

proceduri e i phi kao parametre a i b, a u povratu od nje dobiva d i –k (dobiva i nzd (e, phi), ali je on po<br />

definiciji jednak 1, jer e i phi moraju biti relativno prosti):<br />

PROCEDURE prosireni_Euklidov_algoritam (<br />

a INTEGER, x OUT INTEGER,<br />

b INTEGER, y OUT INTEGER, g OUT INTEGER<br />

)<br />

/* vraća x, y i g takve da a * x + b * y = nzd (a, b) */<br />

IS<br />

u INTEGER;<br />

v INTEGER;<br />

w INTEGER;<br />

q INTEGER;<br />

xt INTEGER;<br />

yt INTEGER;<br />

gt INTEGER;<br />

ut INTEGER;<br />

vt INTEGER;<br />

wt INTEGER;<br />

BEGIN<br />

x := 1;<br />

y := 0;<br />

g := a;<br />

u := 0;<br />

v := 1;<br />

w := b;<br />

WHILE w > 0 LOOP<br />

q := FLOOR (g / w);<br />

/* Pamtimo stare vrijednosti */<br />

xt := x;<br />

yt := y;<br />

gt := g;<br />

ut := u;<br />

vt := v;<br />

wt := w;<br />

/* Nove vrijednosti */<br />

x := ut;<br />

y := vt;<br />

g := wt;<br />

u := xt - q * ut;<br />

v := yt - q * vt;<br />

w := gt - q * wt;<br />

END LOOP;<br />

END;<br />

104


Procedura kriptiraj_i_dekriptiraj se poziva iz istoimenog gumba. Ona samo poziva funkcije<br />

kriptirana_poruka i dekriptirana_poruka, koje pozivaju funkciju modulo_potencije. Funkcija<br />

modulo_potencije služi za brzo modularno potenciranje:<br />

PROCEDURE kriptiraj_i_dekriptiraj<br />

(izvorna_poruka INTEGER, n INTEGER, e INTEGER, d INTEGER)<br />

IS<br />

kp INTEGER;<br />

dp INTEGER;<br />

BEGIN<br />

kp := kriptirana_poruka (izvorna_poruka, e, n);<br />

dp := dekriptirana_poruka (kp, d, n);<br />

/* prikaz podataka */<br />

:kriptirana_poruka := kp;<br />

:dekriptirana_poruka := dp;<br />

END;<br />

FUNCTION kriptirana_poruka<br />

(izvorna_poruka INTEGER, e INTEGER, n INTEGER)<br />

RETURN INTEGER<br />

IS<br />

BEGIN<br />

RETURN modulo_potencije (izvorna_poruka, e, n);<br />

END;<br />

FUNCTION dekriptirana_poruka<br />

(kriptirana_poruka INTEGER, d INTEGER, n INTEGER)<br />

RETURN INTEGER<br />

IS<br />

BEGIN<br />

RETURN modulo_potencije (kriptirana_poruka, d, n);<br />

END;<br />

105


FUNCTION modulo_potencije<br />

(baza INTEGER, potencija INTEGER, modulo INTEGER)<br />

RETURN INTEGER<br />

IS<br />

TYPE binarna_tablica_t IS TABLE OF INTEGER<br />

INDEX BY BINARY_INTEGER;<br />

potencija_binarno binarna_tablica_t;<br />

pom INTEGER;<br />

i INTEGER;<br />

rezultat INTEGER;<br />

BEGIN<br />

/*<br />

Prvo se potencija pretvara u binarni oblik,<br />

tako da se sprema u niz (tablicu) potencija_binarno<br />

čiji je prvi element najmanja binarna znamenka,<br />

a zadnji element najveća.<br />

*/<br />

pom := potencija;<br />

i := 0;<br />

WHILE pom > 0 LOOP<br />

i := i + 1;<br />

potencija_binarno(i) := pom MOD 2;<br />

pom := FLOOR (pom / 2);<br />

END LOOP;<br />

/*<br />

Sada se niz (tablica) potencija_binarno<br />

koristi za nalaženje modula potencije,<br />

kao da radimo (baza ** potencija) MOD modulo.<br />

*/<br />

rezultat := 1;<br />

WHILE i > 0 LOOP<br />

rezultat := MOD (rezultat * rezultat, modulo);<br />

IF potencija_binarno(i) = 1 THEN<br />

rezultat := (rezultat * baza) MOD modulo;<br />

END IF;<br />

i := i - 1;<br />

END LOOP;<br />

RETURN rezultat;<br />

END;<br />

106


IAS ZA MNOGO KORISNIKA: SAMO JEDAN ILI VIŠE NJIH NA VIRTUALNIM<br />

STROJEVIMA<br />

IAS FOR A LARGE NUMBER OF USERS: ONE INSTALLATION OR MORE ON<br />

VIRTUAL MACHINES<br />

Dubravko Miljković<br />

HEP-SIT, Vukovarska 37, Zagreb<br />

Mob: 098 9825602<br />

E-mail: dubravko.miljkovic@hep.hr<br />

SAŽETAK<br />

Virtualni strojevi (VMWare i Hyper-V) omogućuju instalaciju više iAS-a na istom poslužitelju.<br />

Često je mišljenje da iAS može opsluživati samo oko 70-80 korisnika, a da je iznad tog broja potrebna<br />

zasebna nova instalacija. Uzrok leži u pogrešnom prikazu zauzeća memorije po korisniku i<br />

interpretaciji memorijskih parametara Task Managera, precijenjenoj procjeni potrebne memorije za<br />

određen broj korisnika te nekonfiguriranju memory heap size parametra na operacijskom sustavu.<br />

Stoga se u zadnje vrijeme instalira nekoliko iAS-a kao virtualni strojevi na istom poslužitelju na koji je<br />

ugrađena dodatna RAM memorija. Međutim, veliki broj korisnika i dobri rezultati mogu se postići<br />

pravilnom konfiguracijom samo jednog iAS-a na jednom poslužitelju.<br />

ABSTRACT<br />

Virtual machines (VMWare and Hyper-V) make it possible to install several iAS on the same<br />

server. It is frequent misconception that iAS can serve only 70-80 users, and after that one needs<br />

another installation. Reason for this comes from incorrect reading of memory consumed by user and<br />

interpretation of memory parameters in Task Manager, incorrect estimate of necessary memory for<br />

particular number of users obtained by linear extrapolation, not configuring memory heap size<br />

parameter on OS as well as a choice of OS. As a consequence in recent time there is growing number<br />

of multiple installations of iAS on several virtual machines on a server. However, good results can be<br />

achieved with careful configuration of just one iAS on one server.<br />

1. UVOD<br />

Ovdje rad je ograničen na korisnike Forms/Reports aplikacija (što je najčešći slučaj) na iAS 10g<br />

instaliranom na Windows operacijskom sustavu. Out-of-the box instalacija podržava oko 70-80<br />

korisnika. Kad se broj korisnika dostigne prethodni limit ne mogu se uspostaviti nove sesije, dobiva<br />

poruku FRM-92101 (na starom iAS 1.02 FRM-92050), [1, 2], a OS javlja poruku Out-of-Memory, [3, 4].<br />

Administrator ubrzo pokrene task manager i vidi da pojedinačna Forms sesija troši oko 15 MB ili<br />

više, pomnoži to sa brojem korisnika, pogleda Page File Usage i vrlo brzo zaključi da postojeći stroj<br />

nema više dovoljno raspoložive memorije. Međutim tu se obično kombinira nekoliko grešaka:<br />

1. Poruka Out-of-memory se ne odnosi na raspoloživ RAM, nego samo na Windows nondesktop<br />

heap size<br />

2. Ako pojedina sesija troši 15 MB to ne znači da će N korisnika potrošiti N x 15 MB RAM-a<br />

3. Ono što se očita kao Page File Usage je Total Commit Charge, sustav je obično još jako<br />

daleko od swap-anja<br />

4. Maksimalan broj istovremenih konekcija (ne korisnika) od strane klijenata ka Apache HTTP<br />

serveru treba se konfigurirati u httpd.conf datoteci<br />

Sama instalacija iAS-a inicijalno podržava oko 70-80 korisnika. Pri tome nakon instalacije treba<br />

podesiti samo osnovne postavke kao što su formsweb.cfg, *.env, .ora datoteke, NLS Lang,<br />

embeded pdf fontove i iAS je praktički spreman za uporabu. Ukoliko želimo da iAS opslužuje još veći<br />

broj korisnika potrebno je obaviti još neke konfiguracije. Nažalost one nisu uvijek detaljno i jasno<br />

opisane u osnovnim Oracle priručnicima za iAS. Stoga većina instalacija ima konfiguracijske<br />

parametre kakvi se dobiju samom instalacijom.<br />

107


Slika 1 Poruka koju dobije korisnik kad je rezerviran premali nondesktop heap size<br />

2. VIRTUALNI STROJEVI KAO MOGUĆE RJEŠENJE<br />

Ne znajući ili ne želeći se opterećivati za dodatne konfiguracije, a želeći uslužiti veći broj korisnika,<br />

neki traže spas u virtualnim strojevima. Kad se već misli da smo ograničeni na 70-80 korisnika po iASu,<br />

hajdemo ih instalirati više. Ali to znači više servera, a potrošnja CPU-a je (dok se ne pokreću<br />

zahtjevni reporti) uglavnom zanemariva. Pa pokušajmo onda s virtualnim strojevima. Podignimo ih<br />

nekoliko na jednom fizičkom serveru i na svakom virtualnom stroju podignimo OS, a na njemu iAS.<br />

Ako na jednom fizičkom serveru podignemo na taj način četiri iAS-a, popeli smo se do oko 300<br />

korisnika. U svakom slučaju puno više nego 70-80 korisnika.<br />

Slika 2 Aplikacija na fizičkom serveru i virtualizacija<br />

108


Slika 3 Virtualizacija s VMWare ESX<br />

Slika 4 Virtualizacija s Hyper-V Server 2008<br />

Sama virtualizacija donosi određeni memorijski i CPU overhead. Memorijski footprint je relativno<br />

mali i iznosi (ovisno o varijanti) nekoliko desetaka MB. Isto važi za CPU, overhead je reda nekoliko<br />

posto. Međutim na svakom virtualnom stroju instaliran je OS i iAS što zauzima oko 700 MB po stroju.<br />

To znači da kad imamo četiri virtualna stroja na Windows OS-ove, iAS-e i VM footprint potrošili smo<br />

oko 3 GB. Dakle, takva instalacija mora odmah započeti s bar 6 GB (u stvarnosti 8 GB) RAM-a na<br />

fizičkom serveru. Isto tako na svakom iAS-u instaliranom na VM treba podignuti sve reports servere<br />

koje aplikacije koriste.<br />

Sam ESX Server je besplatan osim ako se žele koristiti napredne funkcije podrške. Međutim<br />

svaka odvojena instalacija operacijskog sustava Windows se posebno plaća.<br />

Hyper-V postoji u dvije varijante: kao samostalni besplatan proizvod zvan Microsoft Hyper-V<br />

Server 2008 i kao role koje se instaliraju na Windows Server 2008 i Windows Server 2008 R2.<br />

Tu je u boljoj poziciji Hyper-V koji kad se instalira kao rola na Windows Server 2008 omogućuje<br />

četiri besplatna Windows Sjever 2008 OS-a na virtualnim strojevima (premda nam treba Windows<br />

2003 Server, ali to se da riješiti snalažljivošću).<br />

Što se tiče licenciranja Oracle iAS-a tu nema bitne razlike jer se licenciranje obavlja po broju<br />

CPU-a. Značajno veće troškove bi imala varijanta s virtualnim strojevima ako bi se koristile napredne<br />

funkcije virtualizacije koje omogućavaju migraciju virtualnih strojeva na druge fizičke server jer bi<br />

trebalo licencirati sve CPU-e (osim u slučaju korištenja Oracle VM).<br />

Kod primjene virtualnih strojeva treba još riješiti raspodjelu (balansiranje) prometa između<br />

pojedinih strojeva, [5, 6]. Isto tako, ako želimo da takvo rješenje ima i visoku raspoloživost, a ne samo<br />

kapacitet, treba osigurati mehanizam provjere ispravnosti funkcija iAS-a na svakom virtualnom stroju<br />

(da u clusteru ne bi bio uključen neispravan iAS). Sve ovo dalje ponešto komplicira rješenje s više<br />

virtualnih strojeva.<br />

U ovom radu želi se ukazati da za velika opterećenja nije potrebno koristiti virtualne strojeve s<br />

odvojenim instalacijama iAS-a već jedan dobro konfiguriran iAS na klasičnom operacijskom sustavu<br />

na jednom fizičkom serveru. Stoga će kroz slijedeća poglavlja biti dotaknuti problemi čije<br />

razumijevanje omogućuje korektnu konfiguraciju navedene instalacije.<br />

3. UPORABA MEMORIJE iAS-a<br />

Opisat ćemo korištenje memorije od strane Forms aplikacija, jer se tu obično griješi u procjeni.<br />

Pojedinačni reports serveri također koriste otprilike 10-60 MB (ovisno o broju engine-a i opterećenju).<br />

3.1. Skalabilnost formi<br />

Ako pokrenemo neku srednje složenu aplikaciju i u task manager-u promatramo zauzeće<br />

memorije od strane Forms (frmweb.exe) procesa.<br />

Kad bi imali na raspolaganju stress tester (dosta skupa sprava) postepenim opterećivanjem iAS-a<br />

s korisnicima došli bi do zanimljivih rezultata (Windows heap size mora za veća opterećenja biti<br />

korektno konfiguriran u Windows registry key-u):<br />

109


Npr. ako sustav ima slobodno 1 GB RAM-a i jedna sesija koristi 15 MB lako bi pogrešno zaključili<br />

da iAS može podržati 68 korisnika. Kada bi sustav bio opterećen s oko 50 korisnika ako bi pogledali<br />

iskorišten i slobodan RAM došli bi do zaključka da jedna sesija koristi oko 6.2 MB. Ako je tako onda<br />

možda iAS s 1 GB RAM-a izdrži oko 165 korisnika?! Idemo dalje, opteretimo iAS s 1 GB slobodnog<br />

RAM-a do kraja, kada performanse (u smislu vremena odziva – response time) počinju drastično<br />

padati i kod oko 350 korisnika možemo zaključiti da jedna sesija koristi samo oko 2.8 MB RAM-a!!!<br />

3.2. Pokazivanje task manager-a i ugrađeno optimiziranje korištenja memorije Forms<br />

procesa<br />

Jednostavno mjerenja zauzeća memorije putem task managera ne daje korektan rezultat. Vrlo<br />

često OS nije oslobodio prethodno angažiranu memoriju od frmweb procesa ili još nije osvježio interne<br />

tablice. No značajnije je to što Oracle u optimiziranje korištenja memorije od strane Forms procesa<br />

uložio puno truda i zbog načina korištenja memorije na temelju potrošnje memorije od strane jednog ili<br />

dva Forms proces ne može se jednostavno ekstrapolirati potrošnja memorije za znatno veći broj<br />

korisnika, [7, 8, 9]. Ako task manager pokazuje da je proces koristi 15 MB, proces može stvarno<br />

koristiti recimo samo 5 MB, a ostatak je proces rezervirao anticipirajući buduće potrebe.<br />

Osim toga Oracle Forms procesi su sposobni dijeliti izvršni kod i aplikacijski image. Ako stotine<br />

korisnika otvore istu formu postoji puno zajedničkih objekata u memoriji. Čak ako su istovremeno<br />

otvorne različite forme u memoriji nalazi se još punu objekata koji dijele mogu dijeliti memorijske<br />

resurse.Štoviše, kad je forma završila s radom, memorija koju je zauzimala ne mora se osloboditi<br />

odmah. Naime alociranje memorije je relativno skup postupak koji se često ne obavlja sve dok to nije<br />

apsolutno potrebno osloboditi zauzetu memoriju.<br />

Korištenje zajedničkih resursa naglašenije je kod uporabe jedne aplikacije nego kod „portfelja“<br />

aplikacija (puno različitih aplikacija na istom iAS-u), ali uštede su uvijek velike.<br />

Sad uviđamo da potrošnja memorije za veliki broj korisnika ne može se odrediti jednostavnom<br />

linearnom ekstrapolacijom očitane potrošnje memorije za jednog korisnika. Memorija sustava u biti<br />

nije problem. Sa oko 1 GB (samo za forms procese) možemo opslužiti 300 korisnika, sa 2 GB (opet<br />

samo za forms procese) još puno više. U biti memorija nije usko grlo za iole normalan broj korisnika<br />

(recimo ispod 500-600 – da li ih stvarno želimo još više na jednom fizičkom serveru?).<br />

Za ilustraciju evo i rezultata „memory bound“ testa koji je proveo Oracle na serverima Sun 450R<br />

sa Solaris 2.8 OS i ukupno 1 GB i 2 GB memorije, dakle ne 1 GB memorije za forms procese nego<br />

ukupno Solaris OS - 94 GB, iAS – 150 GB i forms procesi. Radi cjelovitosti preneseni su rezultati i<br />

Memory bound testa i CPU bound testa (četiri 450 MHz CPU, programski upravljan broj procesora),<br />

relativno moderan server za to vrijeme (2000. godina), [7, 8]<br />

Slika 5 „Memory bound test“ rezultati za server s ukupno 1 GB i 2 GB memorije<br />

110


Slika 6 „CPU bound test“ “ rezultati za server s ukupno 1 i 2 CPU-a<br />

Ove slike ilustriraju da velik broj korisnika na jednom fizičkom stroju nisu fantazija.<br />

4. KORIŠTENJE MEMORIJE KOD WINDOWS OS-a<br />

4.1. Uobičajena ograničenja kod 32-bitnih Windows OS-a<br />

Kratko ćemo opisati kako Windows OS koristi memoriju. Windows Server 2003 Standard Edition<br />

ima limit od 4 GB fizičkog RAM-a. Čak ni tih 4 GB RAMA-a ne može se potpuno iskoristiti zbog<br />

prostora rezerviranog za video memoriju i razne periferne uređaje (npr. DMA za hard disk).<br />

Slika 7 Default-na raspodjela memorije između privatnih procesa i kernela<br />

U default-noj Windows konfiguraciji 2 GB virtualnog adresnog prostora je određeno za privatno<br />

korištenje svakog procesa, a ostalih 2 GB se dijeli između svih procesa i operacijskog sustava, [10].<br />

Pri tome najveće zauzeće memorije od pojedinog privatnog procesa može biti do 2 GB, a suma<br />

zauzeća memorije od svih privatnih procesa opet mora stati unutar 2 GB.<br />

111


4.2. Memorijski switch-evi<br />

• /3GB Switch<br />

Ako nam za privatne proces stvarno treba više od 2 GB RAM-a možemo se ispomoći uporabom<br />

/3GB switch-a. Sada privatni procesi mogu zauzeti pojedinačno ili sveukupno do 3 GB RAM-a, [10].<br />

Naravno to ide na uštrb memorije koja je na raspolaganju operacijskom sustavu.<br />

Slika 8 Raspodjela memorije između privatnih procesa i kernela uz primjenu /3GB switch-a<br />

Primjer iz Boot.ini<br />

[Boot Loader]<br />

Timeout=30<br />

Default=multi(0)disk(0)rdisk(0)partition(2)\WINNT<br />

[Operating Systems]<br />

multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows Server 2003" /fastdetect /3GB<br />

• /USERVA switch<br />

Ponekad se operacijski sustav koji ima postavljen /3GB switch ponaša nestabilno. Stoga možemo<br />

koristiti /USERVA switch putem kojeg možemo preciznije definirati memoriju raspoloživu za privatne<br />

procese na način da preciznije specificiramo granicu između 2 GB i 3 GB, [11]. Višak memorije<br />

iskoristiti će kernel što povećava stabilnost rada sustava.<br />

Primjer iz Boot.ini<br />

[Boot Loader]<br />

Timeout=30<br />

Default=multi(0)disk(0)rdisk(0)partition(2)\WINNT<br />

[Operating Systems]<br />

multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows Server 2003" /fastdetect /3GB /Userva=2900<br />

• /PAE switch<br />

Moderniji Windows operacijski sustavi mogu iskoristiti još više memorije uporabom PAE<br />

switch-a, [12]. PAE je od strane Intela osigurano memorijsko proširenje koje omogućuje podršku više<br />

od 4 GB fizičke memorije za većinu 32-bitnih (IA-32) Intel Pentium Pro i kasnijih platformi.<br />

Nažalost da bi aplikacija iskoristila PAE podršku mora biti pisana kao PAE aware aplikacija.<br />

Budući da su revizije iAS-a 10g relativno stariji softverski proizvodi oni nisu PAE aware aplikacije.<br />

112


Sa /3GB i /USERVA switch-evima možemo dobiti dodatnih 1 GB prostora za iAS. Ako se sjetimo<br />

da pri velikom broju korisnika potrošnja po sesiji može pasti na samo 2.8 MB, sa dodatnih 1 GB dobili<br />

bi preko 300 novih korisnika. Naravno trebamo voditi računa da tako opterećen iAS može imati<br />

problema sa CPU kod intenzivnog reportiranja. Međutim isti CPU problemi bi se javili kod tog broja<br />

korisnika i pri korištenju virtualnih strojeva.<br />

5. SWAPANJE I PAGE FILE USAGE<br />

Swap file (ili swap space) je prostor na disku koji se koristi kao virtualno memorijsko proširenje<br />

fizičke memorije računala. Postojanje swap file omogućuje operacijskom sustavu da se ponaša kao da<br />

ima više fizičke memorije (RAM-a) nego što je u stvarnosti ima. Naravno, ovo ima svoju cijenu jer se<br />

sadržaj RAM-a privremeno seli na vanjski disk i obratno što bi znatno usporilo rad iAS-a ili ga u<br />

konačnici potpuno onemogućilo. U biti je vrlo teško natjerati iAS na swap-anje. Uglavnom se pogrešno<br />

misli da sistem swap-a kad ima puno resursa i u stvarnosti još uopće ne swap-a.<br />

Mnogi vjeruju da je Page File Usage koji pokazuje task manager stvarni page file usage, ali to nije<br />

tako. PF Usage kako ga prikazuju task manager u Windows XP I Windows Server 2003 je u stvari<br />

system commit total, [13].<br />

Na taj način ako sustav ima 4 GB RAM-a 3,67 GB RAM-a je iskoristivo. Tijekom rada možemo<br />

uočiti Page File Usage u Task Manageru od recimo 3,1 GB dok PefMon pokazuje samo 2%.<br />

113


Slika 9 Memorija sustava nakon restarta i bez korisnika na iAS-u<br />

114


Slika 10 Memorija sustava opterećenog s 326 korisnika. PF Usage je 3.11 GB, ali to nije swap space<br />

već total commit memory – sustav još ne swap-a, pogledati Available memory 1.63 GB. CPU<br />

opterećenje je nisko, ali nije korišteno reportiranje, inače bi CPU opterećenje bilo značajno. Non-IO<br />

Desktop heap size postavljen an 2048 K (objašnjeno kasnije)<br />

115


Slika 11 Prikaz zauzeća memorije od Forms (formsweb.exe) procesa kod 326 korisnika (onako kako<br />

ga vidi Task Manager). S ovim brojem procesa i linearnom ekstrapolacijom zauzeća memorije odavno<br />

bismo probili (zajedno s iAS instalacijom) limit od punih 4 GB (a kamoli 2 GB rezerviranog za privatne<br />

procese), nije korišten nijedan opcionalni memorijski switch (/ 3GB ili /USERVA)<br />

116


Slika 12 Slika procesa na sustavu s pet korisnika dobivena putem Process Explorer-a, Forms procesi<br />

frmweb.exe su potprocesi Oracle servisa<br />

117


Slika 13 Slika procesa na sustavu s tridesetak korisnika dobivena putem Process Explorer-a, Forms<br />

procesi frmweb.exe su potprocesi Oracle servisa<br />

118


Slika 14 OracleFRHomeProcessManager servis kojem pripada opmn.exe proces čiji su potprocesi<br />

Forms procesi frmweb.exe<br />

6. KONFIGURACIJA INSTALACIJE<br />

Da bi iAS mogao podnijeti veliki broj korisnika uz uobičajene konfiguracijske datoteke potrebno je<br />

modificirati Windows heap size i broj istovremenih konekcija (ne user-a) u Apache-ju.<br />

6.1. Heap Size<br />

Kod podizanja Windows operacijskog sustava rezerviraju se različita područja u memoriji za<br />

praćenje svojih resursa. Tu spada i relativno nepoznat Windows desktop heap, [14, 15]. Na windows<br />

operacijskim sustavima desktop heap pohranjuje informacije o različitim procesima koji se odvijaju na<br />

stroju. Memorijska alokacija heap-a upravljana je brojem otvorenih aplikacija, prozora, servisa i drugih<br />

resursa. Kod pokretanja velikog broja procesa potrebna rezervirana memorija za heap može biti<br />

nedostatna. Stoga treba modificirati rezervirani heap size. Ukupni heap size je na Windows 2000<br />

Server-u bio limitiran na svega 48 MB (to uključuje zbirno IO desktop, Non-IO desktop i shared heap<br />

size). Stoga, ako se željelo povećati zzzz trebalo je istovremeno obično smanjiti broj servisa (odnosno<br />

ukloniti servise koji nisu esencijalni) i smanjiti ponešto yyyy. Zbog takvog ograničenja na veličinu Non-<br />

IO Desktop heapsize u stvarnosti je postojalo ograničenje od oko 120 istovremenih korisnika na iAS-u.<br />

Međutim, na Windows Server 2003 i 2008 heapsize limit je praktički neograničen (ograničen<br />

raspoloživom memorijom).<br />

Kada pokrenete veliki broj programa za sustav Windows, poruke o pogrešci "Out Of Memory"<br />

(Nema dovoljno memorije) pojavljuju se kada pokušate pokrenuti nove programe ili kada pokušate<br />

koristiti programe koji su već pokrenuti, premda je još uvijek dostupno dovoljno fizičke memorije i<br />

memorije stranične datoteke.<br />

http://support.microsoft.com/kb/126962<br />

119


Informacija o veličini heap-a pohranjena je u registry-ju:<br />

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems<br />

Tipičan sadržaj key-ja je:<br />

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512<br />

Windows=On SubSystemType=Windows ServerDll=basesrv,1<br />

ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2<br />

ProfileControl=Off MaxRequestThreads=16<br />

Veličina heap-a je definirana u dijelu SharedSection<br />

Default-ne vrijednosti su 1024,3072,512<br />

Sve vrijednosti su u kilobajtima. (K).<br />

Kao što vidimo veličina heap-a je određena s tri parametra:<br />

SharedSection = xxxx,yyyy,zzzz<br />

Pri tome je<br />

xxxx = System-wide Heapsize. Nema potrebe za modifikacijom ove vrijednosti<br />

yyyy = IO Desktop Heapsize. To je the heap za memorijske objekte u IO Desktop-u<br />

IO Desktop heap koriste programi koji se pokreću putem ikone ili iz komandne linije, ili su pak<br />

potprocesi pokrenuti od prethodnih programa.<br />

Ni ova vrijednost se ne treba modificirati (na Windows 2000 Server-u vrijednost se mogla<br />

modificirati na nižu vrijednost samo iz razloga da se sačuva ograničeni memorijski prostor od 48 MB<br />

za treću vrijednost)<br />

zzzz = Non-IO Destop Heapsize. To je veličina heap-a za memorijske objekte u Non-IO Desktop-u<br />

Non-IO Destop heap rezerviran je za servise i potprocese pokrenute od servisa.<br />

Ova vrijednost je pridjeljena svakom Windows servisu (misli se na servise kojima pristupamo<br />

preko Administrative Tools > Services).<br />

Ukupna veličine memorije potrebne za heap je:<br />

xxxx + (broj memorijskih objekata u IO Desktopu) * yyyy + (broj Windows servisa) * zzzz (1)<br />

Zašto moramo konfigurirati Non-IO Desktop Heapsize?<br />

Forms procesi su potprocesi OracleFRHomeProcessManager servisa kojem pripada opmn.exe Svaki<br />

servis u Windows OS-u može imati ograničen broj potprocesa koji je određen sa Non-IO Desktop<br />

Heapsize. Osim frmweb.exe potprocesa svaki Windows servis ima još desetak drugih potprocesa<br />

(slike 12-14), svi ostali potprocesi su Forms potprocesi (frmweb.exe). Svi ti frmweb.exe potprocesi su<br />

potprocesi OracleFRHomeProcessManager servisa. Jedan potproces zauzima oko 6.5 K.<br />

Broj procesa za heap size je približno, [16]:<br />

gdje su:<br />

P – boj procesa<br />

H – Veličina za heap u KBytes<br />

H<br />

P = (2)<br />

6.<br />

5<br />

120


Stoga ako umjesto 512 K postavimo Non-IO Desktop Heapsize od 2048 K možemo uslužiti oko<br />

300 korisnika. Ako imamo Non-IO Desktop Heapsize od 3072 K možemo uslužiti oko 450 korisnika. U<br />

Oracle Note: 187455.1 navedeno je da su kod vrijednosti od 5112 postigli više od 700 istovremenih<br />

korisnika (doduše oni su koristili Windows 2000 pa su zbog limita na Non-IO Desktop Heapsize, a da<br />

bi postavili veći heap Apache pokretali iz komandne linije, a modificirali IO Desktop Heapsize na 5112,<br />

jer kao što je već napomenuto se u Windows 2000 zbog ukupnog 48 MB limita na ukupni heap, Non-<br />

IO Desktop Heapsize nije se mogao postaviti na iznad 768 K. Na Windows 2003 i 2008 praktički nema<br />

ovog limita pa se može mijenjati Non-IO Desktop Heapsize, a Apache pokretati uobičajeno, kako je<br />

predviđeno i postavljeno samom instalacijom).<br />

Vrijednosti za heapsize preporučljivo je postavljati da budi višekratnici od 512 K, ali nije uvjet.<br />

Nakon promjene vrijednosti potrebno je restartati server.<br />

Autor je postavio Non-IO Desktop Heapsize na 2048 (Windows Server 2003) i pokrenuo 326<br />

jednostavnih aplikacija (formi). Isto tako je bio u kontaktu s administratorom iAS-a jedne vanjske tvrtke<br />

koji je imao oko 300 korisnika na stroju, a ima informacije o preko 400 korisnika jednostavne aplikacije<br />

pokrenute na putem stress testera.<br />

U praksi treba uzeti u obzir da pojedine aplikacije mogu intenzivno koristiti Oracle reporte što<br />

predstavlja značajno opterećenje za CPU i ponešto memoriju, pa u praksi vrijednosti mogu biti nešto<br />

niže. Naravno, kod velikog CPU opterećenja varijanta s virtualnim strojevima ne bi bila u prednosti.<br />

6.2. Određivanje najvećeg broja istovremenih konekcija<br />

Druga važna odluka je određivanje maksimalnog broja istovremenih konekcija koje za potrebni<br />

broj korisnika HTTP server mora opslužiti, inače čekaju u redu (queue) što ne želimo da korisnik<br />

primijeti. Svaka aktivna sesija konzumira jednu konekciju dok ne istekne KeepAliveTimeout parametar<br />

u Apache httpd.conf. Kod učitavanja reporta kod korisnika kratkotrajno se aktivira još jedna konekcija<br />

(dok se ne npr. ne učita cijeli pdf). Pasivne sesije ne koriste ni jednu konekciju (osim kratkotrajno<br />

svakih 30 minuta, zbog Forms heartbeat-a). Od ukupnog broja korisnika prema Paretovom principu,<br />

[17], 20% korisnika će proizvesti 80% aktivnosti (i konekcija) na serveru. U slučaju jako motiviranih<br />

korisnika može se koristiti i odnos 70:30. Ako imamo npr. 300 korisnika, njih 20% (60) proizvesti će<br />

80% prometa, a ostalih 80% (240) preostalih 20% prometa. Ako pretpostavimo da pozivanje reporta<br />

čini 5% aktivnosti i sigurnosni parametar od 25% onda za 300 korisnika uz 80:20 odnos trebamo<br />

300*0,2/0,8*1.05*1.25 ≈ 98 konekcije, a uz 70:30 odnos 300*0.3/0.7*1.05*1.25 ≈ 169 konekcija.<br />

Tipično opterećenje HTTP servera tijekom radnog dana prikazano je na slici 15.<br />

Simultaneous<br />

connections<br />

|<br />

200 |<br />

|<br />

| **********<br />

| **** ***<br />

150 | ***** **<br />

| **** ***<br />

| *** ***<br />

| * **<br />

100 | * **<br />

| * *<br />

| * *<br />

| * *<br />

50 | * *<br />

| * *<br />

| ** *<br />

| *** ***<br />

1 |*** **<br />

Time of +-------------------------------------------------------------<br />

day 7am 8am 9am 10am 11am 12am 1pm 2pm 3pm 4pm 5pm<br />

Slika 15 Broj istovremenih konekcija (ne korisnika) tijekom radnog dana<br />

121


Broj konekcija je ovisan o parametrima KeepAlive - da li dopušta perzistentne konekcije,<br />

(default-na vrijednost je On - tako treba i ostaviti) i KeepAliveTimeout – vrijeme kroz koje Apache čeka<br />

naredni zahtjev prije nego zatvori konekciju (default-na vrijednost 15s). Ovaj parametar je kompromis<br />

između brzine i broja konekcija. Broj istovremenih konekcija određen je parametrom ThreadsPerChild<br />

– to je maksimalni broj konekcija koje Apache server može istovremeno uslužiti, default-na vrijednost<br />

50. ThreadsPerChild radi kao MaxClients parameter na UNIX-u.<br />

Određivanje maksimalnog broja istovremenih konekcija možemo još bolje utvrditi<br />

eksperimentalno, a treba biti zasnovano na podacima iz dijela dana kad je opterećenje najveće.<br />

Najveći broj istovremenih konekcija je u korelaciji s brojem korisnika koji pristupaju aplikacijskom<br />

serveru. Korisnik može uspostaviti od do istovremenih konekcija. Isto tako konekcije mogu biti<br />

definirane u Apache httpd.conf datoteci kao trajne ili privremene, a u tom slučaju treba biti definirano<br />

vrijeme trajanja konekcije. Treba imati u vidu da je najveći broj korisnika redovito neaktivan (nisu za<br />

računalom, nisu u uredu itd.) premda imaju uspostavljenu sesiju. Uobičajen način određivanja<br />

najvećeg broja istovremenih konekcija je uz pomoć monitoringa mod_status reporta tijekom dana dok<br />

se dovoljno dobro ne shvati tipično korištenje aplikacijskog servera, [18].<br />

Monitoring<br />

with<br />

mod_status<br />

1. Add these directives to httpd.conf, or uncomment the ones already there:<br />

#<br />

# Allow server status reports, with the URL of http://servername/server-status<br />

# Change the ".your_domain.com" to match your domain to enable.<br />

#<br />

<br />

SetHandler server-status<br />

Order deny,allow<br />

Deny from all<br />

Allow from localhost szg01ias10g02.data.centar szg01ias10g02<br />

Allow from spi-dmiljkovic.data.centar<br />

<br />

2. Request the /server-status page (http:// szg01ias10g02/server-status/) from the web<br />

server at busy times of the day and look for a line like the following:<br />

192 requests currently being processed, 287 idle workers<br />

3. The number of requests currently being processed is the number of simultaneous<br />

connections at this time. Taking this reading at different times of the day can be used to<br />

determine the maximum number of connections that must be handled.<br />

(Prema IBM HTTP Server Performance Tuning)<br />

Naravno, da bi uopće mogli očitati velike vrijednosti za broj istovremenih konekcija one moraju<br />

prije biti i konfigurirane s ThreadsPerChild. Međutim nije dobro za ThreadsPerChild postavljati<br />

prevelike vrijednosti (reflektira se ponešto na zauzeće memorije). Na primjer, ako imamo 300<br />

korisnika, možemo pokušati s vrijednosti ThreadsPerChild od 150, pa vidjeti putem monitoringa koliki<br />

je stvaran maksimalan broj konekcija, ako je to npr. 100 onda možemo dodati sigurnosni faktor od<br />

25% što je 125, pa ThreadsPerChild vratiti sa 150 na 125. Ako bi broj konekcija bio vrlo blizak<br />

parametru ThreadsPerChild onda ga možemo malo povećati, npr. za istih 25%. Mogli bi ići i obrnutim<br />

putem, od malog iznosa ka većem, ali onda bi nam test uzastopno pucao sve dok ne bi postavili<br />

odgovarajuću vrijednost (uvećanu za sigurnosni faktor). Još jednom treba napomenuti da je ovaj<br />

parametar jako ovisan o KeepAliveTimeout, što je taj parametar veći to je veći i broj potrebnih<br />

konekcija, dok je kod manjeg parametra i broj potrebnih konekcija manji. Međutim male vrijednosti za<br />

KeepAliveTimeout mogu se reflektirati na komfor rada korisnika jer će se javljati situacije gdje će se<br />

ista konekcija opetovano uzastopno uspostavljati.<br />

122


Nakon svega treba spomenuti da kod velikog broja korisnika na iAS-u nije sve u korisnicima<br />

Forms-a. Potrebno je osigurati procesorsku snagu za vršna opterećenja kod intenzivnih reportiranja.<br />

Isto tako sama baza iza aplikacijskog servera također mora biti sposobna izdržati opterećenje koje na<br />

nju postavlja velik broj istovremenih korisnika i transakcija.<br />

7. ŠTO AKO IMAMO LINUX<br />

Sličan problem kao kod 32-bitnih Windows operacijskih sustava javlja se i kod 32-bitnih Linux<br />

instalacija, [19, 20]. Linux kernel dijeli adresni prostor u omjeru 3:1 za korisnički prostor u odnosu na<br />

kernel. Stoga odmah, bez uporabe posebnih switch-eva imamo za iAS na raspolaganju nešto malo<br />

više memorije nego kod kod Windowsa. Dakle memorija ni kod opterećenja od nekoliko stotina<br />

korisnika ne bi smjela biti problem.<br />

Veća memorija za korisnike Linux-a moguća je ako se koristi PAE kernel (specifičnost Intel<br />

procesora), ali opet, iAS 10g je relativno stariji software i nije pisan da bude PAE aware pa od toga<br />

nemamo koristi.<br />

Ako se ne koristi PAE kernel:<br />

1. Maksimalan fizički RAM za kernel i sve procese je ovisan o BIOS-u I tipično je ograničen na<br />

3.25 GB<br />

2. Svaki proces je ograničen na 3 GB, a kernel na 1 GB.<br />

8. NOVE 64 BITNE INSTALACIJE<br />

Kod novih 64-bitnih proizvoda kao što je Weblogic aplikacijski server nema memorijskog<br />

ograničenja kao kod 32 bitnih sustava. Memorije redovito ima više nego dovoljno. Nažalost iAS 10g ne<br />

postoji u 64-bitnoj izvedbi.<br />

9. ZAKLJUČAK<br />

Dobro konfiguriran iAS može podnijeti 300-400 korisnika Forms-a (toliko je sigurno isprobano).<br />

Zbog osiguranja kapaciteta za intenzivno reportiranje i u skladu s time zahtjeva na CPU u praksi bi se<br />

trebalo ograničiti na 250 korisnika po jednom tipičnom fizičkom serveru (kakve imamo u datacentru)<br />

kako bi bile podmirene vršne potrebe.<br />

Virtualizaciju ima smisla primijeniti jedino kad imamo još neke druge planove (seljenje virtualnih<br />

strojeva između fizičkih servera ili pak želimo na virtualnom stroju unutar fizičkog servera instalirati još<br />

nešto drugo). Limiti za broj korisnika su zbog zahtjeva na CPU u slučaju intenzivnog reportiranja isti.<br />

Pri tome imamo dodatne troškove licenciranja za OS i Oracle iAS (osim ako se ne koristi Oracle VM).<br />

Isto tako virtualizacija bi imala smisla na vrlo velikim fizičkim serverima s puno CPU jezgara (npr. 16,<br />

64 i više).<br />

Ako ne želimo koristiti napredne funkcije virtualizacije (seljenje virtualnih servera između fizičkih<br />

servera) trebalo bi koristiti jedan dobro konfiguriran iAS. Čak ako smo veliki ljubitelji virtualizacije, na<br />

virtualnim strojevima trebali bi korektno konfigurirati iAS umjesto da virtualizacijom otklanjamo potrebu<br />

za detaljnijom konfiguracijom iAS-a.<br />

Što se tiče održavanja, općenito uzevši jedan veći server znači manje održavanja, ali manje opcija<br />

ako se što pokvari. Više malih iAS-a na virtualnim strojevima zahtijeva više održavanja, ali pruža više<br />

fleksibilnosti kod održavanja i konfiguriranja (možemo spuštati jedan po jedan VM). Ako se pojedini<br />

iAS sruši preostali na virtualnim strojevima i dalje rade (srećom, današnji OS-ovi i iAS su vrlo<br />

pouzdani i mogu raditi mjesecima bez restarta). Međutim treba na neki način riješiti load balancing, a<br />

ako računamo na i visoku raspoloživost, a ne samo kapacitet, to rješenje ne smije imati single point of<br />

failure i mora uključivati mehanizme za brzu i periodičku provjeru ispravnosti instance iAS-a na VM<br />

(kako cluster ne bi uključivao neispravnu instancu iAS-a).<br />

Ako pak nismo zadovoljni sa 250 korisnika na jednom fizičkom serveru, dobro bi bilo razmisliti o<br />

potencijalnim posljedicama ispada jednog takvog, danas relativno jeftinog fizičkog servera (bez obzira<br />

na rješenje s jednim iAS-om ili više njih i VM). Veći kapacitet i raspoloživost možemo postići<br />

clusteriranje odvojenih pojedinačnih instalacija iAS-a (svaka na svom fizičkom serveru bez korištenja<br />

virtualizacije) na uobičajen način korištenjem NLB-a ili nekog load balancera. Postići ćemo jako veliki<br />

kapacitet, a nećemo plaćati troškove licenciranja kao kod instalacije brojnih malih iAS-a na virtualnim<br />

strojevima.<br />

123


10. LITERATURA<br />

1. Oracle Metalink Note: 187455.1, After 82 Sessions / Users / Connections Errors Come up or no<br />

new connection possible<br />

2. FRM-92101: There was a failure in the forms server during startup,<br />

http://www.orafaq.com/forum/t/143576/2/<br />

3. Microsoft podrška, Poruka o pogrešci "Out of Memory" (Nema dovoljno memorije) pojavljuje se<br />

kada je pokrenut veliki broj programa, ID članka: 126962,<br />

http://support.microsoft.com/kb/126962/hr<br />

4. E. Lippert, “Out Of Memory” Does Not Refer to Physical Memory, Fabulous Adventures In Coding,<br />

http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physicalmemory.aspx<br />

5. Implementing Microsoft Network Load Balancing in a Virtualized Environment,<br />

http://www.vmware.com/files/pdf/implmenting_ms_network_load_balancing.pdf<br />

6. Creating an NLB Cluster using Hyper-V,<br />

http://sharepointviews.blogspot.com/2008/11/creating-nlb-cluster-using-hyper-v.html<br />

7. Oracle Application Server Forms Services 10g (9.0.4) Capacity Planning Guide, An Oracle White<br />

<strong>Paper</strong> November 2004<br />

8. Oracle Forms Services Release 6i Capacity Planning Guide, 2000<br />

9. J. Garmany i D. K. Burleson, Oracle Application Server 10g Administration Handbook; Oracle<br />

Press, McGraw-Hill, 2004<br />

10. Ask Aresh, 32-bit Memory Management Explained, http://askaresh.blogspot.com/2008/11/32-bitmemory-management-explained.html<br />

11. How to use the /userva switch with the /3GB switch to tune the User-mode space to a value<br />

between 2 GB and 3 GB, http://support.microsoft.com/kb/316739<br />

12. Physical Address Extension - PAE Memory and Windows, http://msdn.microsoft.com/enus/windows/hardware/gg487503<br />

13. Explanation of Pagefile Usage as reported in the Task Manager,<br />

http://blogs.technet.com/b/perfguru/archive/2008/01/08/explanation-of-pagefile-usage-as-reportedin-the-task-manager.aspx<br />

14. Desktop Heap Overview, Part I,<br />

http://blogs.msdn.com/b/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx<br />

15. Desktop Heap Overview, Part II,<br />

http://blogs.msdn.com/b/ntdebugging/archive/2007/07/05/desktop-heap-part-2.aspx<br />

16. E. Marechal, Windows and the ClearCase process limit: Understanding the desktop heap,<br />

http://www.ibm.com/developerworks/rational/library/05/1220_marechal/<br />

17. Pareto principle, http://en.wikipedia.org/wiki/Pareto_principle<br />

18. IBM HTTP Server Performance Tuning,<br />

http://publib.boulder.ibm.com/httpserv/ihsdiag/ihs_performance.html<br />

19. Linux 32 bit OS and 4GB memory limit, http://www.linuxquestions.org/questions/linux-general-<br />

1/32-bit-os-and-4gb-memory-limit-707762/<br />

20. LinuxRamLimits, http://www.spack.org/wiki/LinuxRamLimits<br />

124


METODE BALANSIRANJA OPTEREĆENJA (LOAD BALANCINGA) ZA<br />

APLIKACIJSKE SERVERE<br />

METHODS FOR LOAD BALANCING FOR APPLICATION SERVERS<br />

Dubravko Miljković<br />

HEP-SIT, Vukovarska 37, Zagreb<br />

Mob: 098 9825602<br />

E-mail: dubravko.miljkovic@hep.hr<br />

SAŽETAK<br />

Da bi se osigurala potrebna raspoloživost, kapacitet i skalabilnost web aplikacija u poslovnim<br />

sustavima s velikim brojem korisnika uobičajeno je korištenje nekog oblika balansiranja opterećenja<br />

(load-balancinga). Razmotrena su slijedeća rješenja: Round Robin DNS, Hardware Load Balancing,<br />

Software Load Balancing: Oracle i Load Dispatcher te Windows NLB. Odlučujući faktori za odabir<br />

rješenja uključuju raspoloživa svojstva, složenost implementacije, povećanje raspoloživosti i cijenu.<br />

Opisani su mehanizmi provjere ispravnosti noda, održavanje perzistentne sesije i mogućnost<br />

asimetričnih opterećenja. Prikazano je rješenje raspoređivanja opterećenja u geografski disperziranom<br />

sustava pogodnom za veće organizacije sa više regionalnih centara.<br />

ABSTRACT<br />

To provide necessary availability, capacity and scalability of web applications in business systems<br />

with large number of users it is common to use some kind of load balancing. Following solutions are<br />

considered: Round Robin DNS, Hardware Load Balancing, Software Load Balancing (built in Oracle<br />

iAS and Load Dispatcher) and Windows NLB. Decisive factors influencing choice of solution includes<br />

available features, complexity of implementation, increased availability and price. Mechanisms for<br />

node health check, maintaining persistent session and handling asymmetric loads are presented.<br />

Solution for load distribution in geographic distributed system suitable for larger organizations with<br />

more regional centers is also described.<br />

1. UVOD<br />

Za osiguranje potrebne raspoloživosti, kapaciteta i skalabilnosti web aplikacija uobičajeno je<br />

korištenje farmi aplikacijskih servera. Između klijenta i farme aplikacijskih servera potrebno je imati<br />

metodu koja će raspoređivati ulazne http zahtjeve na individualne servere unutar farme, [1, 2]. Load<br />

balancer kao postupak ili uređaj presreće mrežni promet i usmjerava ga prema različitim serverima.<br />

Sama farma aplikacijskih servera se prema van predstavlja preko jedinstvene virtualne adrese (kao<br />

jedinstven server). Za postizanje visoke raspoloživosti load balancing treba detektirati neispravan<br />

server i automatski ga izostaviti iz raspoređivanja prometa (nažalost korisnici Forms aplikacija morati<br />

će se ponovno konektirati, ali će im load balancer to odmah omogućiti). U slučaju potrebe za većim<br />

kapacitetom sustava load balancing omogućuje skalabilnost, dovoljno je dodati novi server. Load<br />

balancing omogućuje i fleksibilnost u radu farme jer se pojedinačni server može za potrebe<br />

održavanja privremeno uklonit iz farme.<br />

Slika 1 Load balancer i farma web servera<br />

125


2. METODE BALANSIRANJA PROMETA<br />

Slijedi kratak pregled metoda za load balancing. (postoje i drugačija podjele, zasnovana na<br />

mrežnom Layeru gdje se odvija balansiranje).<br />

2.1. Round Robin DNS<br />

Predstavlja najjednostavniji način distribucije opterećenja. Round-robin DNS radi na način da DNS<br />

server odgovara na zahtjev ne sa jednom IP adresom, već sa više IP adresa servera koji pružaju istu<br />

web uslugu [1, 2, 3]. Temelj ove metode predstavlja redoslijed IP adresa koje DNS server vraća<br />

klijentu. Sa svakim novim zahtjevom permutira se (točnije rotira) lista IP adresa koje kao odgovor šalje<br />

DNS server. Klijent obično koristi prvu vraćenu adresu. Na taj način različiti pozivi klijenata su usluženi<br />

od različitih servera čime se cjelokupno distribuira opterećenje raspodjeljuje između svih servera. Npr.,<br />

ako su adresi web usluge dodijeljene tri IP adrese, prvi klijent će pristupiti prvoj IP adresi, drugi drugoj<br />

IP adresi, treći trećoj IP adresi, četvrti opet prvoj IP adresi itd. Evo jednog primjera unosa u DNS<br />

serveru s višestrukim A rekordima:<br />

; zone file fragment<br />

IN MX 10 hepweb<br />

....<br />

hepweb IN A 192.168.0.4<br />

IN A 192.168.0.5<br />

IN A 192.168.0.6<br />

192.168.0.4, 192.168.0.5, 192.168.0.6<br />

192.168.0.5, 192.168.0.6 ,192.168.0.4<br />

192.168.0.6 ,192.168.0.4, 192.168.0.5<br />

Premda je sama metoda vrlo jednostavna ona pati od ozbiljnih nedostataka. Na DNS serveru i/ili<br />

klijentu obično je uključena subnet prioritizacija (subnet prioritization) koja u slučaju korištenja servera<br />

na različitim mrežama uređuje redoslijed IP adresa na način da prva adresa bude ona (po IP metrici –<br />

pojednostavljeno to je sličnost IP adresa klijenta i servera) iz najbliže mreže. Premda ovo može biti<br />

čak i zgodno kod geografski disperziranih sustava, subnet prioritizacija će istom klijentu kod<br />

uzastopnih upita uvijek na prvom mjestu vratiti IP adresu istog (po IP metrici najbližeg) servera. Na taj<br />

način ako pojedine regije imaju različiti broj klijenata, zahtjevi klijenata neće se ravnomjerno<br />

raspoređivati po serverima već po kriteriju subnet prioritizacije i pripadne IP metrike. Drugi problem je<br />

taj što DNS serveri i klijenti obično koriste cache, pa uzastopni zahtjevi ne moraju biti raspoređeni na<br />

različite servere. Ponešto može pomoći korištenje malih vrijednosti TTL (Time To Live), ali to<br />

povećano opterećuje DNS server. Treći problem je što Round Robin DNS ne vodi računa o stvarnoj<br />

raspoloživosti servera koji osigurava uslugu klijenta. Ukoliko server ispadne iz funkcije, Round Robin<br />

DNS će i dalje klijentima dostavljati IP adresu neraspoloživog servera (ne uključuje fault-tolerance).<br />

Četvrti problem je što round robin DNS jednako raspodjeljuje promet na servere ne vodeći računa o<br />

kapacitetu pojedinog servera. Ovaj nedostatak djelomično se može otkloniti varijantom Weighted<br />

Round-Robin DNS gdje se svakom serveru dodjeljuje određen težinski faktor:<br />

Resource Weight<br />

-------- ------<br />

server1 4<br />

server2 12<br />

server3 1<br />

U gornjem primjeru od 17 zahtjeva 4 će biti raspoređena na prvi server, 12 na drugi i 1 na treći<br />

server. Nažalost Weighted Round-Robin DNS nije standardiziran na DNS serverima.<br />

Treba imati u vidu i ponašanje web browsera u slučajevima kad su mu je dostavljeno više IP<br />

adresa za istu web adresu. Microsoft Internet Explorer (IE) kad ne može dohvatiti prvu IP adresu<br />

nakon 20 sekundi pokušat će dohvatiti narednu od dostavljenih IP adresa. Pri tome treba osigurati da<br />

web server koji nije raspoloživ ne smije imati aktivnu web stranicu (npr. server može biti djelomično<br />

ispravan i imati aktivnu web stranicu čime prema vanjskom svijetu daje dojam potpune ispravnosti).<br />

Postoje i jednostavna programska rješenja gdje se ciklički ispituje stanje svih web servera koji pružaju<br />

126<br />

2


uslugu klijentima i u slučaju ispada pojedinog servera obavlja se automatska intervencija na DNS<br />

serveru tako da se privremeno ukloni record koji pripada neraspoloživom web serveru. Nakon što<br />

dotični server ponovo postane dostupan njegov record se ponovo automatski dodaje u DNS server.<br />

Primjer takvog programa je Simple Failover, [4]. Na slijedeće dvije slike ilustriran je rad tog programa.<br />

Slika 2 Round robin i ispad servera Slika 3 Round robin sa Simple Failover<br />

2.2. Hardware Load Balancing<br />

Hardware load balanceri (Hardware Load-balancing Device HLD) obično su integrirani unutar<br />

modernih router-a (layer 4-7 router). Mogu opsluživati izuzetno velike promete, ali nemaju velike<br />

mogućnosti konfiguriranja. Isto tako ovo rješenje je vrlo skupo za male i srednje velike poslovne<br />

sustave. Uobičajene su izvedbe kao programska rješenja na posebnom brzom hardware-u<br />

(Application-Specific Integrated Circuit - ASIC) ili pak kao zasebne kombinacije custom hardware i<br />

software-a na nekoj varijanti LINUX-a ili custom OS-a. Česte su redundantne izvedbe (dual core) čime<br />

se uklanja load balancer kao potencijalni single point of failure. Uobičajeni implementirani load<br />

balancing algoritmi su slijedeći: round robin, weighted round robin, least connections, weighted least<br />

connections, server latency i direct server measurement (uporabom server feedback-a). Posljednje<br />

rješenje je napredno i uzima u obzir trenutno opterećenje servera na destinaciji, [5]. Konfiguracija<br />

redovito spada u domenu osoblja za održavanje mrežne opreme, rijetko će to obavljati sistem<br />

administratori, pa treba uzeti u obzir potrebu koordinacije kadra.<br />

Slika 4 Hardware load balancer koji uzima u obzir opterećenje servera (agenti na serverima)<br />

127<br />

3


2.3. Software Load Balancing<br />

Load balancing je tradicionalno poistovjećivan sa posebnim hardware-om. Međutim load<br />

balancing može se realizirati i kao programsko rješenja na konvencionalnim serverima. Spomenuti<br />

ćemo i Oracle iAS web cache koji se može obavljati funkciju jednostavnog load balancera.<br />

Slika 5 Oracle web cache load balancer<br />

Slika 6 Oracle web cache load balancer s primjenom težinskih faktora<br />

128<br />

4


• OracleAS Web Cache arhitektura<br />

iAS Web cache ne omogućuje samo cache-ing statičkih web stranica, već i jednostavnu formu<br />

load balancinga, [6]. Pri tome se kod konfiguriranja navedu svi serveri u farmi. Sam web cache može<br />

biti na aktiviran na odvojenom (aplikacijskom) serveru ili pak na jednom od postojećih aplikacijskih<br />

servera. Omogućeno je pridjeljivanje različitih težinskih faktora ovisno o kapacitetu pojedinog servera<br />

(weighted availability capacity). Samo balansiranje odvija se po round robin metodi. Slično rješenje<br />

postoji i za instance u Weblogic clusteru (Administrator console). Postoji i mogućnost failover-a<br />

(ugrađena jednostavna detekcija pada instance – mogućnost dohvata stranice Apache servera).<br />

Međutim u oba slučaja ostaje problem jedne pristupne točke za korisnike (single-point of failure).<br />

Stoga su prethodna rješenja pogodna za clusteriranje instanci unutar istog hardverskog servera.<br />

• Programski load balancer (load dispatcher) na konvencionalnom serveru<br />

Load dispatcher (sinonim za load balancer, ali češće se koristi u nazivima softverskih balancera)<br />

je potpuno programsko rješenje raspoređivanja prometa. Realizirano je kao programski paket koji se<br />

vrti na posebnom serveru. Današnji hardware je vrlo brz tako da ovakvo rješenje zadovoljava gotovo<br />

sve potrebe (reda 10000 novih konekcija po sekundi). S druge strane programska realizacija donaša<br />

izrazito veliku fleksibilnost kod definiranja politike raspoređivanja prometa. Uobičajena su slijedeća<br />

load balancing pravila: round robin, weighted round robin, perceptive (predviđa najprikladniji nod<br />

kombinirajući broj konekcija i vrijeme odziva), least connections (nod s najmanje konekcija), weighted<br />

least connections, fastest response time (nod s najbržim vremenom odziva), random node itd. Kao i<br />

kod hardware load balancera ukoliko se želi postići balansiranje prometa zasnovano na opterećenjima<br />

pojedinih servera postoje agenti koji se instaliraju na servere – server feedback (mogu obavljati i<br />

provjeru ispravnosti aplikacije). Ukoliko se želi ostvariti i visoka raspoloživost potrebno je koristiti dva<br />

balancera (u active-standby ili active-active konfiguraciji), [1, 2] da bi se izbjegla single point of failure.<br />

Slika 7 Software load balancer ispred Weblogic servera<br />

Slika 8 Software load balancer za visoku raspoloživost (primarni balancer i backup)<br />

129<br />

5


• HTTP redirector<br />

Ograničen su samo na HTTP promet. HTTP zahtjev preusmjerava sa HTTP redirectd komandom<br />

direktno na pojedini aplikacijski server [2]. Početno se pristupa adresi redirectora, ali se u browseru<br />

ubrzo vidi adresa odabranog aplikacijskog servera. Ovisno o složenosti programskog rješenja moguće<br />

su i različite opcije preusmjeravanja. Najjednostavnija rješenja susreću se u obliku Perl skripti (random<br />

node, round robin, IP address based - geotargeting). Ovakve skripte dostupne su na internetu, [7], a<br />

mogu se jednostavno dodatno modificirati za konkretnu primjenu (npr. regionalnu redirekciju po IP<br />

adresi, umjesto redirekciju po državi korisnika). Primjer jednog drugog složenijeg Perl load balancera<br />

je freeware Perbal, [8].<br />

Software load balanceri su jeftiniji i imaju veće mogućnosti konfiguriranja od hardware load<br />

balancera (npr. mogu usmjeriti promet na nod koji optimalno može uslužiti zahtjev, url swithing –<br />

prefix, pattern, sufix) Postoje i besplatne verzije kao npr. Zen Load Balancer.<br />

2.4. Windows NLB<br />

Microsoft Windows Clustering podržava slijedeće dvije cluster tehnologije: NLB (Network Load<br />

Balancing) cluster i Server cluster, [9]. Za nas je bitna NLB cluster tehnologija koja omogućuje<br />

distribuiranje opterećenja između više servera što je pogodno za web aplikacije. Pri tom je svaki<br />

server sposoban samostalno opsluživati aplikaciju, a NLB samo balansira promet na raspoložive<br />

servere. Balansiraju se mrežne konekcije. Međutim pri velikom broju korisnika, broj konekcija po<br />

serveru jako dobro aproksimira i stvarno opterećenje servera. Svaki server trebao bi imati (premda<br />

nije uvjet) po dvije mrežne kartice, jednu za NLB (balansirani) promet i jednu za običan promet ka i od<br />

servera. Primjena samo jedne kartice je moguća ali postavlja određena ograničenja (samo multicast<br />

mode i onemogućena komunikacija između servera unutar NLB clustera, moguća je komunikacija<br />

servera samo prema van i obratno). Serveri se spajaju na mrežu kao na zajednički bus. Ne postoji<br />

posebna međusobna veza između servera u clusteru (interconnect). Dizajn je fault-tolerant i nema<br />

single point of failure. Windows 2008 podržava do 32 noda spojena u NLB koji trebaju biti na istom<br />

fizičkom subnetu (i lokaciji) osima ako se ne koristi VLAN (to donosi problem jedne pristupne točke).<br />

Slika 9 NLB Setup - kartice su na mreži kao na paralelnom bus-u, nodovi su ravnopravni, nema<br />

vanjskog load balancera, eliminiran single point of failure<br />

Slika 10 Windows NLB Stack<br />

130<br />

6


Network Load Balancing cluster ostvaruje visoku raspoloživost na slijedeća tri načina:<br />

1. Periodična razmjena poruka – heartbeat message<br />

2. Konvergencija – promjena stanja clustera inicira postupak konvergencije. Članovi clustera se<br />

međusobno informiraju o svojim stanjima i određuje se nova distribucija opterećenja na preostale<br />

aktivne članove clustera<br />

3. Raspoloživost tijekom planiranih isključenja – pojedinačni serveri unutar clustera mogu se stavit<br />

van pogona dok cluster dalje nesmetano radi<br />

Na slikama je predstavljena je konfiguracija NLB-a (obavlja se s Network Load Balancing Manager-om)<br />

Slika 11 Dodavanje novih nodova u NLB cluster (Windows 2003 i 2008)<br />

Slika 12 Host parameters – default state stopped Slika 13 Cluster IP address (virtual address)<br />

Slika 14 Cluster parameters - unicast Slika 15 Port rules – Load Equal, Affinity Single<br />

131<br />

7


Windows NLB je u svojim počecima bio zamišljen da radi preko hub-a (ne preko switch-a). Danas se<br />

to redovito rješava direktnim spajanjem NLB mrežnih kartica na switch. Pri tome je potrebno na<br />

mrežnoj NLB kartici osposobiti IP Forwarding (windows 2008).<br />

netsh interface ipv4 set int "[name of the NIC]" forwarding=enabled<br />

Napomena: [name of the NIC]=NLB<br />

Na Windows 2000 i 2003 treba u registry-ju postaviti:<br />

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter<br />

Value Name: IPEnableRouter<br />

Value type: REG_DWORD<br />

Value Data: 1<br />

Windows NLB je daleko najrašireniji oblik network load balancinga, ali slično rješenje postoji i za Linux<br />

(lnlb), [10].<br />

3. PROVJERA ISPRAVNOSTI NODA (APLIKACIJSKOG SERVERA)<br />

Balansiranje prometa na server ima smisla samo ako je dotični server ispravan. Utvrđivanje<br />

ispravnosti noda i aplikacije na njemu može biti složeniji zadatak (application health monitoring), |1, 2].<br />

Naime, nije dovoljno samo da na aplikacijskom serveru bude funkcionalan, isto mora važiti za ostale<br />

komponente kao npr. reports serveri itd. Stoga je potrebno dobro definirati kada je nod stvarno<br />

ispravan. Pri tome sama indikacija da je neki servis podignut ne znači da je usluga i stvarno dostupna<br />

pa bi trebalo raditi funkcionalne provjere - probe (npr. učitavanje web stranice, puštanje nekog vrlo<br />

jednostavnog reporta, analiziranje reports log-a itd.). Poželjno je uvesti i dvorazinsku provjeru, brzu i<br />

sporu. Brza (osnovna), jednostavnija provjera kritičnih komponenti (npr. Apache s HTTP GET) obavlja<br />

se jako često, npr svakih nekoliko sekundi i u slučaju neuspjeha služi za trenutno isključivanje servera<br />

iz farme. Budući da se ponavlja u vrlo kratkom intervalu ne smije puno opterećivati CPU (npr.<br />

aplikacija Active Server Watcher).<br />

Slika 16 Active Server Watcher za jednostavne i brze provjere<br />

Detaljna (application specific, HTTP GET s content checks, reports servers, provjera<br />

funkcionalnost servisa – ne samo provjera da li je servis podignut), sporija, provjera obavlja se prije<br />

nego li se server uključi u farmu, kao i nakon toga, ali u ciklusu reda minute. Ova provjera je ponešto<br />

malo zahtjevna za CPU i nije stoga uputno ponavljati je u vrlo kratkom intervalu kao kod brze provjere.<br />

Primjer pogodne aplikacije za ovu namjenu je IPSentry. U narednoj tablici ilustrirana je veza između<br />

raspoloživosti i godišnjeg vremena van pogona. Primijetite da je za ostvarivanje vrlo visoke<br />

raspoloživosti (99,999 %) potrebno reagirati jako brzo u slučaju kvara noda. Ukoliko pretpostavimo da<br />

se kvar bilo kojeg noda (odnosno aplikacije na njemu) u clusteru dešava nekoliko puta u godini,<br />

potrebno je detektirati kvar i rekonfigurirati cluster u roku ispod minute. Inače ćemo osigurati samo<br />

veliki kapacitet, ali ne i raspoloživost.<br />

132<br />

8


Tablica I Raspoloživost, ukupno godišnje vrijeme van pogona i predloženo rješenje<br />

Raspoloživost Godišnje vrijeme van pogona Rješenje (okvirno)<br />

99% 87,6 sati jedan server<br />

99,9% 8,76 sati jedan server, vrlo dobra konfiguracija i održavanje<br />

99,99% 52,5 minuta cluster<br />

99,999% 5,25 minuta cluster, geografski disperzirani cluster<br />

Slika 17 IP Sentry za detaljne provjere I Slika 18 IP Sentry za detaljne provjere II<br />

4. PERZSTENCIJA, ASIMETRIČNA OPTEREĆENJA,<br />

• Perzistencija<br />

Za razliku od statičnih web stranica koji ma se uzastopno može pristupati s različitih servera<br />

(stateless aplications), Forms aplikacije moraju se od početka do kraja izvesti na istom serveru<br />

(statefull applications). Potrebno je svu komunikaciju tijekom sesije usmjeravati samo na jedan isti<br />

aplikacijski server [1, 2]. Postupak se naziva session persistence ili sticky session. Perzistencije se<br />

ostvaruju na slijedeće načine:<br />

Primjena cookija, load balancer upisuje cookie u browser korisnika (session cookie, kao<br />

kod iAS web cache-a)<br />

IP zasnovana – persistence window, korisnik s iste IP unutar prozora perzistencije<br />

komunicira samo s jednim serverom, kao kod Windows NLB-a, problem s korisnicima iza<br />

proxy-a<br />

• Asimetrična opterećenja<br />

Serveri u farmi nemaju uvijek isti kapacitet te ne bi bilo dobro ravnomjerno raspoređivati sav<br />

promet jednako po serverima nejednakog kapaciteta. Stoga sve opisane metode imaju neku<br />

mogućnost rada sa serverima različitih kapaciteta:<br />

weighting faktor kod round robin<br />

weighting faktor u hardware load balanceru<br />

weighting faktor u software load balanceru<br />

weighting faktor u Windows NLB, [9]<br />

• Problem IP affinity-a (i perzistencije uopće)<br />

IP affinity je dobro rješenja za ostvarenje perzistentnih session-a, ali postavlja se pitanje koliko<br />

vremenski dugo taj affinity treba vrijediti (affinity window) Očigledno ne treba dovijeka zalijepiti<br />

korisnika za pojedini aplikacijski server. Pri primjeni cookija load balancer bi trebao izmijeniti cookie<br />

na kraju sesije (load balancer trebao nekako saznati kad je sesija dovršena, npr putem posebnog jar-a<br />

133<br />

9


iz aplikacije). Kod Windows NLB-a affinity je zasnovan na IP adresi korisnika i vrijedi od uspostave<br />

rada aplikacijskog servera u NLB clusteru pa sve do prekida rada dotičnog servera unutar NLB<br />

clustera. Budući da ne želimo da isti korisnik uvijek bude raspoređen na isti server (npr. dan za<br />

danom) potrebno je ponekad nakratko isključiti server iz NLB-a (resetiranje affinity-a). To se kod NLBa<br />

može obaviti komandom wlbs stop i nakon toga (nakon oko jedne minute) s komandom wlbs start<br />

Sam interval prekida ne smije biti prekratak, u praksi treba ostaviti dovoljno vremena da nlb cluster<br />

sa sigurnošću „shvati“ da mu privremeno nedostaje jedan nod i „zaboravi“ postojeće affinity). Ovo je<br />

pogodno obavljati tijekom noći kada obično nema korisnika na sustavu. To treba napraviti sukcesivno<br />

na više servera (idealno na svim) u NLB clusteru, inače bi korisnik opet završio na istom serveru (jer bi<br />

ujutro drugi serveri zbog affinity opet imali stare korisnike, a dotični server bi bio najmanje opterećen).<br />

• Ponašanje nakon restarta noda<br />

Kod ispada noda obično se obavlja restart servera (kod manjeg kvara prvo se pokuša sa restartom<br />

komponente aplikacijskog servera, pa tek u slučaju neuspjeha restart čitavog servera). Za vrijeme<br />

podizanja noda korisnici će se spajati na preostale aktivne nodove. Ako podizanja noda potraje dulje<br />

vremena, mnogi korisnici s kojima je bila prekinuta komunikacija već će započeti nove perzistentne<br />

sesije (zbog brze prilagodbe clustera na novonastalu situaciju). Stoga će restartani nod biti slabo<br />

opterećen (funkcija vremena oporavka i pristizanja korisnika) sve dok ne stignu potpuno novi korisnici.<br />

Ovaj efekt se može smanjiti osiguravanjem brzog reboota servera (uklanjanje nepotrebnih servisa itd.).<br />

• Opterećenje preostalih nodova<br />

Prilikom dizajniranja load balancinga clustera treba računati da u slučaju ispada jednog noda,<br />

preostali nodovi imaju dovoljan ukupan kapacitet da usluže korisnike. Ako se to ne osigura, a sami<br />

nodovi nemaju neku vrstu zaštite od preopterećenja, ispad jednog noda može izazvati domino efekt i<br />

porušiti sve preostale nodove. Stoga load balancing cluster treba dimenzionirati s jednim serverom<br />

viška (redundancija N+1).<br />

5. GEOGRAFSKI DISPERZIRANI SUSTAV<br />

Opisan je primjer geografski disperziranog sustava koji se koristi u HEP-u, a uključuje četiri iAS<br />

clustera u četiri regionalna centra (Zagreb, Rijeka, Split i Osijek), [12, 13]. U svakom pojedinom<br />

regionalnom centru nalazi se iAS NLB cluster koji može raditi samostalno. Sustavu se pristupa preko<br />

zajedničke web adrese hepweb, bez obzira na lokaciju korisnika. Za usmjeravanje korisnika na<br />

najpogodniji NLB cluster koristi se geotargeting redirekcija. Geotargeting redirekcija je ostvarena<br />

kombinacijom DNS subnet prioritizacije i Perl rediretkora. Redirekcija se obavlja prema regiji korisnika,<br />

a lokano unutar regionalnih clustera, na nivou aplikacijskih servera, primijenjen je Windows NLB.<br />

Koristi se dvorazinska geotargeting redirekcija. Prva razina se obavlja uz pomoć DNS s<br />

uključenom subnet prioritization opcijom. Ova opcija je po defaultu je bila uključena i na računalima<br />

korisnika (Windows 2000, Windows XP). Za zajedničko krovno ime hepweb postoje višestruki<br />

(konkretno četverostruki) A rekordi u DNS-ima unutar HEP-a. Ovi rekordi ukazuju na adrese Perl<br />

redirektora koji se nalaze na svakom clusteru. Perl redirektorima pristupa se preko virtualne adrese<br />

regionalnih regionalnog clustera, npr. http://hepwebzg/apli.html). Perl skripta pri redirekciji uzima u<br />

obzir stanja (raspoloživost i opterećenje) koja clusteri međusobno izmjenjuju (svoje stanje opterećenja<br />

regionalni clusteri oglašavaju na servisnoj web stranici clustera) clustera. Na DNS serverima uključena<br />

je opcija subnet prioritization. Ova opcija uključena je po defaultu i na računalima korisnika (Windows<br />

2000, Windows XP).<br />

Perl redirektori na regionalnim clusterima imaju slijedeće adrese:<br />

hepwebos 10.193.64.116<br />

hepwebri 10.65.64.206<br />

hepwebst 10.129.64.116<br />

hepwebzg 10.1.200.206<br />

Ukoliko korisnik koristi novi adresni sustav (s lokalnim adresama 10.*.*.*) za upit nslookup hepweb<br />

DNS-ovi (s uključenom subnet prioritizacijom) odgovaraju sortiranim adresama Perl redirektora<br />

134<br />

10


Za korisnike iz raznih regija to izgleda ovako:<br />

• Regija Osijek 10.193.64.116, 10.129.64.116, 10.65.64.206, 10.1.200.206<br />

• Regija Rijeka 10.65.64.206, 10.1.200.206, 10.193.64.116, 10.129.64.116<br />

• Regija Split 10.129.64.116, 10.193.64.116, 10.1.200.206, 10.65.64.206<br />

• Regija Zagreb 10.1.200.206, 10.65.64.206, 10.129.64.116, 10.193.64.116<br />

Korisnici na prvom mjestu uvijek dobiju adresu svog regionalnog Perl redirektora. Ukoliko je prva<br />

adresa nedostupna, klijentov IE browser prelazi nakon 20 sekundi na slijedeću adresu vraćenu iz<br />

DNS-a (mehanizam ugrađen u sam IE browser) i dođe do nekog od Perl redirektora dok je ispravan<br />

barem jedan od clustera. U slučaju DNS-a s uključenom subnet prioritizacijom prva razina redirekcije<br />

usmjerava korektno sav promet osim u slučajevima ispada ili preopterećenja regionalnog clustera.<br />

Ako nije uključena subnet prioritizacija na DNS serverima nslookup hepweb pri vraća permutirane<br />

adrese regionalnih clustera (round robin DNS), a sav teret usmjeravanja korisnika na pripadni server<br />

ostaje na Perl skriptama. Sustav radi u oba slučaja, samo kod uključene subnet prioritizacije promet<br />

se korektno usmjeri već na prvoj razini, pa Perl skripta na drugoj razini samo potvrdi (propusti)<br />

redirekciju. Razni mogući problemi kod balansiranja prometa uz pomoć DNS servera na globalnoj<br />

geografskoj razini (pogotovo kad dotični DNS serveri nisu naša nadležnost) spomenuti su u [14, 15, 16].<br />

Drugu razinu redirekcije obavlja Perl skripta koja provjerava kojem od regionalnih adresnih<br />

područja pripada IP adresa korisnika. Potom se vrši redirekcija na aplikativnu adresu pripadnog<br />

regionalnog, obično istog na kojem je i dotični redirektor clustera (to može biti produljena virtualna<br />

adresa pa u slučaju da je ciljni cluster neispravan ne obavlja redirekciju na njega već se redirekcija<br />

obavlja metodom slučajnog izbora između preostalih ispravnih regionalnih clustera (uključivši tu i<br />

cluster na kojem se donosi ta odluka). Na taj način u slučaju ispada jednog clustera po trećina<br />

prometa ravnomjerno se usmjerava na svaki od preostalih regionalnih clustera.<br />

Slika 19 Normalan geografski disperziranog sustava rad sustava<br />

Slika 20 Ispad clustera Rijeka, promet se preusmjerava na drugi cluster (u ovom primjeru Zagreb).<br />

Pri izboru drugog clustera uzimaju se u obzir svi regionalni clusteri koji imaju višak kapaciteta<br />

135<br />

11


6. ZAKLJUČAK<br />

U radu iznesen je kratak pregled metoda za load balancing. Većina njih zahtjeva dodatni hardware<br />

koji za slučaj zahtjeva visoke raspoloživosti treba biti udvojen. Vrlo često routeri imaju ugrađenu<br />

funkciju load-balancinga, pa se mogu koristiti i za tu funkciju. Konfiguriranje ovakvih routera izlazi iz<br />

domene sistem administratora i obično obavljaju specijalizirane osobe – mrežni administratori<br />

(najčešće vanjski partneri), stoga treba računati na vanjsku podršku. Ukoliko se želi izrazito velika<br />

fleksibilnost u kreiranju pravila raspoređivanja prometa (kao npr. servisiranje pojedinih aplikacije na<br />

određenim nodovima u clusteru kroz specifični url switching) može se koristiti software load balancer.<br />

Ako se želi osim velikog kapaciteta i skalabilnosti postići i visoka raspoloživost treba izbjeći single<br />

point of failure pa su potreban dva balancera u clusteru (ili dual-core redundantni hardware load<br />

balanceri). Za precizno usmjeravanje prometa po nodovima u slučaju korištenja odvojenih hardware i<br />

software load balancera potrebno je imati instalirane agente za procjenu opterećenja na samim<br />

nodovima gdje su aplikacijski serveri (server feedback). Rješenja gdje je load-balancer integriran u<br />

web cache samog aplikacijskog servera pogodna su za balansiranje prometa na instance aplikacijskih<br />

servera instalirane unutar istog hardware servera, ali nisu pogodna za postizanje visoke raspoloživosti<br />

ako se koristi više hardware servera (što je u clusterima skoro redovit slučaj) zbog jedne pristupne<br />

točke za korisnika. Od raspoloživih metoda autor preferira Microsoft NLB jer je jednostavan za<br />

konfiguriranje i ne zahtijeva dodatni hardware, niti intervencije na routeru, a po performansama je više<br />

nego dovoljan čak i za najveće sustave. Budući da su svi nodovi ravnopravni na mreži (bez front load<br />

balancing servera) ne postoji single point of failure. Isto tako, stanje ispravnosti aplikacije može se<br />

nakon provjere direktno komunicirati sa NLB postavkama noda u clusteru (komunikacija unutar istog<br />

servera). Tijekom sesije web aplikacije korisnika promet za dotičnog korisnika treba se redovito<br />

odvijati preko istog aplikacijskog servera, stoga je potrebno osigurati neki oblik perzistencije sesije<br />

(npr. zasnovane na IP adresi korisnika). Jednostavno i jeftino rješenje za geografski disperzirani<br />

cluster može se realizirati dvorazinskim usmjeravanjem prometa koji na prvoj razini uključuju<br />

višestruke recorde u DNS serverima (inicijalna redirekcija po IP adresi korisnika), a na drugoj razini<br />

(lokalni clusteri) kombinaciju Perl redirektora (HTTP redirekcija po IP adresi korisnika) i network load<br />

balancing-a (NLB).<br />

7. LITERATURA<br />

1. T. Bourke, Server Load Balancing, O'Reilly & Associates, 2001<br />

2. C. Kopparapu, Load Balancing Servers, Firewalls and Caches, John Wiley, 2002<br />

3. D. Hart, Load Balancing and Round Robin DNS, Adanac Software,<br />

http://www.adanacsoftware.com/articles/Load%20Balancing%20and%20Round%20Robin%20<br />

DNS.pdf<br />

4. SimpleFailover, User Manual, http://www.simplefailover.com/outbox/SimpleFailover.pdf<br />

5. A. Bivens et all., Autonomic load balancing, Part 1: Cisco Content Switching Module, 2006,<br />

http://www.ibm.com/developerworks/autonomic/library/ac-ewlmload1/<br />

6. Oracle 9iAS Web Cache, Administration and Deployment Guide, Release 2 (9.0.2), 2002<br />

7. R. L. Schwartz , Poor man's load balancer,<br />

http://www.stonehenge.com/merlyn/WebTechniques/col55.html<br />

8. Perlbal, http://www.danga.com/perlbal/<br />

9. R. J. Shimonski, Windows Server 2003 Clustering & Load Balancing, McGraw-Hill, Osborne,<br />

2003<br />

10. Linux Network Load Balancing, http://lnlb.sourceforge.net/<br />

11. Global Server Load Balancing, Array Networks, White <strong>Paper</strong><br />

12. D. Miljković, Geografski distribuiran iAS NLB cluster, 10. HROUG konferencija, Umag, 2005<br />

13. D. Miljković, Geografski disperzirani cluster internet aplikacijskih servera za visoku<br />

raspoloživost i kapacitet, CASE 18, Opatija, 2006<br />

14. P. Tenerillo, Why DNS Based Global Server Load Balancing (GSLB) Doesn’t Work, Tenerillo<br />

Inc., 2004, http://www.tenereillo.com/GSLBPageOfShame.htm<br />

15. P. Tenerillo, Why DNS Based Global Server Load Balancing (GSLB) Doesn’t Work, Part II,<br />

Tenerillo Inc., 2004, http://www.tenereillo.com/GSLBPageOfShameII.htm<br />

16. P. Tenerillo, Overview of DNS Caching In Browsers, Addendum to “Why DNS Based GSLB<br />

Doesn’t Work”, Tenerillo Inc., 2004, http://www.tenereillo.com/BrowserDNSCache.htm<br />

136<br />

12


INTEGRACIJA ORACLE APLIKACIJA I JASPERREPORTS-A<br />

Josip Matanović<br />

Infosistem d.d., Ivana Šibla 15, 10020 Zagreb<br />

Telefon: +385 1 6500 233 GSM: + 385 91 6500 233<br />

E-mail: jmatanovic@infosistem.hr Web: www.infosistem.hr<br />

SAŢETAK<br />

Pravodobno posjedovanje točnih informacija je jedna od presudnih prednosti kompanija.<br />

To dovodi do povećane potrebe za izvještavanjem i izradom velikog broja nerijetko sličnih<br />

izvještaja. Radi potrebe da se korisnicima omogući da više utječu na rezultat traženih<br />

informacija te ubrza, olakša i poveća kvaliteta posla poseglo se za integracijom<br />

JasperReports s Oracle aplikacijama. Korisniku se omogućava da na jednostavan način<br />

manipulira rezultatima izvještaja, kao i mogućnost biranja u kojem će se alatu izvješća<br />

naknado uređivati (MS word, MS excel, PDF,...).<br />

Timely possession of accurate information is one of the key competitive advantages a<br />

company can have. This leads to an increased demand for business intelligence (reporting)<br />

and development of a large number of frequently similar reports. In order to give users<br />

control of the requested information and expedite, facilitate and increase the business<br />

process JasperReports have been integrated with Oracle Applications. Users can handle the<br />

report results in a simple manner and choose the tools for subsequent report editing (MS<br />

Word, MS Excel, etc.)<br />

1. UVOD<br />

Poznata je izreka ''Informacija je znanje''. Izreka engleskog filozofa i znanstvenika<br />

Francisa Bacona glasi ''Znanje je moć''. Iz toga proizlazi da ''Informacija je moć''. U<br />

suvremenom poslovnom svijetu ova izreka sve više dobiva na važnosti. Brze i pravilne odluke<br />

oslanjaju se na informacije koje su u danom trenutku na raspolaganju. Uspješne tvrtke se od<br />

drugih razlikuju prvenstveno po tome što se na promjene u okruženju najbrže odazivaju, a<br />

neke i diktiraju promjene. Time se povećavaju potrebe za suvremenim informacijskim<br />

sustavom. Shodno tome od informacijskog sustava se očekuje da na adekvatan način<br />

odgovori potrebama tržišta.<br />

2. ZAŠTO<br />

2.1. Potrebe trţišta<br />

Navedena su tri primjera iz prakse zbog kojih smo se odlučili na integraciju<br />

JasperReportsa s Oracle aplikacijom.<br />

1. Kreiranje velikog broja sličnih izvještaja, grafičkih izvještaja i izvještaja raznih formata<br />

2. Kreiranje velikih izvještaja(> 50000 stranica)<br />

3. Slanje izvještaja u PDF formatu na elektroničku poštu ili dokumentacijski sustav<br />

Korisnik također zahtjeva da određena izvješća imaju i napredne grafičke, oku ugodne<br />

elemente. Zbog nedostataka ili kompliciranosti izvedbe ovih potreba pomoću Oracle Reports<br />

Buildera, potrebno je potražiti alternativno rješenje. U ovom trenutku na tržištu postoji također<br />

i veliki broj engina za izvješćivanje.<br />

137<br />

1


Za odabir alternativnog korišteni su sljedeći kriterij:<br />

Mogućnost uklapanja u postojeće Oracle 6i aplikacije<br />

Mogućnost uklapanja u OAS aplikacije<br />

Veličina community-a<br />

Cijena<br />

Otvorenost izvornog koda<br />

Frekvencija izdavanja novih inačica<br />

Performanse<br />

Dokumentacija i literatura<br />

Nakon završenog istraživanja te stvarnog testiranja nekoliko report engina odabralo se<br />

JasperReport kao report engina u kojemu će se pojedini izvještaji ubuduće kreirati.<br />

2.2. JasperReports općenito<br />

JasperReportsi su report engine za izradu izvješća, open source je i besplatan je.<br />

Izrađeni su Javi. Osim klasičnog prikaza izvještaja na monitor i printer, omogućuje i kreiranje<br />

izvještaja u raznim formatima kao što su PDF, HTML, MS Excel, RTF, ODT, CSV i XML.<br />

Osnovna prednost JasperReportsa je ta što je definicija reporta otvorena specifikacija. Izvorni<br />

kod izvješća za Jasper engine je XML datoteka nazvana JRXML. Dok je izvršna datoteka<br />

kompajlirane JRXML datoteke java klasa.<br />

select<br />

xmlElement("jasperReport",<br />

XMLAttributes(<br />

'http://jasperreports.sourceforge.net/jasperreports' AS "xmlns",<br />

'595' AS "pageWidth",<br />

'842' AS "pageHeight"<br />

)<br />

)<br />

from dual<br />

Rezultat:<br />

<br />

<br />

S obzirom da je izvorna datoteka XML datoteka postoji mogućnost da se lako kreira dinamički<br />

iz PL/SQL koda i to u starijim verzijama baze kao CLOB varijabla dok u novim verzijama baze<br />

pomoću Oracle xml funkcija kao što su xmlElement, xmlAgg, ... Tako generirana varijabla tipa<br />

xmlType moguće je direktno iz baze i validirati po shemi (.XSD) koja je također spremljena u<br />

bazi podataka.<br />

138<br />

2


Stvorenu JRXML datoteku moguće je u runtime-u i kompajlirati, napuniti podacima i pretvoriti<br />

u datoteku PDF, XLS, HTML,.. formata. I to iz na primjer Oracle Formsa ukoliko se uvezu<br />

Java klase u formu. Budući da je naš cijeli sustav napravljen u Oracle Forms tehnologiji ovo<br />

se pokazalo idealnim u našem slučaju, pa smo pristupili integraciji.<br />

...<br />

/*<br />

Nova instanca JsperReporta iz datoteke<br />

*/<br />

jasperReport = JasperCompileManager.compileReport(jrxmlDatoteka);<br />

...<br />

/*<br />

Pokretanje reporta (konekcija na BD)<br />

*/<br />

jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), connection);<br />

...<br />

/*<br />

Kreiranje datoteke u odabranoj extenziji<br />

*/<br />

JasperExportManager.exportReportToPdfFile(jasperPrint, (putanja + imeDatotekeBezExtenzije + "." +<br />

ExtenzijaDatoteke));<br />

...<br />

2.3. Općenito o integraciji<br />

Integracija je dolazila u obzira samo ako se zadovolje sljedeći uvjeti:<br />

Ne smije imati dodatne zahtjeve za hardware resursima;<br />

Korisnik integracijom mora dobiti najmanje onoliko koliko je i do sada imao<br />

postojećim izvještajima;<br />

Pokretanje izvješća mora biti omogućeno na jednak način kao i to sada (poziv<br />

direktno iz menija aplikacije, poziv iz postojećeg sustava za pokretanje izvješća);<br />

Integracija ne smije bitno mijenjati postojeću infrastrukturu<br />

Kako bi se omogućila integracija Oracle aplikacija i JasperReportsa bili su potrebni sljedeći<br />

koraci prema okolinama:<br />

6i<br />

10g<br />

Java Runtime Enviromet verzija 1.4 ili viša instalirana kod korisnika na lokalnom<br />

računalu;<br />

Konfigurirana classpath varijabla;<br />

Ugrađen OAS-ov JRE;<br />

Konfigurirane konfiguracijske datoteke;<br />

Za posebne slučajeve i konfiguriran Java Virtual Machine kontrole u Oracle<br />

Enterprise Manageru;<br />

2.4. Problemi pri integraciji<br />

Prilikom integracije naišlo se na sljedeće tehničke probleme:<br />

Konfiguracija JVM kontrolera u Oracle Enterprise Manageru;<br />

139<br />

3


Konfiguracija je uspješno izvršena nakon konzultacija sa Oracle supportom.<br />

Konfiguracija bila je potrebna kako se bi se moglo utjecati na parametre pokretanja<br />

JVM-a kao što su Xms i Xmx.<br />

Praćenje izvršavanja izvješća, te odustajanje od izvješća na zahtjev korisnika;<br />

Pri pokretanju Oracle Reporta korisniku na ekranu se prikazuje status izvršenja<br />

(ukupan broj stranica za formatiranje, trenutni broj stranice koji se formatira).<br />

Korisniku se omogućuje da na zahtjev i prekine proces formiranja izvještaja.<br />

U kompletnoj integraciji, prikazivanje statusa izvršenja korisniku na ekran u vremenu<br />

između pokretanja JasperReport izvještaja te prikaz izvještaja na ekran predstavljalo<br />

je najveći izazov.<br />

JasperReport Api sadrži metode za dohvat trenutne stranice u obradi i ukupnog broja<br />

stranica.<br />

Međutim bilo je potrebno pokrenuti izvještaj u posebnom thread-u da bi oracle<br />

procedura koja je pozvala JasperReport mogla završiti te timerom u oracle formsima<br />

moglo u malim vremenskim intervalima pozvati metode koje vraćaju broj stranice koji<br />

se formira i ukupan broj stranica, te tako te informacije prikažu korisniku na ekran u<br />

obliku progress bara. Uz to pozivanje izvještaja u posebnom thred-u omogućilo je da<br />

se na zahtjev korisnika (Pritisak na gumb) zaustavi formiranje izvješća jednako kao i<br />

kod Oracle Reportsa.<br />

Pokretanje oracle procedura prije pokretanja selecta izvještaja<br />

3. KAKO<br />

Određeni postojeći Oracle Reports izvještaju pokreću procedure koje pune ili<br />

pripremaju podatke koje izvještaj dohvaća. U Oracle Reportsima je to jednostavno<br />

riješeno pozivanje procedura u triggerima kao što su AFTER PARAMETER FORM ili<br />

BEFORE REPORT<br />

U JasperReportsima je stvar nešto složenija, što nas je natjeralo da povećamo<br />

mogućnosti našeg API-a za pokretanje JasperReporta na način da se omogući<br />

pozivanje Oracle procedura i prijenos parametra u iste prije pokretanja izvještaja u<br />

istom Oracle database session u kojemu će JasperReportsi izvršiti select naredbu.<br />

3.1. Dinamički izvještaji<br />

Korisnici imaju potrebu za kreiranjem više gotovo identičnih izvještaja, koji se razlikuju u<br />

malom broju podataka. Ukoliko se za svaki izvještaj kreira posebno, javlja se veliki broj<br />

gotovo identičnih izvještaja i time se njihovo održavanje komplicira te korištenje korisnicima<br />

otežava posao jer se moraju snalaziti u moru sličnih izvještaja.<br />

Ideja je napraviti jedan izvještaj koji bi pokrio veliku većinu potreba. Izrada jednog takvog<br />

izvještaja je komplicirana, a samim time bi se kompliciralo i njegovo održavanje.<br />

Druga ideja je napraviti ekran i omogućiti korisnicima da samostalno kreiraju željeni izvještaj.<br />

Oracle Reports Builder se pokazao krut za takvu manipulaciju samim izvještajem.<br />

JasperReports-i su se pokazali fleksibilniji po tom pitanju.<br />

JasperReportsi su zbog otvorenosti i jednostavnosti source koda idealni po tom pitanju.<br />

Korištenje Oracle Formsa kao alata kojim korisnicima omogućuje da ima veću slobodu<br />

definiranja izgleda izvještaja i podataka koje želi vidjet zajedno s integracijom s<br />

JasperReportsima pokazalo se kao odlična kombinacija. Takvoj fuziji Oracle Formsa i<br />

JasperReporta omogućili smo korisniku da definira mnogo više značajki izvještaja kao što su:<br />

140<br />

4


Kolone koje ga zanimaju – redoslijed, širinu, labelu, sortiranje, font, veličinu fonta i<br />

boje, grupna funkcija na koloni...<br />

Grupiranje – korisnik sam odabire po kojim kriterijima želi grupirati podatke<br />

Parametre – korisnik sam određuje koje parametre želi koristiti, a koje zanemariti<br />

Format – širinu i veličinu izvještaja, orijentaciju<br />

Ostalo – želi li logotip i koji na izvještaju, margine, redni broj ispred zapisa, kada se<br />

redni broj resetira, da li se na zadnjoj stranici ispisuju parametri, vrijeme pokretanja,<br />

korisnik broj stranica,...<br />

Izlazni format izvješća – PDF, DOC, XLS,HTML,...<br />

Slika I. Prikaz ekrana za definiciju fontova<br />

Slika II. Prikaz ekrana za definiciju kolona<br />

141<br />

5


3.2. Veliki izvještaji<br />

Slika III. Prikaz integracije<br />

Zbog potreba arhiviranja podataka o poslovanju, javila se potreba kreiranja izvještaja o<br />

poslovanju tijekom cijele godine. Budući da je izvještaj sadržavao poslovanje tijekom velikog<br />

vremenskog razdoblja imao je veliki broj stranica. Tu se javio problem da se pri kreiranju<br />

izvještaja u PDF formatu Builder zatvarao bez upozorenja o grešci na određenom broju<br />

stranica, dok se HTML format uspješno izvršio. Razlog tome je što kada se kreira izvještaj u<br />

PDF formatu sve stranice izvještaja se kreiraju u memoriji pa tek nakon što se kreiraju one se<br />

pokazuju na izlazu. Ovo uzrokuje potrebu za povećanjem memorije.<br />

Poučeni ranijim iskustva možemo reći da kreiranje velikih izvještaja u Reports Builderu ne<br />

predstavlja problem. Određena izvješća nakon generiranja u PDF formatu bez problema<br />

prelaze i 200Mb. Međutim u određeno situaciji zadani izvještaj u 6i verziji se nije mogao<br />

izvršiti bez obzira na učinjen tuning. U drugom konkretnom slučaju nije se išlo u analizu<br />

razlog „pucanja“ jer je okolina za integraciju JasperReport izvještaja već bila postavljena te je<br />

izvještaj prepisan u Jasper varijantu, te kao takav se bez problema izvodio i generirao PDF<br />

veći od 300 Mb, odnosno prema riječima JasperReports tima moguće je napraviti i izvješća<br />

veliko koliko ima i slobodnog mjesta na disku.<br />

Proces integracije dobiva se na način da se kreira jednak izvještaj koristeći JasperReport te<br />

komajliranu verziju jrxml (jasper) sprema na isto mjesto kao i REP datoteke. U pll-u forme su<br />

uvezene Java klase koje služe kao wrapper za pozivanje JasperReport API-a. Korisnik na<br />

lokalnom računalu u ovom slučaju mora imati instaliranu JVM. Sada se iz svih Oracle formi<br />

koje mogu pozivati Jasper izvještaji.<br />

Sada se iz svih Oracle formi koje mogu pozivati Jasper izvještaji iz postojećih Oracle<br />

aplikacija it to na način da korisnik će teško primijetiti razliku.<br />

142<br />

6


Slika IV. Prikaz integracije<br />

3.3. Slanje PDF izvještaja elektroničkom poštom ili u Dokumentacijski sustav<br />

Zbog novonastale potrebe da se prilikom pokretanja Oracle joba kreira PDF dokument te<br />

s njim dalje manipulira integrirali smo Jasper report engine s Oraclom bazom.<br />

Postoje dvije konkretne situacije koje je bilo potrebno riješiti:<br />

1. Da procedura koju poziva oracle job može kreirati PDF datoteku, te sa se kreirana<br />

datoteka pošalje elektroničkom poštom<br />

2. Da procedura koju poziva oracle job može kreirati PDF datoteku, te sa se kreirana<br />

datoteka spremi u dokumentacijski sustav<br />

Rješenje koje smo kreirali je zamišljeno da u bazi kreiramo PDF dokument, i onda tako<br />

kreirani PDF pošaljemo e-mailom. PL/PDF je programski paket koji omogućava kreiranje PDF<br />

dokumenta direktno u bazi. PL/PDF omogućava da se dinamički kreira PDF dokument s<br />

podacima iz baze. Pisan je u PL/SQL-u i također omogućava pohranu PDF dokumenta<br />

direktno u bazu. Budući da se radilo o izoliranom slučaju od PL/PDF smo odustali zbog cijene<br />

licence kao i zbog toga što nam se učinio kompliciranim za upotrebu. Na slici je kao primjer<br />

naveden kod za brojanje stranica i krajnji rezultat izvršenja tog koda.<br />

Slika V. Prikaz koda potrebnog za kreiranje brojanja stranica u PDF formatu preko PL/PDF paketa<br />

143<br />

7


3.4. Način integracije<br />

Oracle job pokreće baznu procedura koja generira JRXML datoteku. Tako kreiranu<br />

datoteku se pozivom web servisa iz baze šalje aplikacijskom serveru koja ima konfiguriran<br />

Jasper report engine.<br />

Jasper report engine kompajlira JRXML datoteku u izvršnu datoteku (.jasper) te pokreće i<br />

exportira u PDF datoteku.<br />

Novostvorenu PDF datoteku vraća kao response na web service.<br />

Procedura koja je pozvala web servis i poslala JRXML datoteku dobiva kao response PDF<br />

koje u jednoj situaciji šalje elektroničkom poštom, dok u drugoj situaciji pozivom web servisa<br />

sprema u dokumentacijski sustav.<br />

Slika VI. Prikaz integracije<br />

3.5. Izvješća s naprednim grafičkim elementima<br />

Određena izvješća moraju sadržavati napredne grafičke elemente i da istovremeno<br />

izgledaju moderno i oku ugodno.<br />

U tom slučaju izvješće se kreira u alatu (na primjer iReport) te se izvršna datoteke sprema na<br />

disk zajedno sa REP datotekama, te se integracijom takva izvješća mogu pozivati iz već<br />

postojećeg sustava za pokretanje Oracle izvješća uz manje preinake.<br />

144<br />

8


Slika VII. Primjer grafičkih izvještaja<br />

145<br />

9


4. ZAKLJUČAK<br />

Integracijom JasperReportsa s postojećim Oracle Aplikacijama smo zadržali postojeću<br />

funkcionalnost ekrana. Krajnji korisnik nije svjestan promjena tehnologije izrade izvještaja,<br />

prepoznaje minimalne promjene i kao takve ih lako prihvaća. Izgled izvještaja kao i njegovo<br />

pozivanje je nepromijenjeno.<br />

Integracija je od integratora tražila:<br />

Spajanje Oracle PL/SQL-a s javom;<br />

Konfiguriranje Client/Server i OAS okruženja;<br />

Nadogradnju postojećeg sustava za pozive izvješća;<br />

Poznavanje JRXML-a;<br />

Poznavanje JasperReports API-a.<br />

Integracijom smo omogućili korisniku:<br />

Izbor podataka koje žele prikazati na izvještaju ovisno o osobnim poslovnim<br />

potrebama;<br />

Manipulaciju izgledom samog izvještaja;<br />

Odabir formata izvještaja;<br />

Modernije grafičke izvještaje;<br />

Složenije daljnje radnje sa izvještajem kao npr. spremanje u dokumentacijski sustav.<br />

146<br />

10


SAŽETAK<br />

ISŽO-ADS: INTEGRACIJA TRANSAKCIJSKOG SUSTAVA<br />

S DOKUMENTACIJSKIM SUSTAVOM<br />

dr. sc. Andro Milanović<br />

Ami-Program d.o.o.<br />

+385-91-626-2450<br />

andro.milanovic@zg.t-com.hr<br />

mr. sc. Ivan Žiger<br />

Croatia osiguranje d.d.<br />

+385-91-1454-106<br />

ivan.ziger@crosig.hr<br />

Transakcijski sustav ISŽO (Informacijski Sustav za Životna Osiguranja) razvijen je kao potpora<br />

poslovnim procesima životnih osiguranja. Sustav je zasnovan na Oracle Forms i ostalim Oracle<br />

tehnologijama, koristi troslojnu arhitekturu te je u uporabi više godina. Učinkovito poslovanje<br />

zahtijevalo je uvođenje elektroničkog upravljanja dokumentacijom. Za implementaciju Arhivskodokumentacijskog<br />

sustava (ADS) odabran je sustav vanjskog partnera zasnovan na Java<br />

tehnologijama. Implementirani ADS potpuno je prilagođen potrebama korisnika, integriran u sustav<br />

ISŽO te se nalazi u produkcijskoj uporabi već 20 mjeseci. U radu se opisuju procesi razvoja,<br />

arhitektura sustava ISŽO-ADS i tehnološka rješenja za povezivanje raznorodnih podsustava.<br />

SUMMARY<br />

Transactional system ISŽO (Informacijski Sustav za Životna Osiguranja) comprises the<br />

application core for support of business processes of life insurance. The system is based on Oracle<br />

Forms, uses a three-tiered architecture and has been in use for years. A new business requirement<br />

was to implement a document management system (DMS). The implementation of the system ADS<br />

(Arhivsko-dokumentacijski sustav) was given to a partner company, which offered its Java-based<br />

DMS. The implemented system has been fully tuned to the users’ needs, integrated with ISŽO, and<br />

has been in production use for 20 months. This paper describes the development processes,<br />

architecture of ISŽO-ADS, and the technological solutions for integrating heterogeneous subsystems.<br />

1. UVOD<br />

Sustavi za upravljanje dokumentima (DMS, Document Management System) prisutni su u<br />

računarstvu više od 20 godina. Njihov razvoj započeo je stvaranjem prvih sustava namijenjenih<br />

praćenju stanja papirnatih dokumenata. Ubrzo su se pojavili i EDM (Electronic Document<br />

Management) sustavi koji su, za razliku od početnih sustava, omogućavali pohranu i čuvanje<br />

elektroničkih dokumenata. Povećanjem računalnih kapaciteta, širenjem primjena računalnih mreža i<br />

povećanjem međusobne suradnje djelatnika u tvrtkama, pojavila se potreba dijeljenja dokumenata te<br />

potreba za sve složenijim dokumentacijskim sustavima.<br />

Dugogodišnjim razvojem sustavi za upravljanje dokumentima postigli su brojne napredne<br />

mogućnosti poput suradnje i interaktivnog rada više korisnika na dokumentu, naprednih sigurnosnih<br />

zaštita i postavki, upravljanja radnim tijekom zasnovanim na dokumentima, nadzora životnog ciklusa<br />

dokumenta ili praćenja izmjena dokumenta. Nadalje, s vremenom je proširen i skup objekata kojima<br />

DMS sustavi upravljaju pa su tako nastali sustavi za upravljanje sadržajem (CMS, Content<br />

Management System). Uz dokumente, takvi sustavi upravljaju i raznim drugim sadržajima poput slika,<br />

Internet stranica, video i audio snimaka, kontaktnih podataka i drugih vrsta zapisa. Na osnovi CMS<br />

sustava, nastali su i suvremeni ECM (Electronic Content Management) sustavi, čija je namjena<br />

upravljanje svim vrstama nestrukturiranih informacija u srednjim i velikim tvrtkama.<br />

Većinu područja primjene DMS sustava čini upravljanje dokumentima i informacijama koje<br />

nastaju u unutarnjem poslovanju tvrtke ili u odnosima s drugim tvrtkama i tijelima državne uprave. U<br />

147<br />

1


pojedinim područjima primjene pojavljuju se velike količine dokumenata i u odnosima između<br />

organizacije i njenih stranaka. Primjeri takvih područja su financijske institucije i osiguravajuće kuće.<br />

Suvremeni sustav za upravljanje dokumentima može znatno unaprijediti poslovanje takvih<br />

organizacija. Kod organizacija koje razmjenjuju velike količine dokumenata sa svojim strankama,<br />

dokumenti su integralni dio poslovnih procesa, a često čine i osnovu cijelih procesa, pokretački signal<br />

ili rezultat izvođenja procesa. U navedenim je okolinama jedan od osnovnih preduvjeta uspjeha<br />

dokumentacijskog sustava potpuna i bešavna integracija DMS-a u poslovne procese organizacije te u<br />

sve poslovne aplikacije.<br />

Slijedeći suvremene trendove, kako općenito u IT sektoru, tako i trendove u području osiguranja,<br />

Croatia osiguranje d.d. odlučila je uvesti sustav za upravljanje dokumentima u svoje poslovanje. Kao<br />

izvođač implementacije Arhivsko-dokumentacijskog sustava (ADS), odabrano je partnerstvo agencije<br />

FINA i tvrtke Synerva IT d.o.o. Agencija FINA implementirala je sustav za upravljanje ulazom<br />

dokumenata, provela digitalizaciju postojeće arhive fizičkih dokumenata te preuzela zadaću<br />

arhiviranja fizičkih dokumenata. Tvrtka Synerva IT ponudila je svoj sustav za upravljanje<br />

dokumentima, implementirala dodatne module prema zahtjevima i potrebama Croatije osiguranja te<br />

integrirala sustav ADS u postojeće poslovne procese i aplikacijske sustave.<br />

Referat opisuje cjeloviti proces implementacije Arhivsko-dokumentacijskog sustava, od analize<br />

poslovnih procesa i snimanja korisničkih zahtjeva, preko tehničke implementacije sustava, do<br />

konačnog postavljanja sustava u produkcijski rad. Opisani su problemi koji su se pojavili tijekom<br />

snimanja poslovnih procesa i korisničkih zahtjeva te rješenja kojima su problemi otklonjeni. Naveden<br />

je pregled implementacije samog sustava koji uključuje arhitekturu i oblikovanje sustava, značajke<br />

programskog ostvarenja te pregled postupka uvođenja sustava u produkcijski rad. Konačno, opisani<br />

su rezultati projekta i njegova uspješnost.<br />

2. OSNOVNE ZNAČAJKE PROJEKTA<br />

Implementacija Arhivsko-dokumentacijskog sustava povjerena je tvrtkama FINA i Synerva IT<br />

koje su zajedno ponudile cjelovito rješenje za upravljanje dokumentima i arhiviranje. Tijekom definicije<br />

opsega projekta i ciljeva utvrđen je plan uvođenja dokumentacijskog sustava po sektorima Croatije<br />

osiguranja (CO). Uvođenje po sektorima odabrano je kako bi se rizici za cjelokupni projekt umanjili<br />

putem segmentacije složenog sustava u manje, djelomično neovisne dijelove. Nadalje, iskustva<br />

dobivena tijekom implementacije sustava u prvom sektoru, koristit će se u daljnjem oblikovanju<br />

sustava i prilagođavanju korisničkim zahtjevima. Pritom je bilo nužno osigurati da cjelovita<br />

programska i sklopovska arhitektura te podatkovni modeli, uzmu u obzir i buduće sektore u kojima će<br />

se implementirati ADS.<br />

Tijekom definicije projekta zadani su osnovni parametri ADS-a. Naveden je osnovni skup<br />

funkcionalnosti koje sustav mora ponuditi i stupanj povezanosti s postojećim informacijskim<br />

sustavima CO. Definirana je potreba za potporu digitalizaciji fizičkih, papirnatih dokumenata koji se<br />

stvaraju u poslovanju i u odnosima s klijentima. Određeno je da digitalizaciju takvih dokumenata<br />

provode djelatnici CO u okviru izvođenja redovnih poslovnih procesa. Nadalje, utvrđena je potreba za<br />

naknadnom digitalizacijom postojeće dokumentacije, odnosno dokumentacije koju CO čuva u svojim<br />

arhivima i koja je nastala prije uvođenja dokumentacijskog sustava.<br />

Za prvi sektor projekta uvođenja ADS-a odabran je Sektor životnih osiguranja. Sektor životnih<br />

osiguranja prosječne je veličine unutar osiguravajuće kuće. Važno obilježje sektora je da se tijekom<br />

obrade polica osiguranja stvara značajna količina dokumenata vezanih uz police. Dio dokumentacije<br />

stvara sama osiguravajuća kuća, no najveći dio dokumentacije čine vanjski dokumenti koje prilaže<br />

stranka, tijela državne uprave i druge institucije. Dokumentaciju životnih osiguranja potrebno je čuvati<br />

tijekom cijelog trajanja police te arhivirati dodatnih 10 godina nakon isteka. Iako je učestalost pristupa<br />

dokumentima relativno niska, tijekom čitavog trajanja police potrebno je omogućiti pristup svoj<br />

dokumentaciji. Konačno, jedan od presudnih motiva za odabir Sektora životnih osiguranja bio je visok<br />

stupanj informatiziranosti sektora kroz poslovni aplikacijski sustav ISŽO.<br />

Na temelju postojećih iskustava i poznatih negativnih primjera neuspjelih projekata uvođenja<br />

dokumentacijskih sustava, definirane su osnovne smjernice za implementaciju ADS-a i rizici za<br />

uspješnost projekta. Kao najveći rizici identificirani su neadekvatnost dokumentacijskog sustava za<br />

primjenu u poslovnim procesima te neprihvaćanje od strane krajnjih korisnika. Analizom poslovanja<br />

Sektora životnih osiguranja, utvrđeno je da samostojeći, odnosno izdvojeni dokumentacijski sustav<br />

neće odgovarati potrebama poslovnih procesa, usporavat će djelatnike Sektora te će potencijalno<br />

izazvati njihove negativne reakcije. Budući da je jedna od strateških smjernica dobra prihvaćenost<br />

sustava kod krajnjih korisnika, odlučeno je da se sustav za upravljanje dokumentima i njegovo sučelje<br />

u potpunosti integriraju s poslovnim procesima i aplikacijom ISŽO. Navedenim pristupom željelo se<br />

148<br />

2


osigurati uklapanje dokumentacijskog sustava u poslovne procese, ostvariti znatne vremenske uštede<br />

pri radu korisnika koji ne moraju koristiti dvije odvojene aplikacije i, konačno, stvoriti pozitivan stav<br />

krajnjih korisnika koji nove funkcionalnosti mogu koristiti unutar već poznatog im sučelja.<br />

Odabir integriranog pristupa implementaciji ADS-a značajno je smanjio rizike projekta, no<br />

istovremeno je osjetno povećao složenost procesa implementacije. Zbog očekivane velike složenosti,<br />

pristupilo se detaljnom definiranju projektnog plana i implementacijskog procesa. Implementacijski<br />

proces podijeljen je u pet ključnih faza prikazanih na slici 1.<br />

Slika 1: Faze implementacijskog procesa<br />

Tijekom planiranja projekta pažljivo su odabrani ključni sudionici projekta i voditelji pojedinih<br />

izvedbenih faza. S obzirom da su u implementaciji projekta sudjelovale tri neovisne tvrtke te više<br />

odjela unutar Croatije osiguranja, bilo je nužno ostvariti učinkovitu komunikaciju i kvalitetnu<br />

koordinaciju unutar projekta. Tijekom izvođenja projekta implementacije Arhivsko-dokumentacijskog<br />

sustava pokazalo se da su učinkovita komunikacija i koordinacija imale presudan značaj na pojedine,<br />

kritične točke i faze izvođenja projekta.<br />

3. IMPLEMENTACIJSKI PROCES<br />

Implementacijski proces započeo je detaljnim snimanjem postojećeg stanja poslovnih procesa,<br />

nakon čega su definirane izmjene u procesima uvjetovane uvođenjem dokumentacijskog sustava.<br />

Sljedeća faza sastojala se od detaljnog snimanja tehničkih značajki aplikacijskog sustava ISŽO i<br />

tehnologije Oracle Forms kako bi se integracija uspješno ostvarila i s tehničke strane. Nakon<br />

opsežnih pripremnih radnji, pristupilo se definiranju arhitekture, programskom ostvarenju i izgradnji<br />

samog sustava.<br />

Uz izvođenje implementacije novog sustava, u okviru projekta bilo je potrebno digitalizirati<br />

postojeću arhivu dokumenata i dobivene digitalne dokumente indeksirati i učitati u dokumentacijski<br />

sustav. Digitalizacija dokumenata odvijala se paralelno s fazama planiranja i implementacije sustava<br />

radi optimalnog iskorištavanja dostupnih sredstava i uštede vremena. Unatoč tome, bilo je nužno<br />

osigurati određene koordinacijske točke kako bi digitalizirana dokumentacija bila dostupna<br />

djelatnicima CO i prije uvođenja dokumentacijskog sustava u produkcijski rad.<br />

Konačno, sam postupak uvođenja ADS-a u produkcijski rad također je pažljivo planiran.<br />

Napravljeni su planovi za postupanje s dokumentacijom tijekom prijelaznog razdoblja kao i plan<br />

digitalizacije dokumenata iz prijelaznog razdoblja. Konačno, izrađeni su planovi testiranja sustava,<br />

detaljna korisnička dokumentacija i edukacijski plan. U nastavku poglavlja podrobnije su opisane<br />

pojedine faze procesa implementacije, osim same faze izgradnje ADS-a koja je zajedno s tehničkim<br />

detaljima opisana u zasebnom poglavlju.<br />

149<br />

3


3.1. Definiranje poslovnih procesa<br />

U početnoj fazi projekta provedeno je snimanje poslovnih procesa. Osnovni razlog snimanja bilo<br />

je stvaranje pretpostavki za učinkovitu integraciju dokumentacijskog sustava i usklađivanje s<br />

potrebama korisnika. Snimanje poslovnih procesa provela je Synerva u suradnji s djelatnicima<br />

Sektora životnih osiguranja Croatije osiguranja. Croatia osiguranje certificirana je prema standardu<br />

ISO 9001 te su stoga svi poslovni procesi dokumentirani, a tijekom snimanja su korištene i službene<br />

upute za djelatnike sektora. Tijekom procesa snimanja identificirano je nekoliko desetaka poslovnih<br />

procesa koji uključuju rukovanje dokumentacijom. Nakon pripremnih radnji, djelatnici Synerve<br />

analizirali su dobivene dijagrame, dokumentaciju poslovnih procesa i upute za djelatnike te prema<br />

dobivenim informacijama pripremili sažeti pregled poslovnih procesa. Potom su provedene detaljne<br />

konzultacije s djelatnicima Sektora kako bi se pouzdano utvrdilo poklapanje dokumentacije sa<br />

stvarnim procesima te kako bi se dodatno razjasnili detalji poslovnih procesa važni za rukovanje<br />

dokumentacijom.<br />

Nakon stvaranja pregleda postojećih procesa, pristupilo se definiciji novih poslovnih procesa koji<br />

uključuju rukovanje elektroničkim dokumentima primjenom ADS-a. U proces definicije novih procesa,<br />

uz djelatnike Synerve i Sektora životnih osiguranja, uključeni su i djelatnici Službe za informatiku.<br />

Definiranje novih procesa uključivalo je prilagodbu postojećih procesa novom sustavu, definiranje<br />

novih postupaka rukovanja dokumentacijom te definiranje više aspekata organizacije dokumenata<br />

prema njihovoj namjeni, životnom ciklusu police, kategoriji, podružnici, itd. Stoga su, istodobno s<br />

definicijom procesa, izrađeni i dokumenti koji opisuju korisničke zahtjeve.<br />

Definicija novih poslovnih procesa s korisnicima pokazala se iznimno zahtjevnom. Pojedini<br />

korisnici nisu mogli predočiti izgled budućeg sustava i način rukovanja dokumentima. Nadalje,<br />

probleme je predstavljala i prevelika razina detalja te deseci poslovnih procesa u Sektoru životnih<br />

osiguranja koji su, iako slični u svojoj strukturi, načelno različiti prema sadržaju. U otklanjanju<br />

nastalog zastoja znatan doprinos dali su djelatnici Službe za informatiku prijedlogom da se deseci<br />

detaljnih procesa zamijene znatno manjim brojem pojednostavljenih, apstraktnih procesa. Svaki<br />

apstraktni proces predstavlja jednu čitavu kategoriju poslovnih procesa, a izbačeni su svi detalji<br />

nebitni za upravljanje dokumentima. Ukupno su definirane tri osnovne aktivnosti koji se pojavljuju u<br />

radu s policama životnog osiguranja: prodaja police, obrada police i obrada prijavljene štete.<br />

Izradom pojednostavljenih apstraktnih procesa uspješno su prevladani nastali problemi te su na<br />

njihovoj osnovi definirani i novi procesi za rukovanje dokumentima primjenom ADS-a. Nakon toga,<br />

završeno je definiranje korisničkih zahtjeva te su stvoreni i prototipi korisničkog sučelja. Na osnovi<br />

prototipa sučelja, djelatnici poslovnog sektora mogli su lakše predočiti izgled budućeg sustava te dati<br />

svoje mišljenje i prijedloge. Jedan od prijedloga koje su dali korisnici jest primjena crtičnog kôda (engl.<br />

bar code) u cilju olakšavanja digitaliziranja i indeksiranja dokumenata. Izvođači projekta ispravno su<br />

uočili vrijednost prijedloga te je on prihvaćen i uvršten u skup korisničkih zahtjeva.<br />

Uz navedeno, izrađena je i testna dokumentacija čijim prihvaćanjem korisnici potvrđuju da sustav<br />

zadovoljava njihove potrebe. Kao konačni rezultat opisanog procesa dobiven je niz projektnih<br />

dokumenata kojima se definiraju novi poslovni procesi, korisnički zahtjevi i postupci testiranja. Prije<br />

pristupanja samoj implementaciji, provedena je i verifikacija izrađenih dokumenata s poslovnim<br />

sektorom i informatičkom službom.<br />

3.2. Snimanje tehničkih značajki<br />

Nakon definiranja novih poslovnih procesa, izvođenje projekta nastavljeno je snimanjem<br />

tehničkih značajki postojećih sustava Croatije osiguranja. Snimanje tehničkih značajki provela je<br />

Synerva u suradnji s djelatnicima sistemske i aplikacijske grupe Sektora za informatiku. S<br />

djelatnicima sistemske grupe utvrđena je arhitektura postojećih sklopovskih sustava, sustava baze<br />

podataka, aplikacijskog poslužitelja te sustava za autentikaciju i autorizaciju korisnika zasnovanog na<br />

Microsoftovom Active Directoryu. Nadalje, definirane su i potrebe za novim poslužiteljima za<br />

Arhivsko-dokumentacijski sustav te tehničke značajke poslužitelja i uvjeti nabave. Konačno,<br />

definirana su prava pristupa pojedinim sustavima CO i pripremljeni su odgovarajući korisnički računi<br />

za razvijatelje. Sistemska grupa je potom samostalno pristupila postupku nabave potrebne opreme te<br />

konfigurirala i postavila sve poslužitelje.<br />

Snimanje značajki sučelja, funkcionalnosti i podatkovnog modela aplikacije ISŽO provedeno je u<br />

suradnji Synerve i aplikacijske grupe. Zbog velike složenosti podatkovnog modela i brojnosti<br />

ugrađenih funkcionalnosti, za potrebe implementacije Arhivsko-dokumentacijskog sustava stvoren je<br />

pojednostavljeni model. Umjesto predaje cijelog podatkovnog modela djelatnicima Synerve, definiran<br />

je skup indeksnih podataka dokumenata i potom su dogovorene dodirne točke između baze podataka<br />

ISŽO i dokumentacijskog sustava. Nadalje, identificirane su funkcionalnosti i logičke cjeline sučelja<br />

150<br />

4


aplikacije ISŽO koje su povezane s rukovanjem dokumentacijom i koje mogu biti iskorištene za<br />

integraciju s ADS-om. Jedna od zanimljivosti procesa snimanja tehničkih značajki jest da su u<br />

suradnji s djelatnicima aplikacijske grupe pojašnjeni pojedini detalji poslovnih procesa pa čak i<br />

ispravljene određene pogreške i netočne pretpostavke. Navedeno je posljedica čvrste povezanosti<br />

između aplikacijske grupe i krajnjih korisnika sustava na terenu.<br />

Na temelju snimljenog stanja pristupilo se izradi tehničkog dijela projektne dokumentacije.<br />

Definirani su podaci koje je potrebno izmjenjivati između baze podataka ISŽO i dokumentacijskog<br />

sustava te je dogovorena razmjena podataka putem pozivanja pohranjenih potprograma (engl. stored<br />

procedures). Precizno su definirani i dokumentirani svi prototipovi pohranjenih potprograma. Nadalje,<br />

utvrđeno je da je za autentikaciju i autorizaciju korisnika ADS-a znatno povoljnije koristiti postojeće<br />

mehanizme u aplikaciji ISŽO, umjesto Active Directorya. Stoga su definirani i potprogrami za<br />

autorizaciju korisnika u dokumentacijskom sustavu. Konačno, specificirane su točke integracije ADSa<br />

u korisničko sučelje aplikacije ISŽO. Utvrđeni su način povezivanja, programska sučelja i tehnički<br />

parametri pozivanja. Rezultat procesa snimanja tehničkih značajki jest skup dokumenata projektne<br />

dokumentaciju koji definiraju sučelja i podatkovne strukture za povezivanje aplikacije ISŽO i Arhivskodokumentacijskog<br />

sustava.<br />

3.3. Digitalizacija postojeće dokumentacije<br />

Jedan od osnovnih zadataka projekta uvođenja Arhivsko-dokumentacijskog sustava u<br />

poslovanje Sektora životnih osiguranja bila je digitalizacija postojeće dokumentacije. U skladu sa<br />

zakonskim zahtjevima, Croatia osiguranje je i prije uvođenja ADS-a pohranjivala svu dokumentaciju<br />

polica životnog osiguranja u fizičkom obliku. Stoga je bilo potrebno digitalizirati svu postojeću<br />

dokumentaciju i učitati je u dokumentacijski sustav. Digitalizaciju dokumentacije provela je FINA,<br />

odnosno njezin odjel ADC (Arhivsko Dokumentacijski Centar). Prilikom digitalizacije dokumenata<br />

provedeno je i njihovo indeksiranje kako bi se dokumenti kasnije mogli uspješno učitati u<br />

dokumentacijski sustav i ispravno povezati s podatkovnim strukturama sustava ISŽO. Indeksiranje je<br />

provedeno ručno te je stoga u suradnji s djelatnicima CO bilo potrebno provesti podrobnu analizu<br />

vrsta dokumenata, njihove kategorizacije i sadržaja. Nakon analize, definirani su indeksni podaci i<br />

potom je osoblje ADC-a obučeno za pravilno rukovanje dokumentima i indeksiranje.<br />

Pored digitalizacije i indeksiranja, FINA je preuzela i arhiviranje fizičkih dokumenata te je stoga<br />

dokumentacija nakon digitalizacije odmah pohranjivana u arhivima FINA-e. Samo odvijanje procesa<br />

preuzimanja dokumentacije i njene digitalizacije bilo je pažljivo planirano. Proces je vremenski trebalo<br />

uskladiti s implementacijom Arhivsko-dokumentacijskog sustava tako da sva postojeća dokumentacija<br />

bude digitalizirana i indeksirana do trenutka kada će ADS biti pušten u produkcijski rad. Budući da je<br />

FINA postupno preuzimala dokumentaciju iz Croatije osiguranja bilo je potrebno pronaći i prijelazno<br />

rješenje putem kojeg bi djelatnici CO pristupali digitaliziranim dokumentima. Za prijelazno rješenje<br />

tvrtka Synerva osigurala je pojednostavljenu verziju starije inačice svog dokumentacijskog sustava u<br />

koji su učitani digitalizirani dokumenti zajedno s njihovim osnovnim indeksnim podacima.<br />

U prijelaznom razdoblju tijekom kojeg su podružnice postupno prelazile na rad s<br />

dokumentacijskim sustavom bilo je potrebno riješiti i problem digitalizacije postojeće dokumentacije<br />

koja nije stvorena u okviru novih poslovnih procesa. Iako u novim poslovnim procesima djelatnici CO<br />

samostalno digitaliziraju novu dokumentaciju i uvode je u dokumentacijski sustav, odlučeno je da<br />

postojeću fizičku dokumentaciju djelatnici CO neće morati retroaktivno digitalizirati. S obzirom na<br />

stečena znanja i iskustva, odlučeno je da će digitalizaciju navedenih dokumenata također provesti<br />

FINA i time olakšati uvođenje i prihvaćanje ADS-a.<br />

Tijekom cjelokupnog procesa digitalizacije i indeksiranja dokumenata, FINA-in odjel ADC<br />

digitalizirao je 330.000 dokumenata s ukupno 2 milijuna stranica. Dokumenti su indeksirani i<br />

konvertirani u PDF format te isporučeni zajedno s indeksnim datotekama. Obrada dokumenata<br />

provedena je u 6 segmenata, a ukupna veličina dobivenih dokumenata iznosi približno 67 GB. Prije<br />

učitavanja dokumenata u ADS, provedena je dodatna analiza indeksnih podataka kako bi se u što<br />

većoj mjeri smanjila količina ljudskih pogrešaka. Nakon ispravljanja otkrivenih pogrešaka, dokumenti<br />

su automaziranim alatima učitani u ADS. Kao rezultat ovog procesa, djelatnicima koji rade na<br />

životnim osiguranjima danas na raspolaganju stoji cjelokupna dokumentacija Sektora unazad desetak<br />

godina koliko se ona pohranjuje.<br />

3.4. Uvođenje sustava u produkcijski rad<br />

Uvođenje sustava u produkcijski rad započelo je testiranjem koje je provedeno u Synervi i u<br />

Croatia osiguranju. Za potrebe testiranja izrađeni su testni planovi prema kojima su testiranje proveli<br />

djelatnici obje tvrtke. Inicijalno testiranje proveli su djelatnici Synerve korištenjem vlastite razvojne<br />

151<br />

5


okoline, nakon čega je sustav postavljen i konfiguriran za rad u testnoj okolini CO. Rad s testnom<br />

okolinom omogućio je izvođenje integracijskih testova sa stvarnim sustavima Croatije osiguranja te sa<br />

stvarnim podacima iz sustava ISŽO. Nakon djelatnika Synerve, testiranje su nastavili djelatnici<br />

aplikacijske grupe Sektora za informatiku CO. Konačno, sustav su testirali djelatnici Sektora životnih<br />

osiguranja. Kako bi se dodatno povećala kvaliteta testiranja i utvrdilo da sustav odgovara stvarnim<br />

potrebama krajnjih korisnika, na probni rad s ADS-om pozvano je desetak djelatnika podružnica CO<br />

koji svakodnevno rade sa životnim osiguranjima. Njihova mišljenja i iskustva iskorištena su kako bi se<br />

provele dodatne prilagodbe i poboljšanja sustava.<br />

Nakon uspješno provedenog testiranja, Arhivsko-dokumentacijski sustav postavljen je na<br />

edukacijsku i produkcijsku okolinu. Dok je u produkcijskoj okolini pokrenuto učitavanje dokumenata<br />

digitaliziranih u FINA-i, edukacijska okolina pripremljena je za proces edukacije djelatnika podružnica.<br />

Edukacija se odvijala u učionici Generalne direkcije CO, a sudjelovali su djelatnici kojima su životna<br />

osiguranja jedno od primarnih područja. Ukupno su bile organizirane tri edukacijske grupe s po 30-ak<br />

polaznika iz svih podružnica Croatije osiguranja. Trajanje edukacije za jednu grupu iznosilo je dva<br />

radna dana. Za potrebe edukacije pripremljene su upute o izmjenama u poslovnim procesima, upute<br />

za rad sa sustavom za digitalizaciju i upute za rad s dokumentacijskim sustavom. Sama edukacijska<br />

okolina iskorištena je za demonstraciju sustava i praktični rad polaznika.<br />

Tijekom edukacije, polaznici su upoznati s promjenama u poslovnim procesima, digitalizacijom i<br />

radom s dokumentacijskim sustavom. U području poslovnih procesa, polaznicima su objašnjene<br />

izmjene u postojećim procesima, izmjene u rukovanju fizičkim dokumentima i načela rukovanja<br />

digitalnim dokumentima. Polaznici su dalje podučeni radu s aplikacijom eInput, odnosno sustavom za<br />

digitalizaciju fizičkih dokumenata, a također je objašnjen i demonstriran rad sa scannerom. Konačno,<br />

polaznicima je ukazano na promjene i dodatne funkcionalnosti aplikacije ISŽO koje se odnose na<br />

dokumentacijski sustav. Uz predavanja i demonstracije, od polaznika je zatraženo i da praktično<br />

izvedu sve postupke vezane uz dokumentacijski sustav.<br />

4. OSNOVNE KOMPONENTE ARHIVSKO-DOKUMENTACIJSKOG SUSTAVA<br />

Tri su osnovne programske cjeline koje čine cjelokupni Arhivsko-dokumentacijski sustav: sustav<br />

ISŽO, sustav Japaya i sustav Captiva. ISŽO (Informacijski Sustav za Životna Osiguranja) je vlastiti<br />

aplikacijski sustav Croatije osiguranja koji pruža potporu izvođenju poslovnih procesa životnog<br />

osiguranja. Sustav Japaya je središnji dio sustava za upravljanje dokumentima, a razvila ga je tvrtka<br />

Synerva. Konačno, sustav Captiva namijenjen je upravljanju ulazom, odnosno digitalizaciji papirnatih<br />

dokumenata, a razvila ga je tvrtka EMC.<br />

Uz navedene programske cjeline, Arhivsko-dokumentacijski sustav koristi razne pozadinske<br />

programske sustave. Baze podataka sustava ISŽO i Japaya zasnovane su na Oracleovoj bazi<br />

podataka i RAS sustavu, a aplikacijski poslužitelj sustava ISŽO je Oracleov IAS (Internet Application<br />

Server) postavljen na farmi poslužitelja. Uz navedeno, sustav ADS koristi i specijalizirani sklopovski<br />

sustav Centera koji je namijenjen pouzdanoj i sigurnoj pohrani dokumenata, a proizvodi ga EMC. U<br />

nastavku poglavlja opisane su osnovne programske cjeline i sustav Centera.<br />

4.1. Aplikacijski sustav ISŽO<br />

Aplikacijski sustav ISŽO vlastiti je sustav Croatije osiguranja koji daje informatičku potporu<br />

poslovnim procesima životnih osiguranja. Razvoj sustava bio je vlastiti, uz sudjelovanje unutarnjih i<br />

vanjskih izvršioca (konzorcijski razvoj). Danas vlastiti informatičari u potpunosti dalje razvijaju i<br />

održavaju taj sustav. Razvoj sustava otpočeo je u rujnu 2002. godine, a prva funkcionalna inačica<br />

puštena je u produkciju u siječnju 2004. godine. Nakon uspješnog uvođenja sustava, razvoj nije<br />

zaustavljen, već naprotiv, nastavljeno je širenje sustava uvođenjem novih funkcionalnosti. Sustav se<br />

kontinuirano proširuje novim mogućnostima prema potrebama poslovnih procesa i dorađuje se na<br />

osnovi povratnih informacija korisnika. Pritom se veliki značaj pridaje prilagodbi sustava zahtjevima i<br />

specifičnim potrebama krajnjih korisnika.<br />

Sustav ISŽO danas daje potporu svim procesima životnih osiguranja od planiranja, prodaje,<br />

obrade portfelja do šteta i svih potrebnih analitika. Osim za unutarnje potrebe, sustav je s vremenom<br />

proširen kako bi dao potrebnu informatičku potporu partnerskim tvrtkama, poput agencija i banaka.<br />

Sustav ima gotovo 4.000 korisnika, od čega je preko 650 djelatnika Croatije osiguranja, a ostatak čine<br />

vanjski suradnici i djelatnici partnerskih tvrtki.<br />

Tehnološku osnovicu sustava čini skup Oracleovih tehnologija. Baza podataka izgrađena je u<br />

Oracleu i izvodi se na Oracle RAS sustavu. Čini ju preko 750 tablica i preko 350.000 redaka<br />

pohranjenog kôda, većinom namijenjenog izvođenju složenih izračuna, a ukupna veličina baze prelazi<br />

152<br />

6


100 GB. Sama aplikacija zasnovana je na Oracle Forms tehnologiji i izgrađena primjenom alata<br />

Oracle Forms Developer. Iako ponešto starija, tehnologija Oracle Forms zasnovana je na Web<br />

tehnologijama i stoga dostupna u suvremenim preglednicima. Uporaba Web aplikacije korisnicima<br />

olakšava pristup i korištenje aplikacije, a informatičkim stručnjacima olakšava razvoj i održavanje<br />

sustava. Na slici 2 prikazan je primjer korisničkog sučelja aplikacije ISŽO.<br />

4.2. Sustav Japaya<br />

Slika 2: Primjer korisničkog sučelja aplikacije ISŽO<br />

Japaya je sustav za upravljanje dokumentima koji je razvila tvrtka Synerva. Synerva je njemačka<br />

tvrtka čije su osnovne djelatnosti razvoj programskih sustava i savjetovanje u informatici. Središnjica<br />

tvrtke je u Njemačkoj, a podružnice su otvorene u Švicarskoj i Hrvatskoj. Razvoju sustava Japaya<br />

prethodilo je dugogodišnje iskustvo u implementaciji sustava za upravljanje dokumentima te razvoj<br />

starije generacije DMS sustava nazvane Filero. Tvrtka Synerva uspješno je implementirala<br />

dokumentacijske sustave kod više klijenata, u rasponu od obrtnika do velikih organizacija i banaka.<br />

Sustav Japaya najnovija je generacija DMS-a zasnovana na Javi, J2EE i skupu otvorenih<br />

tehnologija. U potpunosti je razvijen u Synervi i ne koristi sustave drugih proizvođača. Japaya je<br />

objektno-orijentirani sustav, odnosno svi podaci i zapisi promatraju se kao objekti, a u rukovanju<br />

podatkovnim modelom i podacima primjenjuju se standardne OO tehnike poput nasljeđivanja i<br />

polimorfizma. Japaya pohranjuje podatke o dokumentima u relacijsku bazu podataka, no sam sustav<br />

je neovisan od proizvođača baze podataka. Baza podataka odvojena je od jezgre sustava zasebnim<br />

apstrakcijskim slojem, a trenutno su poduprta tri DBMS-a među kojima je i Oracleov. Međutim, uz<br />

minimalni razvojni trošak, moguće je izgraditi adapter za bilo koju bazu podataka kojoj se može<br />

pristupiti putem sustava JDBC (Java DataBase Connectivity). Same dokumente sustav Japaya može<br />

spremati u bazu podataka, u datotečni sustav ili na namjenski uređaj za pohranu dokumenata.<br />

Japaya trenutno sadrži potporu za samo jedan namjenski uređaj za pohranu, EMC Centera.<br />

Sa stajališta DMS-a, sustav Japaya nudi brojne funkcionalnosti. Objektno-orijentirani podatkovni<br />

model omogućuje stvaranje složenih podatkovnih modela za pohranu metapodataka o dokumentima.<br />

Metapodatke o dokumentima moguće je indeksirati, a sustav sadrži i puni tekstualni indeks<br />

dokumenata (engl. full-text indexing) za standardne datotečne formate. Pritom je uz velike svjetske<br />

jezike poput engleskog, njemačkog i španjolskog, uključena i potpuno funkcionalna potpora za<br />

hrvatski jezik, koja omogućava prepoznavanje i indeksiranje korijena riječi bez obzira na gramatički<br />

oblik. Sustav posjeduje i snažan jezik za postavljanje upita pomoću kojeg je moguće pretraživati sve<br />

metapodatke dokumenata i na taj način pronaći tražene dokumente.<br />

153<br />

7


Sustav Japaya prati sve izmjene na dokumentima i njihovim metapodacima te stare podatke i<br />

dokumente nastavlja čuvati i nakon njihove izmjene ili brisanja. Na taj način, gradi se povijest<br />

dokumenata u kojoj je moguće kasnije pronaći starije inačice dokumenata i njihovih podataka. Uz<br />

povijest je čvrsto vezano i praćenje izmjena, odnosno revizija (engl. audit trail) koja uz svaku izmjenu<br />

zapisuje kada je nastala i koji ju je korisnički račun proveo. Japaya posjeduje i složen sigurnosni<br />

sustav koji omogućuje detaljan opis prava pristupa pojedinim dokumentima i hijerarhijskim<br />

strukturama. Sigurnosni sustav povezan je sa sustavom za praćenje povijesti dokumenata i sustavom<br />

za praćenje izmjena. Sam sigurnosni sustav izgrađen je modularno te ostavlja mogućnost<br />

jednostavne konfiguracije različitih načina provođenja sigurnosnih politika i razvoj novih mehanizama.<br />

Autentikaciju i autorizaciju korisnika moguće je provoditi kroz ugrađeni sustav za upravljanje<br />

korisnicima i korisničkim grupama ili povezivanjem s vanjskim sustavima. Primjenom LDAP protokola<br />

omogućeno je povezivanje prema direktorijskim sustavima poput Microsoftovog Active Directorya.<br />

Zahvaljujući modularnoj strukturi, moguće je izgraditi i specijalizirani sustav za autentikaciju i<br />

autorizaciju korisnika, primjerice, za spajanje na bazu podataka s korisničkim podacima. U području<br />

sigurnosti, sustav još nudi i impersonaciju i delegiranje prava pristupa te automatsko potpisivanje<br />

dokumenata kako bi se zajamčila nepromjenjivost i neporecivost.<br />

U sustav Japaya ugrađena je i potpora za olakšavanje indeksiranja tijekom digitalizacije koja<br />

automatski izrađuje crtični kôd na temelju indeksnih podataka dostupnih iz povezane poslovne<br />

aplikacije. Crtični kôd potom se ispisuje i digitalizira zajedno s dokumentom. Čitanjem crtičnog kôda<br />

sustav može automatski ili poluautomatski indeksirati dokument. Konačno, osnovno sučelje sustava<br />

zasnovano je na Web aplikacijama i stoga je dostupno s različitih klijentskih platformi.<br />

Jedna od najznačajnijih prednosti sustava Japaya jest njegova prilagodljivost potrebama<br />

korisnika. Sam poslovni model tvrtke Synerava jest razvoj specijaliziranih sustava prema specifičnim<br />

zahtjevima i potrebama korisnika. Nadalje, budući da je cijeli sustav Japaya, uključujući i njegov<br />

izvorni kôd u vlasništvu Synerve, sustav je znatno fleksibilniji od komercijalnih off-the-shelf sustava.<br />

Navedeni sustavi velikih proizvođača, vođeni su načelom „one size fits all“, čime je konkretna<br />

implementacija ograničena na manje prilagodbe potrebama korisnika. Pokazalo se da se<br />

prilagodljivost i mogućnost integracije sustava Japaya vrlo dobro poklopila s potrebama Croatije<br />

osiguranja i znatno pridonijela uspjehu projekta.<br />

4.3. Sustav za upravljanje ulazom<br />

Upravljanje ulazom (engl. input management) ostvareno je primjenom gotovog, komercijalnog<br />

sustava EMC Captiva. S obzirom na veličinu Croatije osiguranja, potrebe za digitalizacijom<br />

dokumenata i broj korisnika, zaključeno je da je Japayin integrirani modul za digitalizaciju potrebno<br />

zamijeniti složenijim sustavom poput Captive. Unutar skupa modula sustava EMC Captiva, za<br />

potrebe ADS-a odabrane su komponente InputAccel i eInput. eInput je aplikacijski sustav koji se<br />

izvodi kao Web aplikacija i omogućuje digitalizaciju dokumenata putem preglednika MS Internet<br />

Explorer. Sustav sadrži komponentu za upravljanje scannerom koju je potrebno instalirati na<br />

klijentsko računalo i koja se povezuje na upravljačke programe scannera. Čitav proces digitalizacije i<br />

indeksiranja dokumenta odvija se u pregledniku.<br />

Modul InputAccel jest poslužiteljski sustav koji zaprima digitalizirane dokumente i potom ih dalje<br />

obrađuje te priprema za ulaz u dokumentacijski sustav. Sustav InputAccel zasniva se na procesima<br />

koje razvija implementator sustava. Unutar procesa zadaju se načini obrade dokumenta i indeksnih<br />

podataka te način pripreme i slanja dokumenta u dokumentacijski sustav. U pogledu obrade<br />

dokumenta, moguće je mijenjati razna fizička svojstva digitalizirane slike, mijenjati format zapisa te<br />

izvoditi prepoznavanje znakova (OCR, Optical Character Recognition).<br />

4.4. Sustav za pouzdanu i sigurnu pohranu<br />

Područje osiguranja u znatnoj je mjeri regulirano, a zakonima je propisano i čuvanje<br />

dokumentacije stvorene u odnosima sa strankama. Zahtijeva se dugoročno čuvanje izvorne<br />

dokumentacije u trajanju od 10 godina nakon datuma isteka same police. Budući da i same police<br />

mogu biti dugoročne, primjerice u životnom osiguranju često se ugovaraju i na 30 godina, nužno je<br />

osigurati pouzdanu i sigurnu pohranu dokumenata. Temeljem navedenih zahtjeva, za pohranu<br />

dokumenata odabran je sustav EMC Centera.<br />

Centera je sklopovski sustav iz kategorije CAS sustava (Content Adressable Storage). Sustav<br />

CAS sličan je sustavima NAS (Network Attached Storage) po tome što nudi veliku količinu prostora<br />

za pohranu podataka i po tome što mu se pristupa preko računalne mreže. Međutim, dok sustavi NAS<br />

nude prostor za pohranu u obliku mrežnih dijeljenih diskova kojima se pristupa putem standardnih<br />

protokola, sustav CAS nudi pohranu i dohvat pojedinačnih dokumenata putem namjenskog sučelja.<br />

154<br />

8


Gledano izvana, sustav ne nudi uobičajene paradigme datotečnih sustava, već rukuje isključivo<br />

pojedinačnim dokumentima koje identificira njihovom svojstvenom vrijednosti koja se izračunava<br />

pomoću hash funkcije. Primjena hash vrijednosti u kombinaciji s unutarnjim zaštitnim mehanizmima<br />

osigurava nepromjenjivost pohranjenih dokumenata tako da sustav Centera jamči da jednom<br />

pohranjeni dokument sigurno nije naknadno mijenjan.<br />

Uz zaštitu sadržaja dokumenata, Centera sadrži i višestruku unutarnju redundanciju kojom se<br />

osigurava pouzdanost sustava i korisnika štiti od gubitka podataka. Nadalje, postavljanjem<br />

sekundarnog sustava Centera moguće je osigurati izradu sigurnosnih kopija (engl. back-up) na<br />

udaljenom sustavu. U slučaju ispada primarnog sustava, sekundarni sustav može čak i preuzeti<br />

funkcije primarnog sustava (engl. fail-over) i time osigurati kontinuirani rad. Sve funkcije sustava<br />

Centera izgrađene su u skladu s regulatornim zahtjevima SAD-a gdje su i certificirane. Zahvaljujući<br />

navedenom, sustav Centera često se koristi za pohranu dokumenata u strogo reguliranim područjima<br />

poput farmacije, medicine i financija.<br />

5. IZGRADNJA ARHIVSKO-DOKUMENTACIJSKOG SUSTAVA<br />

Izgradnja i programsko ostvarenje Arhivsko-dokumentacijskog sustava započeli su tek nakon što<br />

su završile obje pripremne faze planiranja poslovnih procesa i analize tehničkih značajki produkcijske<br />

okoline. Rezultat pripremnih faza bio je skup dokumenata kojim se definiraju korisnički zahtjevi,<br />

podatkovni modeli, sučelja za povezivanje, metapodaci dokumenata itd. Temeljem pripremljenih<br />

dokumenata te imajući u vidu planirano širenje ADS-a na ostale sektore Croatije osiguranja, izrađena<br />

je arhitektura cijelog sustava. Potom su oblikovane pojedine komponente sustava, definirana su<br />

sučelja za njihovo međusobno povezivanje, specificirani su izgled i funkcionalnost korisničkih sučelja<br />

te je započelo programsko ostvarenje sustava.<br />

Programsko ostvarenje sustava trajalo je približno 9 mjeseci. Oko dvije trećine radova izvedeno<br />

je na razvojnoj okolini tvrtke Synerve, a ostatak je izveden u Croatiji osiguranju. Za potrebe<br />

implementacije postavljene su četiri okoline: razvojna, testna, edukacijska i produkcijska. U<br />

razvojnom procesu sudjelovali su razvijatelji svih tvrtki sudionica projekta. Najveći dio razvoja ostvarili<br />

su djelatnici Synerve primjenom Java platforme i J2EE tehnologija. Djelatnici aplikacijske grupe<br />

Službe za informatiku CO razvili su potprograme za dohvat podataka o dokumentima i korisničkim<br />

pravima primjenom Oracle platforme, jezika PL/SQL i tehnologije Oracle Forms. Konačno, djelatnici<br />

FINA-e razvili su procese za obradu i indeksiranje dokumenata na platformi Captiva.<br />

5.1. Arhitektura i oblikovanje sustava<br />

Arhitektura Arhivsko-dokumentacijskog sustava izrađena je na osnovi tehničkih značajki<br />

postojećih informatičkih sustava Croatije osiguranja, korisničkih zahtjeva i korištenih komponenti.<br />

Osnovna zadaća arhitekture jest povezati i integrirati brojne tehnološki raznorodne komponente<br />

različitih proizvođača u jedinstven i funkcionalan dokumentacijski sustav. Nadalje, s obzirom na<br />

planirano uvođenje dokumentacijskog sustava u ostale sektore CO, najvažnije pojedinačno svojstvo<br />

arhitekture jest mogućnost budućeg rasta, odnosno skalabilnost. Stoga je primijenjena modularna<br />

arhitektura s komunikacijski labavo povezanim komponentama. U slučaju potrebe, omogućeno je lako<br />

dodavanje novih i redundantnih modula te zamjena komunikacijskog podsustava novim. Sam<br />

komunikacijski podsustav također je zasnovan na načelu koje osigurava buduću skalabilnost. Opća<br />

arhitektura ADS-a prikazana je na slici 3.<br />

Središnja točka Arhivsko-dokumentacijskog sustava je poslužitelj sustava Japaya. Poslužitelj<br />

Japaye zadužen je za cjelokupno upravljanje dokumentima što uključuje rukovanje samim<br />

dokumentima, upravljanje metapodacima dokumenata, praćenje izmjena, određivanje prava pristupa,<br />

praćenje korisnika i održavanje autentičnosti dokumenata. S obzirom na svoju funkciju, poslužitelj<br />

Japaye je središnja integracijska točka koja povezuje sve komponente ADS-a. Metapodaci<br />

dokumenata te svi sistemski podaci sustava za upravljanje dokumentima pohranjuju se u zasebnoj<br />

bazi podataka. Sustav Japaya povezan je i s bazom podataka sustava ISŽO u kojoj su mu dodijeljena<br />

prava čitanja podataka potrebnih za indeksiranje dokumenata i izradu izvješća. Obje baze podataka<br />

zasnovane su na Oracle DBMS-u, a Japaya se spaja s njima primjenom posebnog sučelja, odnosno<br />

adaptera za Oracle baze podataka. Sami dokumenti, odnosno njihove datoteke, pohranjuju se na<br />

sustavu za pohranu dokumenata Centera. Budući da se Centeri ne pristupa preko standardnih<br />

protokola, već isključivo preko specijaliziranog sučelja, Synerva je za potrebe projekta razvila adapter<br />

za povezivanje s Centerom.<br />

155<br />

9


Autorizacija,<br />

e-mail<br />

Dokumenti<br />

Captiva Importer Interface<br />

Slika 3: Arhitektura Arhivsko-dokumentacijskog sustava<br />

Sljedeća ključna komponenta ADS-a jest poslužitelj sustava za upravljanje ulazom koji je<br />

izgrađen primjenom sustava Captiva. Osnovna zadaća sustava je upravljanje postupkom digitalizacije<br />

i indeksiranja fizičkih dokumenata. Putem klijentskih računala na koja su spojeni scanneri korisnici se<br />

spajaju na poslužitelj, digitaliziraju fizičke dokumente, upisuju indeksne podatke i šalju dokumente u<br />

proces daljnje obrade. Sustav za upravljanje ulazom preuzima slikovne zapise dokumenata, pretvara<br />

ih u željeni format, pridaje im indeksne podatke i potom predaje sustavu za upravljanje dokumentima.<br />

Uz sustav Japaya, sustav za upravljanje ulazom spojen je i na sustav ActiveDirectory kojeg koristi<br />

radi autentikacije i autorizacije korisnika te za dohvat e-mail adresa korisnika. Primjenom elektroničke<br />

pošte sustav obavještava korisnike i administratore sustava u slučaju pojave problema u cjelokupnom<br />

procesu digitalizacije dokumenata. U svrhu povezivanja sustava Captiva i sustava Japaya, Synerva je<br />

izgradila posebnu komponentu koja preuzima dokumente od Captive i učitava ih u dokumentacijski<br />

sustav.<br />

Farma aplikacijskih poslužitelja za aplikacije izgrađene primjenom tehnologije Oracle Forms,<br />

posljednja je ključna komponenta Arhivsko-dokumentacijskog sustava. Farma je zasnovana na<br />

sustavu Oracle IAS i čini poslužiteljsku osnovu poslovnih aplikacija Croatije osiguranja. Budući da je<br />

projektom predviđeno da se sučelje ADS-a integrira u sučelje aplikacije ISŽO, farma je ujedno i<br />

osnova za izvođenje cijelog klijenskog podsustava Japaye. Svi korisnici sustava ISŽO spajaju se na<br />

farmu aplikacijskih poslužitelja te preko nje komuniciraju s dokumentacijskim sustavom i rukuju<br />

dokumentima. Synerva je razvila dvije klijentske komponente koje se izvode u procesima<br />

aplikacijskog poslužitelja i u okolini korisničkog preglednika. Zadaće klijentskih komponenata su<br />

povezivanje klijenata sa sustavom Japaya, posredovanje u razmjeni podataka između klijenata i<br />

Japaye, proširenje funkcionalnosti aplikacije ISŽO, izvođenje dijela obrade dokumenata na Oracle<br />

Forms klijentima, čitanje indeksnih podataka iz baze podataka sustava ISŽO i njihovo povezivanje s<br />

dokumentima. Arhitektura predviđa i mogućnost da su klijenti sustava za upravljanje ulazom i klijenti<br />

farme aplikacijskih poslužitelja ista računala, odnosno digitalizacija se može obavljati na računalima<br />

koja korisnici koriste za rad s aplikacijom ISŽO.<br />

5.2. Programsko ostvarenje<br />

Programska arhitektura Arhivsko-dokumentacijskog sustava prikazana je na slici 4. Sustav<br />

Japaya i sve namjenske komponente koje je Synerva razvila za potrebe projekta, zasnovani su na<br />

Java platformi i načelima objektno-orijentiranih sustava. Iznimka su procesi obrade dokumenata u<br />

sustavu za upravljanje ulazom koje je razvila FINA primjenom namjenskog skriptnog jezika. U<br />

nastavku su opisane pojedine programske cjeline.<br />

156<br />

Oracle Forms Interface<br />

10


5.2.1. Komponenta JapayaServer<br />

Slika 4: Programska arhitektura Arhivsko-dokumentacijskog sustava<br />

Poslužiteljska komponenta JapayaServer središnji je dio sustava koji povezuje sve ostale<br />

komponente i upravlja cijelim sustavom. Izrađena je kao Java aplikacija koja se izvodi kao<br />

poslužiteljski proces. Aplikacija upravlja dokumentima, metapodacima dokumenata i podatkovnim<br />

modelima. Nadalje, provjerava prava pristupa, prati povijesti izmjena, prati pristup dokumentima,<br />

indeksira dokumente i ostvaruje mehanizme pretraživanja dokumenata. Osnovu aplikacije čine<br />

jezgreni moduli dokumentacijskog sustava razvijeni u Synervi. Osim dokumentacijskih modula,<br />

JapayaServer koristi i čitav niz otvorenih J2EE tehnologija poput Hibernatea, Springa ili Lucenea.<br />

Zbog usmjerenosti na otvorene tehnologije, olakšano je pristupanje sustavu, povezivost s drugim<br />

sustavima i održavanje sustava.<br />

Komponenta JapayaServer povezana je na sustav Centera putem namjenski razvijenog<br />

adaptera. Nadalje, JapayaServer izravno je povezan i s dvije baze podataka. Prva baza podataka<br />

namijenjena je dokumentacijskom sustavu koji u nju pohranjuje metapodatke dokumenata i sve<br />

sistemske podatke dokumentacijskog sustava poput povijesti izmjena, podataka o pristupu<br />

dokumentima i popisa korisnika. Druga je baza podataka sustava ISŽO iz koje JapayaServer<br />

dohvaća dio indeksnih podataka te podatke za autorizaciju korisnika. U tu svrhu razvijen je posebni<br />

adapter za sigurnosni sustav Japaye koji autorizacijske podatke dohvaća iz baze sustava ISŽO<br />

izvođenjem pohranjenih potprograma. Pohranjene potprograme razvili su djelatnici aplikacijske grupe<br />

Službe za informatiku CO.<br />

Konačno, JapayaServer spojen je i na komunikacijski poslužitelj od kojega dobiva zahtjeve<br />

klijenata. Nakon obrade zahtjeva, JapayaServer šalje rezultate klijentima, ponovo preko<br />

komunikacijskog poslužitelja. Navedenim je ostvareno potpuno odvajanje poslužitelja od klijenata, a<br />

zahvaljujući modularnoj arhitekturi moguće je komunikacijski podsustav zamijeniti drugim koji će<br />

koristiti druge protokole. Kanaliziranje sve komunikacije prema drugim komponentama kroz<br />

komunikacijski poslužitelj znatno pojednostavljuje razvoj poslužiteljskog dijela dokumentacijskog<br />

sustava. Nadalje, postignuto je fokusiranje isključivo na funkcije dokumentacijskog sustava, a<br />

pouzdanost i sigurnost komunikacije prepušteni su komunikacijskom podsustavu.<br />

157<br />

11


5.2.2. Komunikacijski poslužitelj<br />

Komunikacijski je poslužitelj središnja komunikacijska točka sustava. Sva komunikacija između<br />

klijentskih komponenti sustava i poslužiteljske komponente JapayaServer prolazi kroz njega. Korišteni<br />

komunikacijski protokol je JMS, a implementacija je zasnovana na otvorenom JMS Message Broker<br />

sustavu. Komunikacijski poslužitelj izgrađen je oko reda poruka koje klijenti razmjenjuju s<br />

poslužiteljem Japaye. Dok su poruke koje prenose rezultate izvođenja zahtjeva uvijek usmjerene<br />

prema klijentu koji je postavio zahtjev, poruke koje prenose zahtjeve klijenata prema poslužitelju<br />

nemaju fiksnu ciljnu adresu. Umjesto fiksne adrese koristi se poopćeno adresiranje na poslužitelj.<br />

Poopćeno adresiranje omogućuje da u sustavu postoji više poslužitelja koji se spajaju na isti<br />

komunikacijski red poruka.<br />

Dodavanjem novih poslužitelja povećava se kapacitet sustava i postiže svojstvo razmjernog<br />

rasta dok primjena reda poruka osigurava prirodno raspoređivanje zadataka na dodatne poslužitelje.<br />

Nadalje, postiže se i automatska redundancija sustava kod koje u slučaju ispada jednog poslužitelja,<br />

ostali potpuno automatski preuzimaju njegovo opterećenje. Komunikacijski se podsustav brine i za<br />

kriptiranje i digitalno potpisivanje poruka. Kriptiranjem sadržaja poruke štiti se povjerljivost podataka,<br />

no zbog visokih procesnih zahtjeva kriptiranje je moguće i isključiti. Digitalno potpisivanje poruka služi<br />

autentikaciji svih sudionika u komunikaciji, odnosno osigurava da sustavu neće pristupati neovlaštene<br />

komponente.<br />

5.2.3. Sustav za ulaz dokumenata<br />

Sustav za ulaz dokumenata ostvaren je kao Java aplikacija nazvana CaptivaFolderImporter, a<br />

razvila ju je Synerva. Radi se o jednostavnoj komponenti koja preuzima dokumente od sustava za<br />

upravljanje ulazom i potom ih šalje poslužitelju Japaye radi dodavanja u dokumentacijski sustav.<br />

Razmjena dokumenata između sustava InputAccel i CaptivaFolderImportera zasnovana je na<br />

razmjeni datoteka u dijeljenom direktoriju. CaptivaFolderImporter nadzire dijeljeni direktorij te kada<br />

uoči pojavu datoteke s dokumentom i pripadne indeksne datoteke pokreće postupak dodavanja<br />

dokumenta u sustav. Prilikom preuzimanja dokumenta, CaptivaFolderImporter čita datoteku<br />

dokumenta i pripremljene indeksne podatke koje preoblikuje u podatkovne objekte. Podatkovni objekti<br />

pohranjuju se u poruku zahtjeva, a sama datoteka dokumenta šalje kao podatkovni tok.<br />

5.2.4. Sustav za upravljanje ulazom<br />

Sustav za upravljanje ulazom sastoji se od programskih komponenti InputAccel i eInput. eInput<br />

je Web aplikacija koja korisnicima omogućuje upravljanje scannerom, izvođenje postupka<br />

digitalizacije i indeksiranja dokumenta te slanje dokumenta na poslužitelj. Poslužiteljski dio sustava<br />

eInput prima slikovni zapis dokumenta i indeksne podatke te ih predaje sustavu InputAccel. Zadaća<br />

sustava InputAccel jest obrada slikovnog zapisa, pretvorba u drugi format, obrada indeksnih podataka<br />

te predaja datoteke dokumenta i indeksnih podataka dokumentacijskom sustavu. U opisanoj<br />

implementaciji, InputAccel izvodi manja poboljšanja kvalitete slikovnog zapisa te konvertira dokument<br />

u PDF format. Nadalje, InputAccel očitava crtični kôd koji se nalazi na naslovnici dokumenta, iz njega<br />

izlučuje indeksne podatke dokumenta te ih pohranjuje u tekstualnu datoteku. PDF datoteka i<br />

tekstualna datoteka s indeksnim podacima potom se pohranjuju u dijeljeni direktorij koji nadzire<br />

komponenta CaptivaFolderImporter. Radi autentikacije i autorizacije korisnika, sustav za upravljanje<br />

ulazom spaja se na sustav Active Directory. Procese obrade dokumenata, konverzije u PDF te<br />

očitavanja i spremanja indeksnih podataka razvila je FINA primjenom namjenskog skriptnog jezika<br />

sustava Captiva.<br />

5.2.5. Klijentske komponente sustava<br />

S obzirom na ahitekturu Oracle IAS poslužitelja i tehnološku osnovu sustava Oracle Forms,<br />

klijentski dio Arhivsko-dokumentacijskog sustava podijeljen je u dvije komponente. JapayaJmsClient<br />

je klijentska komponenta koja se izvodi unutar Oracle Forms Run-Time procesa. Komponenta je<br />

pisana u Javi, a pokretanje unutar nativnog procesa omogućeno je putem JNI sučelja. Osnovna<br />

zadaća komponente jest povezivanje Oracle Forms klijenata s poslužiteljem dokumentacijskog<br />

sustava. Budući da se Oracle Forms klijenti izvode na klijentskim računalima unutar Internet<br />

preglednika izvan sigurne zone te s obzirom na ograničenja u izvođenju Java Appleta, nije moguća<br />

izravna komunikacija između njih i poslužitelja Japaye. Stoga sva komunikacija ide od klijenata do<br />

Oracle IAS poslužitelja te potom od njega do poslužitelja Japaye. JapayaJmsClient zadužen je za<br />

implementaciju JMS protokola te slanje i primanje zahtjeva i odgovora s poslužitelja Japaye.<br />

158<br />

12


Uz posredovanje u komunikaciji, komponenta JapayaJmsClient zadužena je i za razmjenu<br />

podataka sa samim klijentskim sučeljem koje se izvodi u pregledniku Interneta. Kako je komunikacija<br />

između Oracle Forms procesa i klijentskog preglednika moguća jedino putem razmjene znakovnih<br />

nizova, JapayaJmsClient provodi i serijalizaciju podataka. Podatkovni objekti koji dolaze od<br />

poslužitelja pretvaraju se u XML i potom šalju kao znakovni nizovi klijentskom pregledniku. Binarna<br />

datoteka dokumenta enkodira se u tekstualni zapis i potom šalje pregledniku. Složenost komunikacije<br />

dodatno komplicira ograničenje duljine tekstualnog zapisa na 4000 znakova. Komponenta<br />

JapayaJmsClient stoga mora provoditi segmentaciju zapisa i slanje pojedinačnih segmenata.<br />

Komponenta također izvodi i obrnuti postupak, odnosno spajanje segmenata u veću cjelinu,<br />

dekodiranje binarnih zapisa iz teksta te deserijalizaciju iz teksta u podatkovne objekte.<br />

Druga klijentska komponenta jest Java Applet sučelja ADS-a nazvan JapayaFormsUI. S obzirom<br />

na složenost dokumentacijskog sustava i korisničkih zahtjeva zaključeno je da primjenom standardnih<br />

Oracle Forms razvojnih alata neće biti moguće ostvariti sve potrebne funkcionalnosti. Stoga je<br />

razvijena Java komponenta JapayaFormsUI koja sadrži cijelo sučelje dokumentacijskog sustava i<br />

izvodi dio obrade dokumenta na klijentu. Komponenta omogućuje pregled i izmjenu metapodataka<br />

dokumenta, pregled sadržaja dokumenta, otvaranje dokumenta u pripadnoj aplikaciji, čitanje i pisanje<br />

dokumenta na lokalne jedinice pohrane, ispis naslovnice dokumenta s crtičnim kôdom, itd.<br />

Uz upravljanje sučeljem i rukovanje dokumentima, JapayaFormsUI ostvaruje i komunikaciju<br />

prema komponenti JapayaJmsClient koja se izvodi na Oracle IAS poslužitelju. Sam Java applet<br />

komponente JapayaFormsUI ugrađen je u posebno pripremljenu integracijsku formu koja ne sadrži<br />

nijedan element sučelja osim samog appleta. Osim pružanja okoline za izvođenje appleta sučelja,<br />

integracijska forma zadužena je i za povezivanje s ostalim formama sustava ISŽO te za dohvat<br />

indeksnih podataka iz baze podataka ISŽO. Forma je razvijena u alatu Oracle Forms Developer i<br />

jeziku PL/SQL<br />

5.3. Sučelje Arhivsko-dokumentacijskog sustava<br />

Sučelje Arhivsko-dokumentacijskog sustava izgrađeno je na osnovi korisničkih zahtjeva i uz<br />

nastojanje da se što više poveća učinkovitost rada korisnika. U fazi planiranja projekta Synerva je<br />

izradila više prototipova sučelja koji su potom prikazani djelatnicima Sektora životnih osiguranja i<br />

Službe za informatiku CO. Na osnovi mišljenja i primjedbi korisnika, prototipovi su iterativno<br />

unaprijeđivani do konačnog prihvaćanja.<br />

Slika 5: Primjeri integracije ADS-a u aplikaciju ISŽO<br />

159<br />

13


Sučelje je u potpunosti integrirano u aplikaciju ISŽO pri čemu su u postojeće forme koje korisnici<br />

koriste u svakodnevnom radu s aplikacijom nadodane dodatne tipke i izbornici kojima se pokreće<br />

dokumentacijski sustav. Primjeri integracije sučelja ADS-a u aplikaciju ISŽO prikazani su na slici 5.<br />

Nakon što korisnik odabere neku akciju dokumentacijskog sustava, aplikacija ISŽO pokreće sučelje<br />

dokumentacijskog sustava te mu predaje opis pokrenute akcije i potrebne podatke. Primjerice, ako<br />

korisnik pokrene akciju dodavanja dokumenta iz forme za obradu šteta, prilikom pokretanja<br />

dokumentacijskog sustava bit će automatski predani i svi potrebni indeksni podaci poput oznake<br />

podružnice, identifikatora štetovnog događaja i broja police. Zahvaljujući opisanom pristupu, korisnik<br />

ne mora ručno unositi indeksne podatke čime mu je znatno olakšan i ubrzan svakodnevni rad. Samo<br />

sučelje dokumentacijskog sustava izrađeno je u Javi, ali je potpuno uklopljeno u Oracle Forms<br />

okolinu. Nadalje, sučelje je potpuno prilagođeno potrebama poslovnih procesa životnih osiguranja i<br />

prirodno podupire sve specifičnosti poslovnih procesa i pripadnih metapodataka. Primjer izgleda<br />

sučelja dokumentacijskog sustava prikazan je na slici 6.<br />

6. ZAKLJUČAK<br />

Slika 6: Primjeri sučelja Arhivsko-dokumentacijskog sustava<br />

Projekt uvođenja Arhivsko-dokumentacijskog sustava pokazao se vrlo složenim. S jedne strane,<br />

bilo je potrebno koordinirati rad tri neovisne tvrtke te dva sektora unutar samog Croatia osiguranja. S<br />

druge strane, projekt je bio tehnički zahtjevan zbog potrebe integracije raznorodnih sustava i<br />

tehnologija koje su međusobno tek djelomično sukladne. Integracija Java komponenti s Oracle Forms<br />

sustavom ostvarena na ovom projektu jedan je od rijetkih takvih primjera u široj regiji. Unatoč svoj<br />

složenosti i problemima koji su se pojavili, projekt je uspješno završen postavljanjem<br />

dokumentacijskog sustava u produkcijski rad 9. veljače 2010. godine.<br />

Dokumentacijski sustav danas koristi oko 150 korisnika koji svakodnevno dodaju oko 200 novih<br />

dokumenata, a broj dokumenata u sustavu narastao je na 400.000. Sustav je dobro prihvaćen od<br />

strane krajnjih korisnika, a zahvaljujući snažnoj potpori Službe za informatiku i Sektora životnih<br />

osiguranja, već dva tjedna od početka produkcije svi djelatnici životnih osiguranja počeli su redovno<br />

koristiti sustav. Produkcijski rad pokazao je da je sustav dobro usklađen s potrebama poslovnih<br />

160<br />

14


procesa i zahtjevima korisnika na terenu. Nakon približno tri mjeseca praktički svi korisnici svladali su<br />

krivulju učenja te je naglo pao broj upita službi za pomoć korisnicima.<br />

Tehnička strana sustava također je uspješno ispunila očekivanja. U početnom razdoblju od<br />

mjesec dana pronađen je i prijavljen neznatan broj problema i nedostataka u radu sustava izazvanih<br />

programskim pogreškama. Navedene pogreške nisu bile ozbiljnije, nisu narušile konzistenciju sustava<br />

te su u kratkom roku ispravljene. Nakon početnog razdoblja, sustav je ušao u potpuno stabilno stanje.<br />

Tijekom 20 mjeseci rada, poslužiteljski dio sustava imao je manje od deset ispada. Pritom je približno<br />

polovica ispada bila uzrokovana problemima kod sistemskog održavanja poslužitelja. Drugu polovicu<br />

ispada uzrokovali su problemi u radu sustava za upravljanje ulazom. Problemi s navedenim sustavom<br />

uzrokovani su gubitkom memorije i poznati su proizvođaču, no otklanjanje problema nije promptno<br />

uslijedilo, već je proizvođač preporučio periodičko ponovno pokretanje poslužitelja. Konačno, tek<br />

jedan ispad uzrokovan je problemima u radu sustava Japaya. Svi navedeni ispadi riješeni su u roku<br />

od jednog radnog dana, a često i znatno brže jer se većina problema pojavila u početnoj godini rada<br />

sustava dok je on bio pod pojačanim nadzorom izvođača radova.<br />

Primjenom Arhivsko-dokumentacijskog sustava ostvarene su značajne promjene i uštede u<br />

izvođenju poslovnih procesa životnih osiguranja, a korisnicima sustava znatno je olakšano rukovanje<br />

dokumentima. Iako su korisnici dobili dodatnu zadaću digitalizacije dokumenata, istovremeno su<br />

rasterećeni od potrebe fizičkog rukovanja dokumentima, uključujući sve vremenske i materijalne<br />

troškove koje ono nosi. Nadalje, korisnicima je ukinuta obveza održavanja priručne i lokalne arhive u<br />

podružnici. Navedene arhive zamijenjene su jednom čija je jedina zadaća privremeno čuvanje fizičkih<br />

dokumenata do trenutka njihovog slanja na pohranu u FINA-u te stoga stvara znatno manje<br />

opterećenje djelatnika. Uštede su postignute i u poštanskim i telekomunikacijskim troškovima jer je<br />

uklonjena potreba za slanjem fizičke dokumentacije u Generalnu direkciju u slučajevima kada su<br />

potrebne dodatne analize i procjene.<br />

Praktična primjena pokazala je da je uvođenjem ADS-a korisnicima pojednostavljeno rukovanje<br />

dokumentima i ubrzan njihov svakodnevni rad. Međutim, jedna od najznačajnijih prednosti sustava<br />

jest povećana dostupnost dokumenata. Elektroničkom ili digitaliziranom dokumentu stvorenom u<br />

podružnici može pristupiti bilo koja ovlaštena osoba, bez obzira na kojoj se fizičkoj lokaciji nalazi.<br />

Ovime je značajno povećana mogućnost nadzora poslovanja, ali je isto tako olakšana razmjena<br />

informacija između djelatnika, omogućena mobilnost djelatnika te traženje specijalističke pomoći koju<br />

najčešće pruža Generalna direkcija. Budući potencijal sustava vrlo je velik jer otvara mogućnosti za<br />

daljnji napredak u poslovnim procesima, dodatnu automatizaciju sustava i nove mogućnosti suradnje i<br />

razmjene dokumenata kako unutar Croatije osiguranja tako i prema vanjskim partnerima.<br />

Razmatrajući uspješnu primjenu Arhivsko-dokumentacijskog sustava, dobru prihvaćenost<br />

sustava kod krajnjih korisnika te stabilnu tehničku osnovu, moguće je zaključiti da je projekt uvođenja<br />

ADS-a uspješno ostvaren. Jedini značajan i ozbiljan nedostatak projekta jest znatno prebacivanje<br />

planiranih rokova. Kašnjenje je znatnim dijelom uzrokovano proširenjem opsega te problemima u<br />

koordinaciji pojedinih aktivnosti i relativnim prioritetima u odnosu na druge projekte unutar Croatije<br />

osiguranja. Međutim, također značajan dio kašnjenja uzrokovan je i odlukom vodstva projekta da se<br />

pristupi podrobnom planiranju i oblikovanju sustava. Na pripremu implementacije i oblikovanje<br />

sustava potrošeno je oko 40% vremena, a 60% vremena potrošeno je na samu implementaciju i<br />

postavljanje sustava. Osnovni motiv za takvu odluku vodstva bilo je nastojanje da sustav, koji je<br />

poslužio kao pilot za uvođenje dokumentacijskog sustava u ostale sektore, bude uspješno<br />

implementiran i prihvaćen kako bi otvorio put za daljnji nastavak projekta.<br />

161<br />

15


ORACLE VPD U PRIMJENI<br />

Nataša Dvoršak<br />

ULJANIK IRI d.o.o., Pula<br />

e-mail: natasa.dvorsak@uljanik.hr<br />

SAŽETAK<br />

Razvoj i sve raširenija primjena informacijskih tehnologija, a posebno BI rješenja, dovode do<br />

situacija kada aplikacijska zaštita podataka više nije dovoljna. Bazi se pristupa iz različitih<br />

sustava/alata, te se otvara pitanje zaštite podataka spremljenih u bazi.<br />

Zašto ne primijeniti već gotovo Oracle rješenje VPD (Virtual Private Database)?<br />

U Oracle ver. 10gR2 uvedena su značajna poboljšanja performansi koja VPD sustav čine iskoristivim<br />

nad transakcijskim podacima.<br />

Prikazat će se dizajn i izrada sustava zaštite u kojem djeluje nekoliko različitih sigurnosnih grupa,<br />

tehnike koje se primjenjuju za bolje performanse, različite mogućnosti filtriranja i prikaza podataka,<br />

bilježenje kritičnih aktivnosti na bazi uz FGA (Fine Grained Auditing).<br />

Oracle VPD in the implementation<br />

The development of information technology, and specifically BI solutions, are leading to situations<br />

where the application data protection is no longer sufficient. Database can be accessed from different<br />

systems / tools, the solution is in data protection in the database. Why not apply the Oracle out of the<br />

box solution VPD?<br />

Oracle in 10gR2 introduced significant performance improvements that make the VPD usable over the<br />

transaction data.<br />

It will be demostrated the design and implementation of security policies in which there are several<br />

different policy groups, the techniques applied to enhance performance, a variety of filtering options<br />

and masking data, recording of critical activities on the database using the FGA.<br />

UVOD<br />

Razvojem informacijske tehnologije rastu i apetiti korisnika za novim informacijama i izvještajima<br />

u svim oblicima. Sve je više informatički pismenih korisnika koji znaju raditi s izvještajnim alatima<br />

poput Oracle BI, Oracle Discoverera, SQL developera, MS Excela i slično. Zaštita podataka u takvom<br />

okruženju veoma je izazovni zadatak. U našem okruženju korisnici imaju jedinstveno korisničko ime<br />

(user na Oracle bazi zaštićen baznim rolama) koje koriste za rad s ERP sustavom, ali također i za<br />

konekciju na bazu s ostalim dostupnim alatima. Tablice kojima se pristupa namijenjene su za pohranu<br />

podataka različitih poslovnih subjekata. Pojedini korisnici ovlašteni su za pristup podacima jednog ili<br />

više poduzeća u sustavu. Sigurnost ERP sustava koncipirana je prema modelu zaštite na nivou<br />

poduzeća, dok je pristup podacima drugim kanalima manjkav. Osim interne zaštite podataka poslovnih<br />

subjekata, pred informatičare se stavljaju i zahtjevi za zaštitu od neovlaštenog pristupa osjetljivim<br />

podacima (npr. prema Zakonu o zaštiti osobnih podataka). Jedno od rješenja koje Oracle nudi je VPD<br />

(Virtual Private Database). VPD dolazi u standardnom paketu Enterprise edicije Oracle baze.<br />

1 UVOD U VPD<br />

1.1 Osnovne informacije<br />

Oracle Virtual Private Database (VPD) je sigurnosni okvir koji je prvi puta implementiran u verziji<br />

baze 8i pod nazivom Fine Grained Access Control (FGAC). Osnovna značajka VPD-a je postizanje<br />

razine sigurnosti na nivou retka (Row Level Security – RLS). U izdanju baze 10g u VPD se dodaje i<br />

mogućnost zaštite na nivou stupaca. Standardno ponašanje zaštite stupaca svodi se na skrivanje<br />

redova s osjetljivim stupcima, a postoji i mogućnost prikazivanja svih redova sa skrivanjem osjetljivih<br />

stupaca (column masking). Skrivanje stupaca može se koristiti samo u SELECT naredbama. VPD<br />

pravila na razini stupaca ne mogu se primjenjivati nad synonymima.<br />

VPD mehanizam temelji se na dinamičkoj modifikaciji naredbi za čitanje (SELECT) ili ažuriranje<br />

162


(INSERT, UPDATE, DELETE) podataka tablica, viewa ili synonyma. Server baze podataka automatski<br />

modificira naredbu koju je korisnik poslao bazi tako da u WHERE klauzulu dodaje uvjete povezujući ih<br />

AND operatorom. Dodatne uvjete vraća funkcija koja je implementirana u okviru sigurnosnih pravila<br />

VPD-a. Ukoliko je nad istim objektom istovremeno aktivno više VPD sigurnosnih funkcija rezultati se<br />

povezuju AND operatorom u WHERE klauzuli. Dakle, postoji mogućnost da jedna sigurnosna politika<br />

uvjetuje isključenje druge i rezultat je tada prazan skup podataka.<br />

1.2 Aplikacijski kontekst<br />

Uz pojam VPD-a vezan je i pojam aplikacijskog konteksta (Application Context). Aplikacijski<br />

kontekst sastoji se od parova ključ-vrijednost koji se smještaju u sigurnu predmemoriju (cache)<br />

podataka. Ovisno o tome u kojem je memorijskom prostoru smješten razlikujemo globalni (System<br />

Global Area) i lokalni aplikacijski kontekst (User Global Area). Lokalni kontekst vidljiv je samo u okviru<br />

jedne bazne sesije, dok je globalni vidljiv svim sesijama baze. Kontekstne vrijednosti povezuju se i<br />

smještaju u grupe, tzv. namespace. Svaka sesija Oracle baze uvijek kreira zadani USERENV<br />

namespace sa svojim kontekstnim atributima, ali moguće je kreirati i vlastite grupe (namespace) sa<br />

svojim atributima.<br />

U kontekstu VPD-a aplikacijski kontekst zanimljiv je iz dva glavna razloga:<br />

− optimizacija izvođenja,<br />

− implementacija vlastitih grupa sigurnosti.<br />

Optimizacija izvođenja uz korištenje aplikacijskog konteksta moguća je zahvaljujući:<br />

− brzom pristupu atributima konteksta,<br />

− korištenju vrijednosti kontekstnih atributa u predikatima WHERE klauzule,<br />

− mogućnosti kreiranja uvjeta koji imaju atribute slične "bind" varijablama.<br />

Atributi konteksta smješteni su u posebnom memorijskom prostoru koji omogućava brzi pristup.<br />

Umjesto da se neprestano pristupa vrijednostima u baznim tablicama, ubrzanje se može postići<br />

čitanjem vrijednosti iz aplikacijskog konteksta. Dobra je praksa koristiti predikate WHERE klauzule s<br />

funkcijama koje vraćaju kontekstne vrijednosti, jer se na taj način uspijeva izbjeći korištenje konstanti u<br />

predikatima i kreiranje jednakog predikata za više korisnika sustava.<br />

Primjer 1:.<br />

select * from employees t where t.department_id = sys_context('EMP',<br />

'DEPARTMENT_ID')<br />

U verziji baze 10g uveden je i novi parametar "Policy Type" funkcije za kreiranje VPD sigurnosne<br />

politike DBMS_RLS.ADD_POLICY kojim se može utjecati na performanse servera baze.<br />

163


Tabela 1: DBMS_RLS.ADD_POLICY utjecaj Policy Type parametra [1]<br />

Još jedan razlog korištenja aplikacijskog konteksta u okviru VPD-a krije se u korištenju vlastitih<br />

grupa sigurnosne politike. Zadana (default) sigurnosna grupa je SYS_DEFAULT. Sigurnosna politika<br />

VPD-a definirana na grupi SYS_DEFAULT uvijek se izvodi. Vlastite VPD grupe kreiraju se kada se želi<br />

uvjetovati izvođenje neke VPD sigurnosne politike. Kreiranjem posebnih sigurnosnih grupa stvara se<br />

mogućnost istovremene aktivnosti sigurnosne politike samo jedne od ne-SYS_DEFAULT grupa. U<br />

jednoj korisničkoj sesiji uvijek je aktivna sigurnosna politika SYS_DEFAULT grupe i samo jedne ili svih<br />

vlastitih grupa. Koja je grupa aktivna definira se posebnim atributom aplikacijskog konteksta (Driving<br />

Context). Ukoliko Driving Context atribut nije definiran ili je vrijednost NULL tada će VPD mehanizam<br />

aktivirati sve sigurnosne politike.<br />

1.3 Administracija VPD-a<br />

Administracija VPD sigurnosnih pravila u potpunosti se obavlja uz pomoć paketa DBMS_RLS.<br />

Pomoću ovog paketa mogu se dodavati, aktivirati/deaktivirati, osvježavati i brisati sigurnosna pravila ili<br />

grupe VPD-a, te dodavati ili brisati aplikacijski kontekst. VPD pravila mogu se definirati nad tablicama,<br />

viewima ili synonymima baze.<br />

Osnovni postupak kreiranja VPD pravila svodi se na:<br />

• Kreiranje funkcije koja vraća predikat WHERE uvjeta (VARCHAR2), a prima dva parametra<br />

vlasnik i ime tablice.<br />

• Pridruživanje funkcije tablici (DBMS_RLS.ADD_POLICY).<br />

U radu s VPD grupama postupak je nešto složeniji:<br />

• potrebno je kreirati aplikacijski kontekst (lokalni ili globalni)<br />

• pridružiti tablici grupu (DBMS_RLS.CREATE_POLICY_GROUP)<br />

• pridružiti tablici funkciju (DBMS_RLS.ADD_GROUPED_POLICY)<br />

• pridružiti tablici atribut aplikacijskog konteksta, tzv. "driving context" tablici<br />

(DBMS_RLS.ADD_POLICY_CONTEXT)<br />

164


Tabela 2: DBMS_RLS popis funkcija i procedura [1]<br />

Osim ovog paketa za rad s VPD-em potreban je i DBMS_SESSION koji omogućava ažuriranje<br />

kontekstnih varijabli.<br />

Primjer 2.<br />

dbms_session.set_context(namespace => 'CONTEXT_VPD',<br />

attribute => 'POLICY_GROUP',<br />

value => 'FIN');<br />

1.4 Informacije o VPD okruženju<br />

Sve informacije o postavljenom VPD okruženju na bazi smještene su u nekoliko tablica/viewa<br />

kataloga baze. Administrator VPD-a svakako treba konzultirati ove tablice kako bi dobio točnu sliku<br />

definiranog sustava zaštite, kao i za provjeru funkcioniranja sustava VPD-a (V$VPD_POLICY). U<br />

V$VPD_POLICY zapisani su predikati koji se dodaju WHERE klauzuli tablice/viewa/synonyma. View<br />

koji se u literaturi gotovo i ne spominje je USER/ALL/DBA_SEC_RELEVANT_COLS u kojem se<br />

nalaze podaci o stupcima tablica koje su uključene u VPD sigurnost.<br />

165


Tabela 3: Popis "data dictionary" view-a koji opisuju VPD postavke [2]<br />

Za potrebe testiranja sustava vjerojatno ćete konzultirati i zapise u viewima V$CONTEXT i<br />

V$GLOBALCONTEXT.<br />

166


2 VLASTITO RJEŠENJE<br />

Slika 1: Pogled na podatke u V$VPD_POLICY<br />

Implementacija VPD-a u našem okruženju imala je za cilj ugradnju mehanizama zaštite podataka<br />

na razini poduzeća koji neće zahtijevati velike zahvate u programskom rješenju. Sigurnosni zahtjevi<br />

trebaju biti zadovoljeni prilikom svakog pristupa podacima, dakle s bilo kojim alatom za manipuliranje<br />

podacima baze.<br />

Nakon prijelaza na bazu 10g, VPD se sporadično koristi za zaštitu podataka pojedinih tablica i<br />

viewa koji su kreirani za potrebe korištenja u Oracle Discoverer analizama, te u iznimnim slučajevima<br />

zaštite izrazito osjetljivih podataka. Novo rješenje trebalo bi pokriti sve opće zahtjeve zaštite podataka<br />

na razini poduzeća (retka tablice) i zaštite osjetljivih podataka u tablicama. Osim VPD-a u našem<br />

okruženju koristi se i Fine grained auditing (FGA) za praćenje manipulacija podacima nad izrazito<br />

osjetljivim tablicama (npr. plaće).<br />

U realizaciji rješenja vodili smo se idejom da poslovna pravila VPD sigurnosti budu što<br />

jednostavnija (tako savjetuju i u literaturi koju smo proučavali). Takvo razmišljanje išlo je u smjeru da<br />

se izrade dvije funkcije, jedna za zaštitu redaka i druga za zaštitu osjetljivih stupaca te se one pridruže<br />

svim tablicama/viewima koji zahtijevaju sigurnost podataka. Unutar funkcija mogu se razraditi<br />

mehanizmi pristupa ovisno o postavljenim ovlaštenjima korisnika. U konačnoj verziji rješenja, funkcije<br />

za vraćanje predikata VPD mehanizma prilično su jednostavne. U after logon triggeru baze ugrađen je<br />

mehanizam punjenja atributa aplikacijskog konteksta s vrijednostima predikata za svaku od tablica.<br />

Ovlasti korisnika za rad u VPD okruženju definirane su u posebnoj baznoj tablici. Na temelju zapisa u<br />

tablici kreira se predikat VPD mehanizma.<br />

function row_vpd(p_schema in varchar2, p_table in varchar2)<br />

return varchar2 is<br />

v_result varchar2(1000);<br />

begin<br />

v_result := nvl(sys_context('NEKI_CONTEXT', upper(p_table)), '1=0');<br />

return v_result;<br />

end vrati_drustva_vpd;<br />

function col_vpd(p_schema in varchar2, p_table in varchar2)<br />

return varchar2 is<br />

v_rv varchar2(2000);<br />

begin<br />

v_rv := nvl(sys_context('NEKI_CONTEXT', upper(p_table) ||'_COL'),<br />

'1=0');<br />

return v_rv;<br />

end;<br />

Jednostavnost je primijenjena i za odabir tablica nad kojima će se dignuti VPD zaštita. Uključili<br />

smo svega nekoliko ključnih tablica u kojima se može primijeniti zaštita redaka na razini poduzeća. U<br />

tablicama kćerima, tamo gdje je bilo potrebno, primijenili smo samo zaštitu na nivou stupaca. Zaštitom<br />

167


na razini tablica automatski su u VPD uključeni i svi viewi koji se vežu uz odabrane tablice.<br />

Testiranjem ove početne zamisli naišlo se na sljedeće probleme u radu:<br />

− VPD sigurnosna politika provodi se uvijek, čak i u baznim procedurama i funkcijama čiji je<br />

vlasnik korisnik koji ima ovlaštenja pristupa svim redcima ili stupcima<br />

− korištenje "data masking" opcije zaštite uzrokuje grešku (FRM 40654:Record has been<br />

updated by another user ...) prilikom pokušaja ažuriranja podataka u Oracle Forms aplikaciji.<br />

Kako bi se izbjegli dodatni problemi u radu ERP sustava, koji se bazira na Oracle Forms/Reports<br />

rješenju, odlučeno je da je u radu s aplikacijom najbolje izbjeći aktivaciju VPD sigurnosnih pravila.<br />

Razmatrana su dva moguća rješenja:<br />

− u VPD funkciju ugraditi logiku izbjegavanja VPD-a vraćanjem uvijek istinitog predikata, npr.<br />

"1=1"<br />

− iskoristiti mogućnosti vlastitih VPD sigurnosnih grupa (policy groups) tako da se ovisno o<br />

aplikacijskom kontekstu aktivira zadovoljavajuća grupa.<br />

Odlučeno je da se iskoristi ova druga mogućnost, jer prvi način uvijek aktivira neku sigurnosnu<br />

politiku nad tablicama, dok u radu s grupama postoji mogućnost izbjegavanja aktivacije VPD<br />

mehanizma. Identificirane su tablice čije retke i/ili stupce treba zaštititi. Implementacija s vlastitim VPD<br />

grupama zahtjeva nekoliko koraka. Svakoj od tablica treba se pridružiti kontekst aplikacijske grupe<br />

(DBMS_RLS.ADD_POLICY_CONTEXT), zatim svakoj tablici pridružiti svaku od vlastitih VPD grupa<br />

(SYS_DBMS_RLS.CREATE_POLICY_GROUP) i na kraju, opcionalno, pridružiti policy funkciju<br />

(DDMS_RLS.ADD_GROUPED_POLICY). Slijedeći te korake, svakoj od relevantnih tablica pridružen<br />

je kontekst aplikacijske grupe.<br />

Slika 2: Shematski prikaz modela VPD implementacije<br />

168


egin<br />

dbms_rls.add_policy_context(object_schema => 'VLASNIK',<br />

object_name => 'TABLICA',<br />

namespace => 'VPD_CONTEXT',<br />

attribute => 'VPD_POLICY_GROUP');<br />

end;<br />

/<br />

Kreirane su dvije VPD sigurnosne grupe "VPD_PL_SQL" i "VPD_NULL" za svaku od tablica:<br />

begin<br />

sys.dbms_rls.create_policy_group(object_schema => 'VLASNIK',<br />

object_name => 'TABLICA',<br />

policy_group => 'VPD_PL_SQL');<br />

end;<br />

/<br />

begin<br />

sys.dbms_rls.create_policy_group(object_schema => 'VLASNIK',<br />

object_name => 'TABLICA',<br />

policy_group => 'VPD_NULL');<br />

end;<br />

/<br />

Za grupu "VPD_NULL" nije kreiranja nikakva sigurnosna politika, tj. nije pridružena ni jedna<br />

funkcija za vraćanje predikata, dok je za grupu "VPD_PL_SQL" svakoj od tablica pridružena bar jedna<br />

od dviju funkcija.<br />

begin<br />

dbms_rls.add_grouped_policy(object_schema =>'VLASNIK',<br />

object_name =>'TABLICA',<br />

policy_group =>'VPD_PL_SQL',<br />

policy_name =>'TABLICA_col',<br />

function_schema =>'VLASNIK',<br />

policy_function =>'vpd_p.col_vpd',<br />

sec_relevant_cols =>'OPC,NAS,UL,KBR',<br />

sec_relevant_cols_opt=>dbms_rls.all_rows,<br />

policy_type =>dbms_rls.CONTEXT_SENSITIVE);<br />

end;<br />

/<br />

169


Slika 3: Ovisno o modelu konekcije na bazu korisniku se 'podmeće' odgovarajuća VPD grupa<br />

Za evidenciju podataka o grupama koje će se aktivirati prilikom konekcije na bazu kreirana je<br />

tablica u koju se za specifične atribute konekcije (korisnik baze, program, računalo/server, korisnik<br />

OS-a) zapisuje koja će se VPD grupa aktivirati. Prilikom konekcije na bazu okida se after logon trigger<br />

baze u kojem se poziva procedura za postavljanje konteksta VPD okruženja. U kontekstne atribute<br />

zapisuju se predikati svake sigurnosne grupe, te grupa koja predstavlja Driving Context. Postavljeno<br />

rješenje zadovoljava zahtjeve koji su postavljeni, ali je administracija dijelom zahtjevna.<br />

Sljedeći korak poboljšanja bio bi izgradnja grafičkog sučelja za potpunu administraciju VPD<br />

sigurnosne politike. Treba napraviti sučelje ("dashboard") na kojem će se vidjeti statusi svih definiranih<br />

VPD pravila i na kojem će biti jednostavne "komande" za aktivaciju i deaktivaciju pravila, te mogućnost<br />

definiranja novih.<br />

3 MOGUĆI PROBLEMI<br />

3.1 Oracle Forms aplikacija<br />

Kada se koristi VPD zaštita stupaca maskiranjem podataka javlja se problem ažuriranja podataka<br />

u Oracle Forms modulu, jer je vrijednost polja na ekranu (NULL) različita od one zapisane u bazi. Ova<br />

greška dovodi do otkrića još jednog problema sigurnosti VPD-a. 'Column masking' opcija zaštite radi<br />

samo nad SELECT naredbama. Kada nad istom tablicom izvedete SELECT ... FOR UPDATE tada<br />

'column masking' zaštita više ne funkcionira. SELECT FOR UPDATE je upravo ono što forma radi<br />

kada pokuša rezervirati slog za ažuriranje u izvornom ON-LOCK triggeru i tada se uspoređuju učitane<br />

vrijednosti s vrijednostima na bloku forme. Kada vrijednosti nisu jednake javlja grešku FRM 40654.<br />

Ova greška može se zaobići samo izmjenama u Forms modulu.<br />

170


Slika 4: Pokušaj ažuriranja podataka na formi koja ima maskirane stupce<br />

U našem rješenju oslonili smo se na sigurnost implementiranu u aplikaciji, te smo kod prijave u<br />

aplikaciju aktivirali VPD grupu (Driving Context) koja nema implementirane VPD funkcije.<br />

Istraživanjem po forumima, na linku http://www.orafaq.com/forum/t/30540/2/ postoji zapis o još<br />

jednoj mogućnosti pojave greške FRM 40654. Problem je dokumentiran kao Oracle Bug 7344505<br />

(metalink ID 759252.1). Greška se javlja samo kod dinamičkih VPD predikata. Na forumu je naveden<br />

primjer ažuriranja tablice kćeri D na koju je podignut VPD predikat koji provjerava postojanje retka u<br />

roditeljskoj tablici M. VPD pravila dozvoljavaju ažuriranje tablice D, dok ažuriranje tablice M nije<br />

dozvoljeno VPD-em. Kada se na formi pokrene ažuriranje retka tablice D forms modul izvodi<br />

zaključavanje sa SELECT FOR UPDATE koji kao rezultat vraća 0 redova i navodi forms modul na<br />

grešku kao da je netko obrisao slog.<br />

Greška se može zaobići zahvatom u ON-LOCK triggeru koji bi trebao na trenutak isključiti VPD.<br />

3.2 PL/SQL kôd na bazi<br />

Naišli smo i na problem u radu baznih procedura i funkcija u kojima nam je VPD zaštita neželjena<br />

pojava. Npr. željeli smo kontrolirati da li se JMBG radnika pojavljuje u tablicama ostalih poslovnih<br />

subjekata kao "nepoželjni" radnik. I ovaj problem zaobiđen je aktivacijom posebne VPD grupe prilikom<br />

prijave u aplikaciju. Rješenje se moglo postići i poigravanjem s atributima aplikacijskog konteksta, ali<br />

to je zahtjevalo zahvate u kôdu koje smo nastojali izbjeći.<br />

3.3 Rad s definiranim VPD grupama<br />

Prilikom definiranja vlastitih VPD grupa potrebno je u svaku od grupa uključiti sve tablice koje se<br />

pojavljuju u bilo kojoj od grupa. Mogući scenarij je npr.: kreirali ste grupu G1 i nju pridružili tablicama<br />

T1 i T2, zatim grupu G2 i nju priključili tablici T1. Kada korisnik u sesiji na bazi ima pridruženu grupu<br />

G2 i pokuša čitati tablicu T2 javit će se greška:<br />

ORA-28123 Driving context 'string,string' contains invalid group 'string'.<br />

Uvijek provjerite podatke u tablici DBA/USER/ALL_POLICY_GROUPS, tj. da li je svakoj od tablica<br />

pridružena svaka od grupa.<br />

3.4 Greške u VPD funkcijama<br />

Ukoliko je funkcija koja vraća predikat VPD-a u statusu "invalid" ili ima grešku javit će se poruka<br />

171


greške prilikom rada s tablicom/viewom:<br />

ORA-28112 Failed to execute policy function.<br />

Kada funkcija vrati predikat s neispravnom sintaksom javit će se:<br />

ORA-28113: policy predicate has error<br />

3.5 DBMS_RLS Policy Type<br />

Ukoliko u predikatima VPD pravila koristite aplikacijski kontekst tada parametar policy type<br />

prilikom kreiranja VPD pravila (DBMS_RLS.ADD_POLICY, DBMS_RLS.ADD_GROUPED_POLICY)<br />

ne smije imati vrijednost STATIC ili SHARED_STATIC. Na primjerima koji su testirani predikat je bio<br />

oblika:<br />

ime_kolone = SYS_CONTEXT('NEKI_CONTEXT','ATRIBUT').<br />

Rezultat VPD pravila bio je nepredvidiv, ovisio je o vrijednosti inicijalno pohranjenoj u SGA<br />

međumemoriju. Kada se parametar Polici Type postavlji kao DYNAMYC, CONTEXT_SENSITIVE,<br />

SHARED_CONTEXT_SENSITIVE pravila VPD-a s kontekstnim varijablama u predikatima rade<br />

ispravno.<br />

3.6 Rekurzija u VPD definiciji<br />

Potrebno je naglasiti mogućnost pojave rekurzije. Oprezno koristite tablice/viewe koji imaju<br />

podignutu VPD zaštitu u funkcijama za vraćanje VPD predikata. Moguć je scenarij beskonačne petlje<br />

kada npr. funkcija F1 poziva proceduru P2, koja zatim poziva proceduru P3 koja čita iz tablice koja ima<br />

implementiranu VPD zaštitu funkcijom F1.<br />

Za bolje performanse analizirajte predikate koje kreiraju VPD funkcije čitajući zapise u<br />

V$VPD_POLICY, te podignite odgovarajuće indexe.<br />

3.7 Web aplikacija<br />

U web aplikacijama praksa je da se konekcija na bazu radi s fiksnim aplikacijskim korisničkim<br />

imenom, npr. APPKORISNIK. U takvoj situaciji VPD sigurnost se ne može oslanjati na korisnika baze<br />

(APPKORISNIK), već na korisnika koji se prijavio u aplikaciju. Za takvu situaciju postoji relativno<br />

jednostavno rješenje. Kreirati će se novi atribut globalnog aplikacijskog konteksta REALUSER čija će<br />

vrijednost biti stvarni korisnik aplikacije.<br />

begin<br />

sys.dbms_session.set_context(namespace => 'VPD_GLOB_CTX',<br />

attribute => 'REALUSER',<br />

value => upper(p_user),<br />

username => user,<br />

client_id => upper(p_user));<br />

dbms_session.set_identifier(p_user);<br />

end;<br />

Kreirati će se nova VPD sigurnosna grupa VPD_WEB_SEC čije funkcije će se oslanjati na<br />

korisnika zapisanog u globalnom aplikacijskom kontekstu.<br />

172


Tabela 4: Predloženi scenarij VPD-a ovisno o modelu konekcije na bazu [1]<br />

Budući da web rješenja u našem okruženju nemaju široku primjenu, a korisnik za konekciju na<br />

bazu koristi se isključivo u aplikaciji, odlučili smo u tim rješenjima za sada ostati na VPD zaštiti<br />

jedinstvenog korisnika koji se konektira na bazu.<br />

4 ZAOBILAŽENJE VPD-A<br />

Dobro je znati da VPD pravila ne pogađaju sve korisnike. To je učinjeno namjerno iz više razloga.<br />

Jedan od razloga je kako bi se osigurao potpuni i točni backup svih podataka. Također, bilo bi<br />

problema kada bi se dogodila neka greška u nekoj od funkcija VPD-a koja ne bi dozvoljavala<br />

konekciju na bazu ni jednom korisniku.<br />

Zadana je postavka Oracle baze da su svi korisnici koji imaju SYSDBA privilegiju isključeni iz<br />

VPD-a. Također, i korisnici kojima je dodijeljena sistemska privilegija "EXEMPT ACCESS POLICY" ne<br />

prolaze kroz VPD sigurnosni sustav. Dobro je periodično provjeriti korisnike kojima je ta privilegija<br />

dodijeljena:<br />

select * from dba_sys_privs where privilege = 'EXEMPT ACCESS POLICY';<br />

Dodjeljivanje ove sistemske privilegije treba izbjegavati u praksi, a pogotovo uz opciju "with admin<br />

option". Na primjeru vlastitog rješenja prikazano je kako se VPD sigurnost može postaviti tako da se<br />

ovisno o kontekstu konekcije na bazu pojedina pravila VPD-a uključe ili isključe.<br />

5 SIGURNOST VPD OKRUŽENJA<br />

5.1 Potencijalni problemi<br />

VPD nije savršen i potpuno siguran mehanizam. Postoji niz slabih karika koje treba dodatno<br />

osigurati. Moguće slabe točke VPD-a su:<br />

− informacije o predikatima<br />

− informacija o VPD definicijama<br />

− zaštita VPD strukture baznim rolama<br />

− mogućnosti zaobilaženja VPD-a<br />

− SQL injekcija<br />

− pristup podacima izvan baze.<br />

173


5.2 Informacije o predikatima<br />

Iz viewa v$vpd_policies moguće je dobiti popis izvedenih sigurnosnih pravila VPD-a i njihovih<br />

predikata. Ovo je zanimljiv view, pogotovo ako se poveže s v$sqlarea ili v$sql tako da se dobije<br />

originalni SQL i korišteni predikat. Ovo je primjer jednog takvog upita na bazu:<br />

select sql_text, predicate, policy, object_name<br />

from v$sqlarea, v$vpd_policy<br />

where hash_value = sql_hash;<br />

Zbog sigurnosti, pristup ovim podacima baze treba dozvoliti samo administratorima sustava.<br />

Postoji i nekoliko načina da se "trejsanjem" dođe do podataka o predikatima VPD pravila. Jedan<br />

od jednostavnijih načina je uz korištenje "Event 10730":<br />

alter session set sql_trace=true;<br />

alter session set events '10730 trace name context forever';<br />

select * from neka_tablica_koja_ima_vpd;<br />

alter session set events '10730 trace name context off';<br />

alter session set sql_trace=false;<br />

Datoteka s rezultatima izgleda otprilike ovako:<br />

*** 2003-10-19 16:30:59.000 *** SESSION ID:(7.64) 2003-10-19 16:30:59.000<br />

------------------------------------------------------------- Logon user<br />

: VPD Table or View : VPD.TRANSACTIONS Policy name : VPD_TEST_POLICY<br />

Policy function: VPD.VPD_POLICY.VPD_PREDICATE RLS view : SELECT<br />

"TRNDATE","CREDIT_VAL","DEBIT_VAL","TRN_TYPE","COST_CENTER" FROM<br />

"VPD"."TRANSACTIONS" "TRANSACTIONS" WHERE (cost_center='ACCOUNTS')<br />

Iz podataka se može isčitati predikat VPD-a. Slično se može iskoristiit i "Event 10060".<br />

5.3 Informacije o VPD definicijama<br />

Iz viewa %_POLICY_GROUPS, %_POLICY_CONTEXTS, %_POLICIES,<br />

%_SEC_RELEVANT_COLS moguće je saznati detalje o VPD konfiguraciji. Pristup ovim podacima<br />

treba ograničiti isključivo na administratore sustava. Također treba zaštititi i pristup podacima o<br />

izvornom kodu funkcija koje se koriste za vraćanje predikata (OBJ$, SOURCE$, PROCEDURE$,<br />

ARGUMENT$, %_SOURCE, V$CONTEXT, v$GLOBALCONTEXT i ostalo).<br />

5.4 Zaštita VPD strukture baznim rolama<br />

U prethodnom poglavlju spomenuti su neki od viewa koje treba dodatno zaštititi. Osim toga treba<br />

poraditi i na zaštiti paketa DBMS_RLS i DBMS_SESSION. Potrebno je razmisliti o zaštiti lokalnog i<br />

globalnog konteksta. Preporuka je da se kontekst definira tako da se dozvoli ažuriranje isključivo<br />

preko dedicirane bazne procedure, koju treba zaštititi od neovlaštenog izvođenja.<br />

Vlastite tablice, procedure, triggeri u kojima se definiraju dodatni parametri VPD okruženja<br />

trebaju se uključiti u strogi mehanizam zaštite. Nikako se ne smiju zanemariti i sistemske privilegije<br />

kojima se može utjecati na navedene objekte.<br />

5.5 Mogućnost zaobilaženja VPD-a<br />

Već je spomenuto kako se VPD u potpunosti može zaobići s "EXEMPT ACCESS POLICY"<br />

sistemskim ovlaštenjem. Osim toga u praktičnoj implementaciji VPD-a koriste se vlastite tablice i<br />

kontekstne varijable. Ove podatke moguće je zlonamjerno očitati ili izmijeniti i na taj način prevariti<br />

VPD. Korisnici s ovlastima nad paketom DBMS_RLS imaju mogućnost rušenja (drop) ili kreiranja VPD<br />

pravila.<br />

5.6 SQL injekcija<br />

U knjizi "Oracle Hacker’s Handbook" [4] prikazano je kako se SQL injekcijom može npr. izvršiti<br />

174


ušenje (drop) VPD pravila. Ukratko, preko procedure XDB_PITRIG vlasnika XDB koji ima ovlasti za<br />

izvođenje DBMS_RLS napravljena je SQL injekcija naredbe DBMS_RLS.DROP_POLICY.<br />

SQL> CONNECT SCOTT/TIGER<br />

Connected.<br />

SQL> SELECT * FROM VPD.VPDTESTTABLE;<br />

CLASSIFICATION ORDER_TEXT RANK<br />

-------------------- -------------------- --------------<br />

UNCLASSIFIED UPDATE DUTY ROTA CORPORAL<br />

UNCLASSIFIED POLISH BOOTS MAJOR<br />

SQL> CREATE OR REPLACE FUNCTION F RETURN NUMBER AUTHID CURRENT_USER IS<br />

2 PRAGMA AUTONOMOUS_TRANSACTION;<br />

3 BEGIN<br />

4 DBMS_OUTPUT.PUT_LINE('HELLO');<br />

5 EXECUTE IMMEDIATE 'BEGIN<br />

SYS.DBMS_RLS.DROP_POLICY(''VPD'',''VPDTESTTABLE'',''SECRECY''); END;';<br />

6 RETURN 1;<br />

7 COMMIT;<br />

8 END;<br />

9 /<br />

Function created.<br />

SQL> CREATE TABLE FOO (X NUMBER);<br />

SQL> EXEC XDB.XDB_PITRIG_PKG.PITRIG_DROP('SCOTT"."FOO" WHERE<br />

1=SCOTT.F()--','BBBB');<br />

PL/SQL procedure successfully completed.<br />

SQL> SELECT * FROM VPD.VPDTESTTABLE;<br />

CLASSIFICATION ORDER_TEXT RANK<br />

-------------------- -------------------- --------------------<br />

SECRET CAPTURE ENEMY BASE GENERAL<br />

UNCLASSIFIED UPDATE DUTY ROTA CORPORAL<br />

SECRET INVADE ON TUESDAY COLONEL<br />

UNCLASSIFIED POLISH BOOTS MAJOR<br />

5.7 Pristup podacima izvan baze<br />

Direktnim pristupom "sirovim" podacima na disku mogu se očitati podaci koj su VPD-em<br />

zaštićeni. U "Oracle Hacker’s Handbook" [4] prikazan je jedan takav primjer Java procedure na bazi<br />

koja čita "sirove" podatke i ispisuje ih. Ovakvoj opasnosti podvrgnute su "backup" i "export" datoteke.<br />

Osjetljive podatke trebalo bi dodatno zaštititi enkripcijom.<br />

5.8 Column Masking slabosti<br />

Column Masking opcija zaštite stupaca funkcionira sam uz SELECT naredbe, i to na prvi pogled<br />

izgleda u redu. Međutim, jedna od grešaka koja je uočena testiranjem sustava, a nema zapisa o tome<br />

u literaturi je problem naredbe SELECT ... FOR UPDATE. Takvim dohvatom podataka stupci tablice<br />

nisu maskirani kao što bi se očekivalo.<br />

Propust u sugurnosti "Column Maskinga" može se uočiti i pozivom naredbe UPDATE, tako na<br />

primjer naredbom:<br />

update radnici t<br />

set t.neko_polje = ''<br />

where id = 2413 returning jmbg into :jmbg;<br />

može se očitati zapis stupca koji očekujemo da bude skriven VPD-om.<br />

Na temelju prikazanih primjera zaključuje se da je maskiranje stupaca sigurno samo u slučaju kada<br />

korisnik nema pridružene bazne ovlasti za ažuriranje zaštićene tablice.<br />

175


ZAKLJUČAK<br />

VPD nije svemoguć! Prikazali smo neke od mogućnosti zlouporabe. Mehanizam maskiranja<br />

stupaca ima iznenađujućih propusta. Za efikasnu zaštitu servere i bazu treba dodatno pratiti i zaštititi,<br />

te primijeniti višeslojnu zaštitu. Treba znati da je VPD samo jedan od segmenata zaštite. Primjenjiv je<br />

i efikasan u radu korisnika koji bazi pristupaju samo s ovlastima za čitanje podataka. VPD nikako ne<br />

pruža kvalitetnu zaštitu od zlonamjernih napada na podatke. Glavna prednost je u tome što se<br />

implementira direktno na bazi i ne zahtjeva dodatne izmjene u aplikacijama, a koristi ga svaka<br />

aplikacija koja pristupa bazi.<br />

Ukoliko se, unatoč prikazanim nedostacima, ipak odlučite koristiti Oracle VPD, nastojite primijeniti<br />

zlatno pravilo jednostavnosti kako se ne biste izgubili u džungli administracije VPD pravila.<br />

LITERATURA<br />

1. Oracle® Database Security Guide 10g Release 2 (10.2)<br />

2. Ben-Natan, R. (2009): HOWTO Secure and Audit Oracle 10g and 11g, Auerbach Publications<br />

3. Knox, D. C. (2004): Effective Oracle Database 10g Security by Design, McGraw-Hill<br />

4. David Litchfield (2007): Oracle Hacker’s Handbook, Wiley<br />

5. Thomas Kyte: Expert one-on-one Oracle, Apress<br />

LINKOVI<br />

6. https://forums.oracle.com/forums/<br />

7. http://www.petefinnigan.com/Oracle_Security_VPD6Slides.pdf<br />

8.<br />

http://www.symantec.com/connect/articles/oracle-row-level-security-part-2<br />

176


ORACLE/ORACLE SPATIAL I FME ETL - RAZMJENA PODATAKA NEOVISNO O<br />

FORMATU<br />

Martin Martić<br />

Multisoft d.o.o., Zagreb, Ivana Broza 12/II<br />

Mob: 098/9000 465<br />

e-mail: martin.martic@multisoft.hr<br />

web: www.multisoft.hr<br />

Mario Starčević<br />

Multisoft d.o.o., Zagreb, Ivana Broza 12/II<br />

e-mail: mario.starcevic@multisoft.hr<br />

SAŽETAK<br />

Ovaj referat opisuje alate i tehnike koji osiguravaju jedinstveni način prikupljanja i izdavanja<br />

podataka izmeĎu Oracle/Oracle Spatial baze podataka i različitih standardnih i nestandardnih - ASCII,<br />

CAD, raster, data base i/ili GIS - formata s naglaskom na prostorne podatke. Isto tako prikazane su<br />

mogućnosti podrške procesa kontrole kvalitete, analize i reformatiranja prostornih podataka, njihove<br />

standardizacije, primjene za pojedinačne poslove kao i automatizacije za masovne istovrsne poslove.<br />

Rad se temelji na FME Desktop i FME Server softverima.<br />

SUMMARY<br />

This paper describes tools and techniques that provide a unique way of collecting and publishing<br />

data between Oracle/Oracle Spatial database and various standard and non-standard – ASCII, CAD,<br />

raster, database and/or GIS - formats with focus on spatial data. Also, the support for process of<br />

quality control, analysis and reformatting of spatial data, its standardization, implementation of<br />

individual tasks and automation of mass equivalent transactions are displayed. The paper is based on<br />

FME Desktop and FME Server software.<br />

1 UVOD<br />

Najjača komponenta geografskih informacijskih sustava je vizualizacija. To je razlog zašto sve<br />

više firmi koristi, uvodi ili planira uvesti GIS sustav u svoje poslovanje. GIS kao integrator vektorskih,<br />

rasterskih, prostornih i drugih vrsta podataka unutar jednog sustava, da bi imao vrijednost, mora<br />

omogućiti široki raspon funkcija za upravljanje i analizu podataka. Prije toga moraju se obaviti postupci<br />

unosa, migracije i spremanja podataka u željeni GIS sustav. Kada razmišljamo o migraciji podataka,<br />

problem na koji nailazimo su: količina različitih datoteka/baza u kojima su pohranjene informacije,<br />

vrijednosti atributa nekog objekta najčešće su spremljene u različitim formatima, prostorne<br />

(geometrijske) podatke želimo spojiti sa atributnim (alfa-numeričkim) podacima, prije migracije<br />

podataka u jedinstvenu bazu, podaci trebaju zadovoljavati neke formalne kontrole. Alat koji želite imati<br />

kod rješavanja ovakvih problema je FME Desktop i FME Server. Ovaj referat opisuje mogućnosti ovih<br />

alata kod i izdavanja podataka izmeĎu Oracle/Oracle Spatial baze podataka i različitih standardnih i<br />

nestandardnih - ASCII, CAD, raster, data base i/ili GIS - formata s naglaskom na prostorne podatke.<br />

2 STANDARDNI I NESTANDARDNI FORMATI PROSTORNIH PODATAKA<br />

Raširena uporaba GIS-a krajem devedesetih godina prošlog stoljeća proizvela je značajne<br />

količine prostornih podataka. Većina programske podrške je u to vrijeme koristila vlastite formate<br />

podataka za pohranjivanje geometrije i vlastiti DBMS. Takav način definiranja vlastitih formata dovela<br />

je do toga da danas postoji više od 250 formata i to su formati od poznatih proizvoĎača softvera.<br />

Često se možemo susresti sa nestandardnim zapisima prostornih podataka (geometrija), gdje su<br />

aplikacije koristile vlastiti način spremanja podataka koordinata u tekstualne datoteke. TakoĎer, unutar<br />

baza podataka koje ne podržavaju prostornu komponentu ili ju starija verzija baze nije podržavala,<br />

koordinate su spremane u alfa-numeričkim atributima.<br />

Tipovi prostornih podataka se mogu podijeliti na:<br />

177<br />

1


- vektorske<br />

- rasterske<br />

Slika 1 Stvarni svijet kroz tipove prostornih podataka<br />

Tip rasterskih podataka sastoji se od redova i stupaca ćelija. Svaka ćelija može imati vrijednost, a<br />

razlučivost rasterskog skupa podataka ovisi o površini ćelije. Tip vektorskih podataka sastoji se od<br />

koordinata jedne točke, početne i krajnje točke neke dužine, koordinata uzduž neke krivulje itd.<br />

3 ORACLE SPATIAL BAZA PODATAKA<br />

Oracle Spatial (eng. spatial = prostorni) je integrirani set funkcija i procedura, koje omogućavaju<br />

spremanje, pristupanje, te brzo i učinkovito analiziranje prostornih podataka unutar Oracle baze<br />

podataka. Prostorni podaci predstavljaju lokacijske karakteristike pravih ili pojmovnih (konceptualnih)<br />

objekata, odnosno kako su ti objekti postavljeni u odnosu na stvarni ili konceptualni prostor u kojem su<br />

smješteni.<br />

Oracle Spatial, često označavan samo Spatial, podržava standardnu SQL shemu i funkcije koje<br />

omogućuju pohranjivanje, pozivanje, obnavljanje i pregledavanje skupa prostornih prikaza u bazi<br />

podataka. Sastoji se od sljedećih komponenata:<br />

• Sheme (MDSYS) koja propisuje spremanje, sintaksu i semantiku podržanih geometrijskih<br />

tipova podataka<br />

• Prostornog indeksnog mehanizma<br />

• Skupa operatora i funkcija za izvršavanje područja-zanimanja (area-of-interest) upitnika i<br />

upitnik prostornog spajanja (spatial join), te ostalih operacija za prostorne analize<br />

• Administrativne alate<br />

• Funkcije i procedure za pomoćne i podesive operacije<br />

• Topologija modela podataka za rad s podacima o čvorovima, rubovima i licima u topologiji<br />

(opisano u Oracle Spatial Topology i Network Data Models).<br />

• Mrežni model podataka za mogućnosti zastupanja ili predmete koji su modelirani kao čvorovi<br />

i veze u mreži (opisano u Oracle Spatial Topology i Network Data Models).<br />

• GeoRaster značajku koja omogućuje pohranu, indekse, upite, analize, i dostavu GeoRaster<br />

podataka, koji je točkasta slika i mrežasti podatak s pridruženim metapodacima (opisano u<br />

Oracle Spatial GeoRaster).<br />

Prostorno svojstvo (atribut prostornog prikaza) jest geometrijski opis njegovog oblika u nekom<br />

koordinatnom sustavu. Taj pojam se naziva geometrija.<br />

4 FME APLIKACIJE<br />

FME je vodeći ETL(Extract/Transform/Load) alat u svijetu, korišten od strane tisuće GIS<br />

profesionalaca širom svijeta za brzo dohvaćanje, ureĎivanje i unos podataka.<br />

178<br />

2


Slika 2 Prikaz dohvaćanja, uređivanja i unosa<br />

Služi za dobivanje prostornih podataka u točan format i strukturu. Ima podršku za čitanje i pisanje više<br />

od 250 prostornih i alfanumeričkih formata. UreĎuje podatke u točno željenu strukturu. Nudi više od<br />

400 transformera, koji pomažu kod djelovanja na geometriju i atribute prostornih podataka na<br />

njihovom putu od dohvaćanja prema zapisivanju u neki od podržanih formata. FME podržava oko<br />

5000 koordinatnih sustava čime je moguća pretvorba podataka na temelju projekcija, elipsoida i<br />

datuma.<br />

Može se definirati i vlastiti korisnički koordinatni sustav.<br />

4.1 FME Desktop<br />

Dolazi sa nizom alata koji proučavaju prostorne podatke i njihovu obradu čine jednostavnijom.<br />

FME Workbench – je grafičko okruženje unutar kojeg korisnik kreira prostor za rad (workspace) i u<br />

kojem dohvaća podatke u željenim formatima, djeluje na njih i šalje ih u željeni format.<br />

FME Universal Viewer – je jako koristan alat za brzi pregled prostornih podataka. Povezan je sa<br />

Workbench-om čime omogućuje prikaz podataka koji se obraĎuju unutar nekog Workspace-a.<br />

FME Universal Translator – kreiran je za brze transakcije i jednostavnu pretvorbu izmeĎu brojnih<br />

formata. TakoĎer je koristan za brzo pokretanje Workspace-a.<br />

4.2 FME Server<br />

Poslužuje ažurirane podatke točno gdje, kada i kako ih trebate. Dizajniran je da rukuje sa velikom<br />

količinom podataka i dopušta efikasno posluživanje podataka kroz široki raspon formata. Firme koriste<br />

FME Server za jednostavnije skupljanje, obradu i distribuciju prostornih i alfanumeričkih podataka.<br />

5 PROCESI<br />

5.1 Proces analize podataka<br />

FME Workbench nudi brojne transformere koji mogu poslužiti kod analize prostornih podataka.<br />

Kada se podaci dostave da bi što brže i jednostavnije napravili zadane kontrole, preinake i na kraju<br />

pretvorili ih u novi format ili unijeli u željenu bazu prostornih podataka, treba se napraviti kvalitetna<br />

analiza. Za analizu podataka transformer koji želimo koristiti je StatisticsCalculator.<br />

179<br />

3


Slika 3 Primjer FME Worksapace-a za analizu layera<br />

Na Slici 3 je primjer analize u kojoj nad zadanim direktorijem, FME prolazi kroz sve AutoCAD DWG<br />

datoteke, te za zadanu datoteku radi popis svih slojeva (layera) i broj zapisa u tom sloju.<br />

Slika 4 Parametri StatisticCalculator transformera<br />

Kod analize vrijednosti nekog atributa nam StatisticCalculator daje brojne mogućnosti. Parametri na<br />

slici 4, prikazuju da je analizom moguće dobiti desetak statističkih vrijednosti atributa, kao što su:<br />

minimalna vrijednost atributa, maksimalna vrijednost atributa, srednja vrijednost, suma vrijednosti itd.<br />

Kod nekih podataka koji ne dolaze sa specificiranim koordinatnim sustavom, potrebno je napraviti<br />

analizu koordinatnog sustava u kojem su koordinate podataka.<br />

Neke od analize koje se najčešće provode su:<br />

Slika 5 Testira koordinatni sustav<br />

180<br />

4


- provjera slojeva i blokova unutar AutoCAD-a<br />

- vrste geometrija (linija, točka, površina itd.) koje se nalaze unutar sloja, tablice, datoteke<br />

- razne analize vrijednosti atributa (tipovi, numeričke vrijednosti, itd.)<br />

5.2 Proces kontrole podataka<br />

Nakon analize podataka s kojima raspolažemo, potrebno je napraviti kontrole da bi bili zadovoljeni<br />

uvjeti za zapis podataka u bazu/datoteku. Podaci ponekad imaju vrijednosti atributa odvojene od<br />

geometrije objekta. Potrebno je spojiti te dvije vrijednosti. Način na koji se te vrijednosti spajaju mogu<br />

biti razni. Unutar AutoCAD podataka, atributi su obično stavljeni u blokove i preko točke unosa (insert<br />

point-a) se spajaju sa geometrijom. Tu se zna dogoditi da zbog ljudskog faktora, točka unosa nije<br />

dobro unesena na geometriju ili se nalazi na mjestu gdje se više geometrija preklapa.<br />

Slika 6 Kontrola veze geometrije sa atributima<br />

Slika 6 prikazuje kombinaciju dva transformera gdje prvi kontrolira preklapanje točke unosa bloka sa<br />

linijom objekta, na koji se nadovezuje transformer koji testira da li se točka preklapa sa jednom linijom,<br />

više linija ili sa niti jednom linijom.<br />

Kontrola koja je prikazana na slici 7 prikazuje način provjere da li je linija prekratka, te da li linija<br />

presijeca samu sebe.<br />

Slika 7 Kontrola duljine i presjecanja<br />

Neke od kontrola koje se najčešće provode:<br />

- ispravno povezane (SNAP-irane) geometrije<br />

- uneseni atributi i kontrola vrijednosti<br />

- ispravna vrsta geometrije za zadani objekt<br />

181<br />

5


5.3 Proces promjene formata<br />

Svaki format u koji se podaci spremaju ima svoju strukturu koje se treba pridržavati. Pretvorbe<br />

podataka iz postojećeg u novi format unutar FME aplikacije, kada sve vrijednosti i izgled objekta ostaje<br />

isti, su jednostavni i FME Workbench kod odabira ulaznih podataka (u nekom formatu) i izlaznih<br />

podataka (u željenom drugom formatu) kreira radnu plohu automatski.<br />

Slika 8 Prozor za automatsko generiranje radne plohe<br />

Slika 9 Automatski generirana radna ploha<br />

Kod odreĎenih formata, najčešće kod baza podataka koje dopuštaju da objekt ima više prostornih<br />

atributa, ili formati koji ne spremaju atribute uz geometriju, potrebno je generiranu radnu plohu<br />

dodatno doraditi.<br />

6 Rad sa Oracle Spatial<br />

Spajanje na Oracle bazu se razlikuje od korištenja formata koji spremaju podatke u<br />

datoteke/direktorije. Spajanje na Oracle zahtjeva instalaciju klijenta.<br />

182<br />

6


Spojiti se može preko tnsnames.ora ili direktnom konekcijom.<br />

6.1 Spajanje preko tnsnames.ora<br />

Slika 10 Odabir Oracle formata<br />

Kod odabira formata Oracle Spatial Object pritisne se na Parameters… gdje se upisuju traženi<br />

parametri kao na slici 11. Nakon toga se kod Table List pritiskom na […] trotočje dobije popis tablica<br />

sa kojima se želi rukovati.<br />

6.2 Spajanje direktnom konekcijom<br />

Slika 11 Parametri za spajanje<br />

Kod odabira formata Oracle Spatial Object pod Dataset se upiše niz parametara potrebnih za<br />

spajanje, kao što je upisano na slici 12.<br />

Slika 12 Parametri za direktnu konekciju<br />

Pritiskom na Parameters… se kod Table List pritiskom na […] trotočje dobije popis tablica sa kojima<br />

se želi rukovati.<br />

183<br />

7


6.3 Rukovanje unosom<br />

Spajanje na Oracle bazu za čitanje podatak iz nje ili za pisanje u nju je jednako i vrši se preko<br />

parametara kao što je navedeno iznad. Kada se podaci zapisuju u Oracle bazu odreĎeni zapis unutar<br />

tablice možemo unijeti (insert), promijeniti (update) i obrisati (delete). Da bi odredili način na koji ćemo<br />

rukovati sa zapisom unutar tablice postoji atribut fme_db_operation u koji zapisujemo jednu od<br />

naredbi: DELETE, INSERT ili UPDATE. Kada znamo kako odrediti način na koji ćemo rukovati sa<br />

zapisom, biramo kojim zapisima želimo dodati odreĎeno rukovanje. Za to se koristi atribut fme_where.<br />

Njegova struktura je: <br />

Slika 13 Primjer na koji se filtriraju zapisi<br />

Na slici 13 je prikazano korištenje filtra kod atributa koji odreĎuje rukovanje zapisima preko vrijednosti:<br />

I za INSERT, U za UPDATE i D za DELETE.<br />

6.4 Smisleno dohvaćanje podataka<br />

Kod dohvaćanja podataka iz Oracle baze važno je dohvatiti željene tablice i zapise, pri tome pazeći da<br />

broj dohvaćenih zapisa bude što manji. Što je manje zapisa, biti će brže čitanje, manje sistemskih<br />

resursa će se zauzeti i brže će se obaviti posao.<br />

6.5 Where upit (Where Clause)<br />

Većina čitanja iz baze će biti preko where upita. Tu se postavlja upit, da bi se dohvatili samo podaci<br />

koji zadovoljavaju taj upit i vratili u FME. Ovaj parametar zapošljava alat baze, pa je zbog toga<br />

efikasniji od čitanja cijele tablice i filtriranja preko Tester transformera.<br />

6.6 Granica dohvaćanja (Search Envelope)<br />

Slika 14 Where Clause<br />

Slično where upitu, granica dohvaćanja specificira prostorni upit, na način da se u FME vraćaju samo<br />

podaci koji su unutar zadane granice. Ovaj parametar takoĎer zapošljava alat baze, pa je zbog toga<br />

efikasniji od čitanja cijele tablice i rezanja podataka sa Clipper transformerom.<br />

184<br />

8


6.7 Broj dohvaćanja zapisa u vremenu<br />

Slika 15 Search Envelope<br />

Ovaj parametar definira koliko će zapisa dohvatiti u jedinici vremena iz baze. Ovim parametrom se<br />

može namjestiti performansa čitanja.<br />

Premali broj i FME će trošiti previše vremena na zahtjevima za čitanje.<br />

Preveliki broj i performanse baze mogu biti smanjene za ostale korisnike.<br />

6.8 Zapis višestrukih geometrija<br />

Većina baza ima mogućnost unosa više geometrija u zapis tablice, što podržava i FME. MeĎutim, da<br />

bi se tablica sa višestrukom geometrijom mogla unositi, takva tablica mora postojati, FME ju ne može<br />

kreirati.<br />

Postoje dva načina zapisa višestruke geometrije:<br />

- čitanje i pisanje višestruke geometrije<br />

- čitanje jednostruke geometrije i pretvaranje tih geometrija u višestruke<br />

Kod prvog načina zapisivanje se radi automatski. Dok kod drugog načina je potrebno grupirati<br />

geometrije za isti zapis prije upisivanja.<br />

6.9 Transformeri nad bazom<br />

Slika 16 Grupiranje u višestruke geometrije<br />

Postoje dva načina izvršavanja SQL koda nad bazom. SQL kod može biti unesen u parametar da se<br />

pokreče prije i poslije pokretanja posla. Drugi način je korištenje SQL transformera unutar posla.<br />

SQL kod se može koristiti za kreiranje, brisanje i mijenjanje tablica baze ili za bilo koju drugu namjenu<br />

za koju se koristi izvoĎenje SQL koda.<br />

6.10 Transakcije nad bazom<br />

Transakcije su način na koji se radna ploha može napraviti efikasnijom. Preko intervala transakcije<br />

specificiramo broj zapisa koji će biti zapisan u bazu u jednoj transakciji. Zapisi se šalju u priručnu<br />

memoriju dok ne dosegnu zadani broj i onda se pošalju u bazu. Povećavanjem broja možemo<br />

povećati performanse, budući da se koristi manje transakcija za zapis. MeĎutim postoji i maksimalna<br />

185<br />

9


veličina priručne memorije, koju se ne smije potpuno popuniti da ne bi došlo do usporavanja cijelog<br />

sistema.<br />

7 IZVOĐENJE<br />

7.1 Izvođenje unutar FME Workbencha<br />

Kada je radna ploha sa ulaznim i izlaznim podacima napravljena, spremni smo za njeno izvoĎenje<br />

unutar Workbencha potrebno je pritisnuti (File Run Transaction), tipku F5 ili ikonu .<br />

Slika 17 Tri ikone za pokretanje posla<br />

Osim ovog osnovnog pokretanja postoje još dva načina pokretanja posla. Jedan je pokretanje sa<br />

odabirom objavljenih parametara . Drugi je pokretanje uz kontrolu .<br />

7.2 Izvođenje unutar FME Quick Translator-a<br />

Ova aplikacija FME-a služi za brzo pokretanje radne plohe, kada nam nije potrebno da vidimo način<br />

na koji se čitaju i zapisuju podaci te koji se sve transformeri koriste.<br />

Slika 18 FME Quick Transformer<br />

186<br />

10


Kod pokretanja plohe na ovaj način potrebno je izabrati vrijednosti za objavljene parametre i izvoĎenje<br />

se pokreče. Ispiše se izvještaj o uspješnosti izvoĎenja.<br />

7.3 Izvođenje preko automatske skripte<br />

Kada želimo lakše i automatizirano pokrenuti FME posao, napravimo tekstualnu datoteku u koju<br />

prebacimo tekst naredbe i spremimo ju sa nastavkom .bat. Naredba se može zapisivati u više redova,<br />

ako na kraju reda stavimo znak ^. Primjer naredbe:<br />

fme.exe shape2mif.fmw^<br />

--SourceDataset_SHAPE E:\FME_HrOUG\Shape\pu_opcine.shp^<br />

--DestDataset_MIF E:\FME_HrOUG\Mapinfo<br />

pause<br />

Naredba pause ostavlja vidljiv prozor. Objavljenim parametrima u ovom slučaju:<br />

--DestDataset_MIF<br />

--SourceDataset_ACAD_6<br />

možemo unositi vrijednosti. Time dobijemo dinamičko izvoĎenje preko skripte koju možemo ručno<br />

pokretati ili pripremiti za automatsko pokretanje u željeno vrijeme (Scheduled Tasks).<br />

7.4 Izvođenje na FME Serveru<br />

FME Server je skalabilna ETL platforma koja pruža fleksibilnu distribuciju i unos podataka. Prednost<br />

ovakve platforme je da ju korisnici mogu koristiti bilo kada i bilo gdje, pri čemu ne trebaju imati<br />

instaliranu FME aplikaciju. Serveru se pristupa preko Intraneta/Interneta i dopušta pokretanje FME<br />

poslova koji se nalaze na serveru. Server dopušta skidanje podataka koji su izlaz iz pokrenutog posla<br />

ili se ti podaci mogu slati (Streaming) na neki od popularnih web aplikacija kao što su Google<br />

Earth/Maps, Microsoft Bing, OpenLayers i druge.<br />

187<br />

11


PROGRAMSKA PODRŠKA SUSTAVA ZA LOCIRANJE MUNJA U HRVATSKOJ<br />

Ime i prezime autora: Bojan Franc<br />

Tvrtka autora: Fakultet elektrotehnike i računarstva, Sveučilište u Zagrebu<br />

Adresa: Unska 3, 10000 Zagreb<br />

Kontakt telefon autora: +385 1 612 95 10<br />

E-mail autora: bojan.franc@fer.hr<br />

Web: www.fer.hr<br />

Ime i prezime autora: Miroslav Šturlan<br />

Tvrtka autora: Fakultet elektrotehnike i računarstva, Sveučilište u Zagrebu<br />

Adresa: Unska 3, 10000 Zagreb<br />

Kontakt telefon autora: +385 1 612 95 10<br />

E-mail autora: miroslav.sturlan@fer.hr<br />

Web: www.fer.hr<br />

Ime i prezime autora: Ivo Uglešić<br />

Tvrtka autora: Fakultet elektrotehnike i računarstva, Sveučilište u Zagrebu<br />

Adresa: Unska 3, 10000 Zagreb<br />

Kontakt telefon autora: +385 1 612 99 79<br />

E-mail autora: ivo.uglesic@fer.hr<br />

Web: www.fer.hr<br />

Ime i prezime autora: Ivan Goran Kuliš<br />

Tvrtka autora: Končar-KET<br />

Adresa: Fallerovo šetalište 22, 10000 Zagreb<br />

Kontakt telefon autora: +385 1 366 75 15<br />

E-mail autora: ivangoran.kulis@koncar-ket.hr<br />

Web: www.koncar-ket.hr<br />

SAŢETAK<br />

Praćenje grmljavine u realnom vremenu može biti učinkovito sredstvo u voĎenju prostorno<br />

distribuiranih sustava izloženih atmosferskim uvjetima. Danas takvi sustavi predstavljaju snažno oruĎe<br />

u projektiranju, zaštiti i voĎenju elektroenergetskih mreža, a njihova je primjena i u drugim sustavima i<br />

mrežama kao što su TK mreže, RTV odašiljači, naftovodi, plinovodi, sustavi osiguranja, meteorološki<br />

servisi, agencije za zaštitu od požara i dr. Podaci pristigli iz raznih izvora obraĎuju se i pohranjuju u<br />

Oracle 11g instanci baze podataka. GIS podaci promatranih objekata na tlu prostorno se koreliraju s<br />

podacima o udarima munja u realnom vremenu korištenjem Oracle Spatial funkcionalnosti te se<br />

prezentiraju pomoću Autodesk MapGuide webGIS rješenja.<br />

SUMMARY<br />

Real time lightning tracking can be an effective asset in management of spatially distributed<br />

systems which are exposed to atmospheric conditions. Such systems represent a powerful tool in<br />

design, protection and control of power systems. Their application also lies in numerous other<br />

systems, like telecommunication, radio and television networks, pipelines, insurance companies,<br />

meteorological services, fire fighting agencies, etc. Data acquired from multiple sources are processed<br />

and stored in an Oracle 11g database instance. GIS data of monitored structures on the ground are<br />

correlated with lightning data real-time using Oracle Spatial functionality. Correlations are displayed<br />

using Autodesk MapGuide webGIS solutions.<br />

188<br />

1


1. UVOD<br />

Praćenje i nadzor atmosferskih pražnjenja u realnom vremenu i prostoru može biti efikasno<br />

sredstvo i značajna pomoć u voĎenju EES-a. U svijetu se takvi sustavi rašireno koriste i neprekidno<br />

usavršavaju već više od dvadesetak godina. Velike razvijene zemlje su u potpunosti pokrivene s više<br />

različitih sustava za lociranje munja (SLM), a oni se koriste i u okolnim zemljama (Italija, Slovenija,<br />

MaĎarska i dr.). Danas se kao imperativ nameće uvoĎenje takvih sustava i njihova primjena u voĎenju<br />

elektroenergetskih sustava. Prije svega treba izbjeći da na karti Europe elektroenergetski sustavi koje<br />

vodimo ostanu u "sivoj zoni" u praćenju grmljavinske aktivnosti, ako se zna da se danas velika većina<br />

zemalja povezuje na ovom zadatku.<br />

2. SUSTAV ZA LOCIRANJE MUNJA - LINET<br />

Europski sustav za lociranje munja (Lightning location network - LINET) je razvijen u Njemačkoj,<br />

gdje je instalirano 30 senzora. 2006. sustav LINET je počeo s radom pokrivajući Njemačku i sve ostale<br />

susjedne zemlje. Izvještaji LINET sustava daju lokacije udara munja većih i manjih amplituda. Veće<br />

amplitude struja obično potječu od udara munja oblak–zemlja (OZ), dok su manje amplitude posljedica<br />

pražnjenja meĎu oblacima (oblak-oblak, OO).<br />

Krajem 2008. na području Hrvatske upogonjen je sustav za lociranje munja u sklopu LINET<br />

mreže. Na području Hrvatske instalirano je 6 senzora (Zagreb, Rijeka, Zadar, Split, Dubrovnik, Blato<br />

(otok Korčula)). Diljem Europe mreža senzora je proširivana, a naročito je povećana gustoća mreže<br />

na području Jugoistočne Europe. Početkom 2011. LINET mreža broji više od 125 senzora.<br />

Sustav koristi VLF/LF frekvencijski opseg i otkriva gustoću magnetskog toka pri atmosferskom<br />

pražnjenju pomoću dviju meĎusobno okomito postavljenih prstenastih antena. Preporučena udaljenost<br />

izmeĎu susjednih senzora iznosi 250 km ili manje. Slika 1 pokazuje raspored senzora u Hrvatskoj i<br />

susjednim državama.<br />

Slika 1 Mreža LINET senzora na području Hrvatske i okolice<br />

Svi senzori LINET sustava istoga su tipa što osigurava homogenost prikupljenih podataka te<br />

eliminira pojavu greške koja bi se pojavila uslijed korištenja različitih parametara, mjernih principa i<br />

metoda kada bi se koristili različiti tipovi senzora.<br />

LINET senzor jednostavne je izvedbe (PC računalo, GPS prijemnik, modul za obradu i<br />

digitalizaciju analognog signala, antena za mjerenje magnetske indukcije) te se može vrlo brzo i<br />

jednostavno instalirati na željenu lokaciju. Kako su senzori identični, olakšano je i održavanje.<br />

Kalibracija se može provoditi udaljeno iz LINET centra. Zbog velikog broja senzora te učinkovitog<br />

softverskog algoritma LINET sustav pruža točnost lociranja udara do 100 m i odličnu detekciju udara<br />

malih amplituda struja [4].<br />

189<br />

2


Visoko sofisticiranu mrežu za lociranje munja LINET, s mnogo novih karakteristika, je danas<br />

moguće iskoristiti kako za istraživanja, tako i za pogonske primjene. Prvi projekt s ovim sustavom je<br />

izvršen u Brazilu (Bauru), zatim u Australiji (Darwin) i Africi (Benin). U Brazilu je sustav usporeĎivan sa<br />

lokalnim sustavom (Rindat) dokazujući neke prednosti koje su opažene pri testiranju u Njemačkoj [1].<br />

Slika 2 Izgled LINET<br />

senzorske antene<br />

(ortogonalni prsteni) i GPS<br />

antene<br />

1.1. Princip detekcije udara munje<br />

ObraĎeni podaci<br />

Korisnici<br />

` `<br />

Login<br />

Nowcast<br />

(LINET) server<br />

Internetska veza<br />

sa središnjim<br />

sustavom LINET<br />

NeobraĎeni<br />

podaci<br />

Antene za<br />

mjerenje polja<br />

DAQ kartica za<br />

prikupljanje podataka<br />

i prilagoĎavanje<br />

signala (pojačavanje,<br />

filtriranje i AD<br />

pretvorba signala,<br />

obrada podataka)<br />

Program za obradu podataka/<br />

komunikaciju<br />

Računalo<br />

GPS antena<br />

GPS kartica za mjerenje<br />

vremena<br />

Senzorska<br />

stanica<br />

Slika 3 Shema toka podataka u sustavu za praćenje<br />

atmosferskih pražnjenja LINET<br />

Komponente magnetske indukcije detektiranog signala mjere se pomoću ortogonalne petlje<br />

(antene) u stvarnom vremenu. Mjerena veličina je inducirana struja, a ne napon te se kao rezultat<br />

dobije vremenska ovisnost magnetske indukcije u rasponu 0,1 – 130 nT [2]. Frekvencijski raspon<br />

antene je 1 kHz – 1 MHz. U propisanim vremenskim intervalima, podaci dobiveni od vanjskih senzora<br />

se prenose u glavnu upravljačku stanicu gdje se vrši kombinirana analiza svih signala.<br />

Sustav LINET koristi TOA (eng. Time-Of-Arrival) metodu za odreĎivanje lokacije atmosferskog<br />

pražnjenja potpomognutu metodom za odreĎivanje pravca (DF, eng. Direction Finding). Primarno se<br />

koristi TOA metoda za odreĎivanje lokacije, pri čemu su potrebne detekcije od najmanje četiri<br />

senzora. Kombiniranjem TOA i DF metode moguće je detektirati pražnjenja pomoću dva ili tri senzora,<br />

no u tom slučaju greška odreĎivanja lokacije je povećana [1]. Senzori sustava LINET detektiraju<br />

atmosferska pražnjenja s amplitudama manjim od 5 kA, pri čemu senzori ne bi smjeli biti meĎusobno<br />

udaljeni više od 250 km. [3].<br />

Slika 4 TOA (Time-Of-Arrival) metoda za odreĎivanje lokacije atmosferskih pražnjenja<br />

U proteklih 20-ak godina postavljeni su sustavi za lociranje u mnogim zemljama. Za<br />

nadgledanje velikih površina prednost imaju vrlo niska (VNF) i nisko-frekvencijska (NF) tehnologija.<br />

Ovu tehnologiju koristi i sustav LINET. Ta tehnologija tradicionalno je korištena za detekciju pražnjenja<br />

OZ s amplitudama struja iznad 5 kA, dok su se OO pražnjenja detektirala posebnim metodama.<br />

MeĎutim, sustav LINET koristi istu VNF/NF metodu za detekciju OZ i OO pražnjenja [4].<br />

190<br />

3


Posebno treba biti uzeto u obzir razlikovanje ova dva načina atmosferskih pražnjenja.<br />

Tradicionalno se za tu svrhu koristi impulsni valni oblik (valni oblik razlikovanja), iako je poznato da su<br />

takvim postupkom u nekim slučajevima zabilježene netočnosti.<br />

Slika 5 VNF/NF frekvencijski opseg za detekciju atmosferskih pražnjenja<br />

Iz toga je razloga za sustav LINET nedavno razraĎen trodimenzionalni (3D) geometrijski<br />

algoritam za VNF/NF metodu [5]. Taj se postupak oslanja na poznatu činjenicu da OZ udari emitiraju<br />

VNF/NF pražnjenje dominantno u ionizirajućem kanalu blizu razine zemlje, dok OO pražnjenja nastaju<br />

u ionizirajućem kanalu meĎu oblacima i visoko iznad razine zemlje. Odgovarajuće razlike u vremenu<br />

širenja elektromagnetskih valova (slika 2) uzrokovanih od visoko i nisko stacioniranih centara<br />

pražnjenja iskorištene su za lociranje mjesta pražnjenja. Ta metoda radi zadovoljavajuće, sve dok<br />

udaljenost izmeĎu mjesta udara munje i najbližeg senzora ne prelazi 100 km (odgovara udaljenosti<br />

meĎu senzorima oko 200 km); inače razlike u rezultatima ove metode postaju premale da bi bile<br />

primjetne.<br />

Slika 6 Princip detekcije OO pražnjenja: OO i OZ signali s iste 2D lokacije dolaze s vremenskom<br />

razlikom dT=TP−TH (P = centar VNF emisije; S = lokacija senzora; H = visina izvora emisije) [1]<br />

Posebni su napori učinjeni da bi se postigla visoka točnost lokacije mjesta udara u promatranom<br />

području. Danas je postignuta srednja točnost lokacije koja iznosi otprilike 100 m.<br />

1.2. Podaci LINET sustava<br />

Podaci koje prikupe LINET senzori šalju se u neobraĎenom obliku putem Internetskih veza u<br />

Nowcast (LINET) centar. U centru se vrši povezivanje i obrada podataka nakon čega su podaci u<br />

formatiranom obliku spremni za isporuku klijentima. Podaci preuzeti od LINET sustava arhiviraju se u<br />

bazu podataka. U sustavu su arhivirani podaci od 1. siječnja 2009..<br />

191<br />

4


Podaci o atmosferskim pražnjenjima (tablica 1) koji se raspoloživi klijentima su:<br />

1. datum i vrijeme pražnjenja (UTC, 100 ns rezolucija),<br />

2. zemljopisna širina i dužina (GPS koordinate),<br />

3. amplituda struje pražnjenja (rezolucija 0.1 kA),<br />

4. tip pražnjenja (OO, OZ),<br />

5. visina za pražnjenja tipa OO,<br />

6. 2D statistička greška u odreĎivanju lokacije pražnjenja (m) [6].<br />

Tablica 1 Podaci LINET sustava o atmosferskim pražnjenjima<br />

GPS VRIJEME TIP VISINA STRUJA GREŠKA<br />

15.8932 45.7170 29.4.2009 18:57:05.5952183 OZ - -15 kA 40 m<br />

15.8920 45.7036 29.4.2009 19:07:32.7712689 OZ - -5.2 kA 50 m<br />

15.8508 45.7407 29.4.2009 18:50:47.1437623 OZ - 72.2 kA 50 m<br />

15.8214 45.7566 29.4.2009 18:50:47.1127271 OO 3600 (m) -5.5 kA 50 m<br />

15.8647 45.7595 29.4.2009 19:07:01.6730042 OO 4100 (m) 4.7 kA 60 m<br />

15.8117 45.7558 29.4.2009 18:49:09.4577769 OO 5900 (m) -10.7 kA 80 m<br />

3. PRIMJENA U VOĐENJU ELEKTROENERGETSKOG SUSTAVA<br />

Primjene sustava za lociranje munja poznate su danas u različitim djelatnostima ili<br />

organizacijama kao što su osiguravajuća društva, sustavi za zaštitu od šumskih požara, sredstva<br />

civilne obrane, vojne instalacije, komercijalni avioprijevoznici, telekomunikacijske mreže, trgovci i<br />

distributeri eksploziva, petrokemijska industrija, mreže radijskih i televizijskih odašiljača.<br />

Elektroprivredne tvrtke uključile su se meĎu korisnike sustava za lociranje munja relativno kasno i to<br />

tek nakon što su sustavi dovoljno usavršeni. U početku su sustavi za lociranje munja imali brojne<br />

slabosti: nemogućnost razlučivanja udara munja u tlo od svih ostalih udara (izmeĎu oblaka); netočnost<br />

u detekciji svih udara; nemogućnost detekcije uzastopnih udara, i dr. Sve je to onemogućavalo<br />

upotrebu u svrhe projektiranja i voĎenja nadzemnih električnih mreža, no u posljednje su vrijeme<br />

navedene slabosti većim dijelom otklonjene. Danas, suvremeni sustavi za lociranje munja nalaze sve<br />

veću primjenu u elektroprivredi i to meĎu distributerima, ali i u sustavima voĎenja prijenosnih mreža.<br />

Primjene u elektroenergetskim mrežama i sustavima danas se susreću uglavnom na jednom ili više<br />

područja [7]:<br />

1. u korelaciji ispada i kvarova u mreži s pojavama munja,<br />

2. u uspostavljanju, voĎenju i nadzoru elektroenergetskog sustava,<br />

3. u davanju posadama upozorenja o nailasku munja,<br />

4. u izboru trasa nadzemnih vodova i načina njihove zaštite od munja.<br />

3.1. Korelacija ispada i kvarova u mreţi s pojavama munja<br />

Podaci sustava za lociranje munja mogu se korelirati s podacima o ispadima i kvarovima u mreži,<br />

što može doprinijeti kvaliteti praćenja pogona. Danas razvijene elektroprivrede obavezno prate<br />

podatke o kvarovima vezane za rad prekidača ili ponovnog uklopa primjenom različite opreme za<br />

registraciju. Takva oprema omogućuje on-line nadzor prekidača i praćenje tzv. alarmnog statusa<br />

transformatorskih stanica. Usporedba s podacima sustava za lociranje munja pokazuje da svi kvarovi i<br />

ispadi za vrijeme grmljavina nisu uzrokovani udarom munje. Najpovoljniji način odreĎivanja realnog<br />

broja prorada prekidača i ponovnih uklopa izazvanih udarima munja je dovoĎenje u korelaciju<br />

podataka u vremenu i prostoru sa sustavima za lociranje munja.<br />

3.2. Uspostavljanje, voĎenje i nadzor elektroenergetskog sustava<br />

Česta je primjena kod uspostavljanja i voĎenja elektroenergetskog sustava u vrijeme kada se<br />

dispečerski centri suočavaju s problemom identifikacije uzroka prorade prekidača. Važna informacija<br />

za donošenje dispečerske odluke je podatak da li je udar nastupio u trenutku isklopa i u neposrednoj<br />

blizini voda. S praćenjem munja u stvarnom vremenu moguće je iskusnom operateru utvrditi da li je<br />

isklop posljedica trajnog kvara ili prijelazne pojave uzrokovane udarom munje. Takav alat može biti<br />

vrlo korisna pomoć prilikom uspostavljanja novih pogona i mreže te minimiziranju potrebnog vremena i<br />

troškova.<br />

192<br />

5


3.3. Upozoravanje posada o nailasku munja<br />

Dispečerski i pogonski inženjeri mogu primjenom podataka sustava za lociranje munja brzo<br />

angažirati osoblje za održavanje u područjima kojima se približavaju jake grmljavinske fronte. Jednako<br />

je važna sposobnost sustava da pruži pouzdanu informaciju da je grmljavinska fronta potpuno<br />

napustila dano područje ili pogonsku zonu. Važan aspekt sigurnosti za pogonske posade za<br />

održavanje je u tome da se popravci na dugim vodovima izvode bez rizika ozljeda od udara munja.<br />

Veoma je poželjno točno poznavati pravac približavanja grmljavina kod voĎenja radova na vodovima<br />

ili kod većih ispitivanja u mreži.<br />

3.4. Izbor trasa nadzemnih vodova i načina njihove zaštite od udara munja<br />

Sustavi za lociranje munja daju mnogo kvalitetnije podatke u odnosu na dosadašnje prikaze<br />

gustoće udara u tlo. Nekadašnje izokerauničke karte pretvarane su različitim empirijskim faktorima u<br />

podatke o gustoći udara u tlo. Točnost takvog postupka je veoma ograničena i ovisna o svojstvima<br />

područja koje se promatra. Mnogo bolji podaci dobiveni su mrežama brojača munja kratkog dometa<br />

(npr. tip brojača CIGRE 10 kHz), ali se ni oni ne mogu usporediti po kvaliteti i mnoštvu parametara s<br />

onima što daju novi sustavi. U modernom projektiranju prijenosnih i distribucijskih vodova novi sustavi<br />

za lociranje munja postaju sve više nezaobilazno sredstvo. Poznavanje karata gustoće udara munja u<br />

tlo omogućava odreĎivanje prioriteta ugradnje odvodnika prenapona i drugih sredstava zaštite od<br />

prenapona. Pretpostavlja se da su vodovi u zonama najveće gustoće udara u tlo najviše izloženi<br />

pojavi povratnog preskoka. Sukladno tome imovina prijenosnih i drugih poduzeća najbolje se štiti<br />

koncentracijom odvodnika prenapona na spomenutim lokacijama.<br />

Izbor trase prijenosnih vodova je veoma kompleksan postupak ovisan o nizu faktora. Jedan od<br />

njih je rizik ispada budućeg voda uslijed grmljavinskih aktivnosti. Rizik se može računati za najmanje<br />

dvije ili više alternativnih trasa voda, a osnovni ulazni podaci o tome su gustoća udara munja u tlo, broj<br />

udara na godinu i mjesec ili dan, podaci o strujama pražnjenja, itd. Radi svega toga suvremeni sustavi<br />

za lociranje munja postaju sve više nezamjenjiv alat u projektiranju nadzemnih vodova.<br />

4. PROGRAMSKA PODRŠKA<br />

U planu je implementacija sustava za lociranje munja unutar sustava voĎenja elektroenergetskog<br />

sustava Operatora prijenosnog sustava Hrvatske elektroprivrede. Sustav omogućuje praćenje<br />

grmljavinske aktivnosti na području elektroenergetskog sustava Hrvatske te koreliranje s dogaĎajima<br />

(ispadima, kvarovima, APU-ima) na vodovima i postrojenjima u stvarnom vremenu. Korelacija u<br />

stvarnom vremenu ostvaruje se integracijom podataka o munjama, alarma i dogaĎaja SCADA sustava<br />

te geoprostornih podataka objekata elektroenergetskog sustava [7].<br />

Slika 7 Prijenosna mreža hrvatskog<br />

elektroenergetskog sustava<br />

193<br />

Slika 8 Shema prostorno-vremenske korelacije<br />

izmeĎu podataka o udarima munja,<br />

geoprostornim podacima objekata i dogaĎaja u<br />

elektroenergetskoj mreži<br />

6


4.1. Arhitektura sustava<br />

Programska podrška sustava za lociranje munja oblikovana je po principima uslužno orijentirane<br />

arhitekture (eng. Service Oriented Architecture – SOA). Sustav je realiziran kroz četveroslojnu<br />

arhitekturu (slika 9):<br />

1. sloj klijenata – web preglednici i SOAP klijenti koji razmjenjuju podatke sa sustavom za<br />

lociranje munja;<br />

2. prezentacijski sloj – web poslužitelj i SOAP komunikacijsko sučelje realizirano kroz Windows<br />

Communication Foundation (WCF) servis;<br />

3. aplikacijski sloj – WCF servisi i GIS poslužitelj;<br />

4. sloj baze podataka – operacijska baza podataka i skladište podataka.<br />

Slika 9 Arhitektura programske podrške sustava za lociranje munja<br />

Sustav je dizajniran modularno, tako da se pojedine pod-komponente (web poslužitelj, WCF<br />

servisi, GIS poslužitelj, baza podataka) mogu neovisno distribuirati unutar jednog ili više poslužitelja i<br />

udaljenih lokacija, pri čemu se meĎusobna komunikacija obavlja putem TCP/IP protokola. Na taj način<br />

sustav postaje dovoljno fleksibilan da udovolji zahtjevima različitih klijenata kao i eventualnim<br />

promjenama i/ili nadogradnjama jednom nakon što je sustav implementiran. Osim navedenog,<br />

modularnost omogućava brz razvoj i adaptaciju sustava za primjenu u drugim granama ekonomije,<br />

povezivanje na druge izvore podataka te dodavanje dodatne i/ili izmjenu postojeće logike potrebne za<br />

specifične primjene u raznim sektorima ekonomije (energetika, graditeljstvo, osiguravajuća društva,<br />

zaštita od požara i sl.).<br />

Sustav razvijan za potrebe korištenja u elektroenergetskoj mreži je povezan na tri vanjska izvora<br />

podataka s kojima komunicira u stvarnom vremenu razmjenjujući poruke putem SOAP/HTTP<br />

protokola:<br />

1. LINET centralni poslužitelj podataka o udarima munja (poslužuje nove podatke o udarima<br />

munja u intervalima od 10 sekundi);<br />

2. SCADA poslužitelj podataka o dogaĎajima u elektroenergetskoj mreži (prorada zaštitne<br />

opreme, zastoji, kvarovi i sl.);<br />

3. GIS poslužitelj podataka o elektroenergetskim objektima (slika elektroenergetske mreže –<br />

geometrije vodova, postrojenja i sl.).<br />

194<br />

7


4.2. Interaktivne mape i vizualizacija podataka<br />

Za vizualizaciju podataka koristi se AutoDesk web GIS rješenje MapGuide Enterprise. MapGuide<br />

posjeduje FDO tehnologiju za pristup podacima pomoću kojeg se povezuje na Oracle 11gR2 bazu<br />

podataka i barata prostornim podacima. Web sučelje bazirano je na Fusion tehnologiji. Fusion ne<br />

zahtijeva dodatke svojstvene nekom web pregledniku te stvara aplikacije koje rade na svim poznatijim<br />

preglednicima na Windows, Mac ili Linux platformama te pruža fleksibilan način interakcije s<br />

MapGuide poslužiteljem.<br />

4.3. Klijenti sustava<br />

Slika 10 Hijerarhija i veze MapGuide resursa<br />

Za povezivanje na sustav korisniku je potreban web preglednik. Sustav posjeduje web korisničko<br />

sučelje realizirano pomoću HTML/Javascript tehnologije koje podržavaju svi moderni web preglednici.<br />

Na taj način ostvarena je široka dostupnost uz minimalne zahtjeva na strani klijenta. Osim web<br />

korisničkog sučelja, sustav posjeduje SOAP komunikacijska sučelja namijenjena za komunikaciju s<br />

drugim (vanjskim) sustavima u svrhu automatskog obavještavanja i uzbunjivanja, prosljeĎivanja<br />

podataka o munjama sustavima za izradu izvještaja i trajnu pohranu u skladišta podataka.<br />

Slika 11 Korisničko web sučelje za prikaz aktivnosti u stvarnom vremenu (lijevo) i pretragu u povijesti<br />

(desno)<br />

4.4. Arhiviranje izmjerenih podataka<br />

Arhiviraju se podaci o munjama, podaci o dogaĎajima u elektroenergetskoj mreži koji su povezani s<br />

udarima munja te statistike nad podacima o munjama i korelacijama. TakoĎer, arhiviraju se dnevne<br />

195<br />

8


karte grmljavinske aktivnosti kreirane pomoću GIS poslužitelja za potrebe kreiranja izvještaja i bržeg<br />

pregleda grmljavinske aktivnosti u prošlosti.<br />

4.5. Baza podataka<br />

Sustav je realiziran oko Oracle 11gR2 Enterprise instance baze podataka. Iako je relacijska<br />

shema baze podataka potrebne za ispunjavanje funkcijskih zahtjeva relativno jednostavna, zbog<br />

prirode ulaza podataka, izvršavanja operacija i skladištenja analiziranih podataka, baza se može<br />

podijeliti u dva segmenta: operacijsku bazu podataka i skladište podataka.<br />

Prvi segment čini operacijska baza podataka u koju se upisuju podaci iz vanjskih izvora. GIS<br />

podaci objekata elektroenergetskog sustava su u pravilu statični te se rijetko mijenjaju (topologija se<br />

povlači i ažurira iz vanjskog GIS poslužitelja). Podaci o udarima munja se unose u periodima od 10<br />

sekundi, no jednom upisani, ti podaci se ne mijenjaju. Podaci o dogaĎajima u elektroenergetskoj mreži<br />

po prirodi su slični podacima o udarima munja te se ne mijenjaju nakon što se jednom upišu. Zbog<br />

gore navedenog, neposredno nakon upisa novih podataka, operacijska baza izvršava sve potrebne<br />

proračune, analize i korelacije te su podaci spremni za pohranu u skladište podataka.<br />

Drugi segment je organiziran po principima skladišta podataka. Iako nije punokrvno skladište<br />

podataka i jednostavnog je dizajna, najbolje ispunjava funkcijske zahtjeve za pohranom, analizom i<br />

pristupom podacima. Konačno skladištenje podataka implementirano je u vanjskom skladištu<br />

podataka, zajedničkome za sve podsustave unutar sustava voĎenja elektroenergetske mreže. No,<br />

kako vanjsko skladište ne garantira dostupnost i raspoloživost, sustav se za ispunjavanje<br />

funkcionalnosti ne oslanja na njega već zadržava minimalan skup podataka potrebnih za rad.<br />

5. ORACLE SPATIAL I PROSTORNE ANALIZE<br />

Iako sustav raspolaže GIS alatom (AutoDesk MapGuide Enterprise) koje sadržava sve potrebne<br />

alate i metode za provoĎenje potrebnih prostornih analiza nad podacima, zbog prirode unosa<br />

podataka i zahtjeva za što manjim kašnjenjem izmeĎu stvarnog dogaĎaja udara munje i predstavljanja<br />

informacije korisnicima, cjelokupna prostorna obrada izvršava se korištenjem metoda i alata Oracle<br />

Spatial opcije unutar instance baze podataka. AutoDesk MapGuide Enterprise webGIS rješenje koristi<br />

se za izradu interaktivnih karata te vizualizaciju podataka na webu.<br />

Prostorno se analiziraju podaci o udarima munja koji su predstavljeni 2D geometrijom točke<br />

(Lat/Lon koordinate, WGS84 koordinatni sustav) s GIS podacima objekata elektroenergetskog sustava<br />

koji su predstavljeni 2D geometrijama (točke, linije i poligoni). Elektroenergetski prijenosni sustav<br />

sadrži 123 trafostanice i 7416 km dalekovoda za koje se definiraju alarmne zone unutar kojih se<br />

promatraju udari munja u stvarnom vremenu te koreliraju s dogaĎajima u elektroenergetskoj mreži.<br />

Sustav za lociranje munja odreĎuje lokaciju udara munje metodom vremena pristizanja<br />

elektromagnetskog vala i triangulacijom iz nekoliko senzorskih lokacija. Senzorske stanice su<br />

meĎusobno vremenski sinkronizirane pomoću GPS sustava rezolucije 100 ns. Iz toga slijedi<br />

minimalna statistička greška odreĎivanja lokacije od 30 m (u idealnom slučaju). Za vrijeme većih<br />

grmljavinskih nevremena nad našim područjima sustav bilježi i do 1500 udara munja u minuti, a<br />

dosada zabilježeni dan s najviše grmljavine brojao je više od 500.000 udara. Ukupno kašnjenje od<br />

stvarnog dogaĎaja do prikaza na web sučelju je unutar 60 sekundi.<br />

5.1. Grid geografskog područja<br />

Geografsko područje za koje se promatra grmljavinska aktivnost podijeljeno je pravokutnim<br />

gridom rezolucije 0.1 stupanj zemljopisne dužine i širine. Svim elektroenergetskim objektima i udarima<br />

munja pridjeljuje se jedan ili više gridova u kojima se objekti nalaze (dimenzija skladišta podataka). Za<br />

potrebe detaljnijih analiza i korelacija, pojedina područja posjeduju dodatno definirane gridove veće<br />

rezolucije (0,01, 0,005 i 0,001 stupanj zemljopisne dužine i širine).<br />

196<br />

9


Slika 12 Detaljni grid (0,001 stupanj zemljopisne dužine i širine) oko dalekovoda<br />

5.2. Alarmne zone elektroenergetskih objekata<br />

Zbog ugraĎene statističke i sistemske greške u odreĎivanju lokacije udara munja, oko<br />

promatranih objekata na zemlji definira se alarmna zona proizvoljnog polumjera (npr. 500 m) za koju<br />

se promatraju udari munja. Za područja unutar alarmnih zona izvode se dodatne statističke i prostorne<br />

analize ovisno o potrebi i primjeni. Za potrebe voĎenja elektroenergetskog sustava analizira se<br />

amplitudna raspodjela struja munja te se odreĎuju dionice dalekovoda i postrojenja najizloženije<br />

udarima munja.<br />

Slika 13 Alarm zone elektroenergetskih objekata<br />

5.3. Prostorna korelacija udara munja s elektroenergetskim objektima<br />

U postupku korelacije udara munje s elektroenergetskim objektom provodi se nekoliko faza,<br />

odnosno, razina korelacije. Prvo se provodi prostorna korelacija munje s alarmnom zonom objekta,<br />

čime se skup kandidata za korelaciju najviše smanjuje. Nakon prostorne korelacije izvodi se<br />

vremenska korelacija izmeĎu prostorno koreliranih kandidata i dogaĎaja na objektu. Veličinu izlaznog<br />

skupa ovdje ponajviše odreĎuje širina vremenskog perioda sustava za registraciju dogaĎaja. MeĎutim,<br />

razvojem tehnologije i primjenom GPS sinkronizacije izmeĎu ureĎaja, podaci koje ti sustavi daju<br />

precizni su i do razine 1 ms. Ukoliko i nakon vremenske korelacije nema konačne odluke moguće je<br />

analizirati amplitudu struje munje u ovisnosti o električnim i mehaničkim karakteristikama<br />

elektroenergetskog objekta.<br />

U prostornoj korelaciji udara munje s objektom na zemlji, značajan je podatak o udaljenosti udara<br />

munje od promatranog objekta (sdo_geom.sdo_distance). Taj se podatak usporeĎuje s podatkom o<br />

greški lociranja udara munje te se odreĎuje vjerojatnost udara munje kao kandidata za uzrok dogaĎaja<br />

u elektroenergetskom sustavu.<br />

Za dalekovode dodatno je značajan podatak o udaljenosti udara munje od početka dalekovoda,<br />

tzv. stacionaži udara na dalekovodu. Kako dalekovodi mogu biti dugački i nekoliko stotina kilometara,<br />

točan podatak o kilometraži (ili broju stupa) može znatno smanjiti vrijeme potrebno za pronalazak i<br />

popravak kvara. Za tu svrhu, dalekovodu se definira LRS geometrija (sdo_lrs.convert_to_lrs_geom), a<br />

točka udara munje projicira se na liniju dalekovoda (sdo_lrs.project_pt). Uz pomoć projicirane točke na<br />

liniji, odreĎuje se stacionaža, odnosno udaljenost projekcije udara od početka dalekovoda<br />

(sdo_lrs.find_measure).<br />

197<br />

10


5.4. Karte gustoće udara i statistike<br />

Slika 14 Prostorna korelacija<br />

Važna funkcija sustava za lociranje munja je izrada karata gustoće udara munja te prostorna<br />

analiza podataka o munjama (amplitudna distribucija struja munja, distribucija greške lociranja i sl.).<br />

Slika 15 Distribucija amplitude struje i greške lociranja munja<br />

Prostorno se karte dijele na karte gustoće i karte prostornih analiza niske rezolucije (0,1 stupanj<br />

zemljopisne širine i visine), visoke rezolucije (0,01 stupanj) i karte alarmnih područja vrlo visoke<br />

rezolucije (0,001 stupanj). Obrada podataka vrši se jednom godišnje kada se obraĎuju i pohranjuju<br />

godišnji podaci te generiraju izvještaji. Uz navedeno, podaci se sumiraju za višegodišnje razdoblje.<br />

Obrada se može pokrenuti na zahtjev administratora sustava.<br />

Slika 16 Karta gustoće udara munja niske rezolucije za 2009. i 2010. [8]<br />

198<br />

11


6. ZAKLJUČAK<br />

Sustavi za lociranje udara munja neprestano se unapreĎuju i razvijaju te su danas snažno oruĎe<br />

u projektiranju, zaštiti i voĎenju elektroenergetskih mreža te brojnih drugih tehnoloških sustava<br />

izloženih atmosferskim uvjetima. Primjena sustava je i u drugim granama ekonomije kao što su zračni,<br />

željeznički i pomorski promet, meteorologija, osiguranja imovine, graĎevinarstvo, zaštita od požara i<br />

dr.<br />

U radu je dan kratak opis europskog sustava za lociranje munja LINET, koji je implementiran i<br />

pokriva teritorij Hrvatske. Prikazano je programsko rješenje koje omogućuje primjenu podataka<br />

sustava za lociranje munja u sustavu voĎenja hrvatskog elektroenergetskog sustava. Za izvršavanje<br />

korelacije s dogaĎajima na objektima na tlu, programska podrška prihvaća podatke iz drugih vanjskih<br />

izvora kao što su GIS sustav i sustav za nadzor elektroenergetske mreže (SCADA). Poslovna logika<br />

realizirana je kroz WCF usluge koje povezuju pojedine komponente sustava te vrše komunikaciju s<br />

vanjskim sustavima. Temelj programske podrške čini Oracle 11gR2 Enterprise instanca baze<br />

podataka. Valja istaknuti Oracle Spatial komponentu i ugraĎenu prostornu logiku pomoću koje se<br />

realizira prostorna obrada podataka u stvarnom vremenu, pri čemu je informacija o udaru munje<br />

dostupna širokom krugu korisnika unutar 60 sekundi.<br />

7. LITERATURA<br />

[1] Betz H. D., Schmidt K., Laroche P., Blanchet P., Oettinger W. P., Defer E., Dziewit Z., Konarski<br />

J.: “LINET – An international lightning detection network in Europe“, 2007.<br />

[2] Betz H. D., Kulzer R., Gerl A., Eisert B., Oettinger W.P., Jakubassa D.: „On the Correlation<br />

between VLF-Atmospherics and Meteorological data”, ICLP Firence, 1996.<br />

[3] Betz H. D., Schmidt K.,Fuchs B., Oettinger W.P., Hoeller H.: „Cloud Lightning: Detection and<br />

Utilization for Total Lightning Measured in the VLF/LF Regime“, Journal of Lightning Research,<br />

August 2007.<br />

[4] Betz H. D., Oettinger W.P., Schmidt P., Wirz M.: „Modern Lightning Detection and<br />

Implementation of a New Network in Germany, Europe”, European Geosciences Union 2005,<br />

Geophysical Research Abstracts, Vol. 7, 00685,2005.<br />

[5] Betz H. D., Schmidt K., Laroche P., Blanchet P., Oettinger W.P., Defer E.: „LINET – A new<br />

lightning detection network in Europe”, 13th International Conference on Atmospheric<br />

Electricity, August 13-18, 2007., Beijing, China.<br />

[6] Uglešić, Ivo; Milardić, Viktor; Franc, Bojan; Filipović-Grčić, Božidar; Milešević, Boško:<br />

„Uspostava sustava za lociranje udara munja u Hrvatskoj”, 9. savjetovanje HRO CIGRÉ, Cavtat,<br />

Hrvatska, 8.-12.11.2009.<br />

[7] Uglešić, Ivo; Milardić, Viktor; Mandić, Milivoj; Filipović-Grčić, Božidar: „Praćenje atmosferskih<br />

pražnjenja za potrebe voĎenja EES-a“, Studija, Zagreb, Hrvatska, rujan 2007.<br />

[8] Uglešić, Ivo; Milardić, Viktor; Franc, Bojan; Filipović-Grčić, Božidar; Horvat, Jasna: „Prva<br />

iskustva sa sustavom za lociranje munja u Hrvatskoj“, 9. simpozij o sustavu voĎenja EES-a,<br />

Zadar, Hrvatska, studeni 2010.<br />

199<br />

12


17. KONFERENCIJA<br />

HRVATSKE UDRUGE ORACLE KORISNIKA<br />

16.-20. LISTOPADA 2012.<br />

Hotel Istra Crveni otok Rovinj

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

Saved successfully!

Ooh no, something went wrong!