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