Web orijentirana rješenja u turizmu
|
|
- Jasmina Vogelnik
- пре 5 година
- Прикази:
Транскрипт
1 JAVA PARALELIZACIJA Zlatko Sirotić, univ.spec.inf. d.o.o. Pula Stranica 1
2 = Istra informatički inženjering (staro ime) Poduzeće osnovano prije 25 godina Stranica 2
3 Autor je (bar neko vrijeme) radio i sa ovim jezicima / alatima: - "Assembler" za Texas Instruments TI-58 kalkulator (1981.) - Fortran, BASIC (1982.) - Pascal, Assembler za Zilog Z80 (ZX Spectrum) (1983.) - Cobol, dbase III, Prolog (1984.) - ADS (Application Development System ( ) - Oracle Database, Designer, Forms, Reports ( ) - Eiffel, C, C++ ( ) - Java ( ) - Scala ( ) - Oracle ADF ( ) Stranica 3
4 Neki autorovi radovi zadnjih godina - HrOUG 2014: Nasljeđivanje je dobro, naročito višestruko - Eiffel, C++, Scala, Java 8 - CASE 2014: Trebaju li nam distribuirane baze u vrijeme oblaka? - JavaCro 2014: Da li postoji samo jedna "ispravna" arhitektura web poslovnih aplikacija - HrOUG 2013: Transakcije i Oracle - baza, Forms, ADF - CASE 2013: Što poslije Pascala? Pa Scala! - HrOUG 2012: Ima neka loša veza (priča o in-doubt distribuiranim transakcijama) - CASE 2012b: Konkurentno programiranje u Javi i Eiffelu - CASE 2012a: Utjecaj razvoja μp na programiranje Stranica 4
5 Uvod Gotovo sva današnja računala imaju više CPU-a, u obliku višejezgrenih procesora, ili imaju više procesora. Takva računala mogu paralelno izvršavati dva (ili više) nezavisna programa ili dijelove istog programa. U drugom slučaju, ako su dijelovi programa nezavisni, programeri mogu pisati kod kao da nema paralelnosti. No, najčešće su dijelovi programa međusobno zavisni, jer čitaju / pišu u isto memorijsko područje, pa je moguće da rezultat izračuna ovisi o redoslijedu izvršenja programskih instrukcija iz različitih dijelova programa. Zbog toga je potrebna sinkronizacija dijelova programa. Sinkronizacija traži posebne programske tehnike, koje se obično zovu imenom konkurentno programiranje. Stranica 5
6 Teme Konkurentno programiranje i operacijski sustavi Utjecaj razvoja mikroprocesora na konkurentno programiranje Sinkronizacijski algoritmi i mehanizmi Konkurentno programiranje u Javi verzije 1 4 Konkurentno programiranje u Javi verzije 5 7 Java 8 - najvažnije nove mogućnosti: Streams, lambda, default metode Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka, na jednom jednostavnom primjeru Stranica 6
7 Konkurentno programiranje i operacijski sustavi Prvi operacijski sustavi, napravljeni 50-tih godina prošlog stoljeća, bili su sekvencijalni, tj. računalni programi izvršavali su se na njima jedan iza drugoga. Vrlo brzo se uvidjelo da je to vrlo neracionalan način korištenja računala, pa su 60-tih godina napravljeni brojni operacijski sustavi koji su omogućavali konkurentno korištenje računalnih resursa. Tadašnja velika računala, kao i donedavno uobičajena osobna računala, imala su samo jedan CPU. Zbog toga se programi na njima nisu zaista izvršavali paralelno, već kvaziparalelno. Uobičajeno se takav kvazi-paralelan način rada naziva višezadaćnost (multitasking). Stranica 7
8 Konkurentno programiranje i operacijski sustavi Vrlo brzo su se pojavila velika računala sa dva ili više CPUa, a danas je uobičajeno da i najjeftinija prijenosna računala imaju dva CPU-a (u obliku dvije jezgre smještene u isti mikroprocesor). Ovakva računala omogućavaju da se dva (ili više) procesa zaista izvršavaju paralelno, što se uobičajeno naziva multiprocesiranje (multiprocessing). I multiprocesiranje i višezadaćnost su primjeri konkurentnog izvršavanja. Postoji i distribuirano izvršavanje. Kod njega se, za razliku od konkurentnog izvršavanja, procesiranje zbiva na dva ili više računala koja su spojena mrežom. Stranica 8
9 Konkurentno programiranje i operacijski sustavi Proces operacijskog sustava ima sljedeće elemente: Stranica 9
10 Konkurentno programiranje i operacijski sustavi OS koristi poseban program - raspoređivač (scheduler), koji određuje kojem procesu treba dodijeliti (neki) procesor. Tranzicija stanja procesa operacijskog sustava: Stranica 10
11 Konkurentno programiranje i operacijski sustavi Zamjena (swapping) procesa koji se izvršavaju na CPU-u naziva se zamjena konteksta (context switch). Proces P1 treba biti zamijenjen procesom P2. Program raspoređivač postavlja stanje procesa P1 na spreman i snima njegov kontekst u memoriju, kako bi ga poslije mogao "probuditi" i omogućiti da nastavi sa istog mjesta: Stranica 11
12 Konkurentno programiranje i operacijski sustavi Dobro je da se paralelno mogu izvršavati i dijelovi istog programa dretve ili niti (threads). Procesi koji su sastavljeni od više dretvi zovu se višedretveni (multithreaded). Dretve jednog procesa dijele adresni prostor tog procesa, tj. jedna dretva vidi podatke druge dretve. Zamjena konteksta dretvi u pravilu se izvodi nekoliko puta brže od zamjene konteksta procesa. Zbog toga svi današnji moderni OS nisu samo višeprocesni, nego i višedretveni. Dretve se mogu dodjeljivati procesorima isto kao i procesi. Npr. u računalnom sustavu sa četiri CPU-a, sustav može u određenom trenutku paralelno izvršavati četiri različita procesa, ali može izvršavati i četiri dretve istog procesa. Stranica 12
13 Konkurentno programiranje i operacijski sustavi Dretve dijele globalnu memoriju (programski kod i globalne podatke) i gomilu, ali imaju vlastiti stog i kontekst dretve: Stranica 13
14 Utjecaj razvoja mikroprocesora na konkurentno programiranje Materijal "Not Your Father's Von Neumann Machine: A Crash Course in Modern Hardware kaže da je Von Neumannov model računala u današnje vrijeme samo korisna apstrakcija, koja odudara od stvarnih današnjih računala: Stranica 14
15 Utjecaj razvoja mikroprocesora na konkurentno programiranje Mooreov zakon: Broj tranzistora na mikroprocesoru udvostručuje se otprilike svake dvije godine. Mooreov zakon i dalje vrijedi. No, radni takt procesora prestao je rasti oko Razlog za to je veliko povećanje potrošnje struje na velikim brzinama. Stranica 15
16 Utjecaj razvoja mikroprocesora na konkurentno programiranje Slika pokazuje kako se eksponencijalno povećava jaz između performansi CPU-a i glavne memorije (DRAM): Moguće je napraviti RAM (SRAM) koji bi bio brz skoro kao registri procesora, ali bi bio puno skuplji. A, bolje je imati više sporije glavne memorije nego manje brže glavne memorije, jer je magnetski disk puno sporiji. Stranica 16
17 Utjecaj razvoja mikroprocesora na konkurentno programiranje Još je bolje napraviti hijerarhiju memorija, tj. koristiti bržu i manju SRAM priručnu memoriju (ili više razina te memorije) zajedno sa većom i sporijom DRAM glavnom memorijom. Dva primjera korištenja priručne memorije (oba prikazuju jednojezgreni procesor): Stranica 17
18 Utjecaj razvoja mikroprocesora na konkurentno programiranje Jedan od načina za povećanje performansi procesora je paralelizam na razini instrukcija, ILP (Instruction-Level Parallelism). Kasnije su se dosjetili: umjesto da paralelno obrađuju instrukcije istog programa, mogli bi paralelno obrađivati instrukcije različitih programa ili dretvi - multithreading (Intel koristi ime Hyper-Threading Technology, HTT): Stranica 18
19 Utjecaj razvoja mikroprocesora na konkurentno programiranje Kod multithreadinga su duplirani samo neki elementi CPU-a, npr. procesorski registri. Zbog toga su performanse do oko 1,3 puta veće. Povećanje broja tranzistora počelo se koristiti za smještanje više CPU-a (jezgri) u jedan procesorski čip. Primjer sustava sa dva dvojezgrena procesora (svaka jezgra podržava dvije dretve): Stranica 19
20 Utjecaj razvoja mikroprocesora na konkurentno programiranje Osim arhitekture centralne djeljive memorije (prethodna slika), postoji i arhitektura distribuirane DM. Neki kažu da je i to SMP (Symmetric Multi-Processors), ali najčešće se naziva NUMA (Non-Uniform Memory Access). Procesori nisu međusobno povezani (samo) preko memorijske sabirnice, nego su direktno ili indirektno povezani sa drugim procesorima (tzv. Hyper Link): Stranica 20
21 Utjecaj razvoja mikroprocesora na konkurentno programiranje Povećanje radnog takta u pravilu je davalo skoro linearno povećanje performansi. Nažalost, kod višejezgrenih / višeprocesorskih sustava rast performansi rijetko raste proporcionalno sa povećanjem broja jezgri, već je rast općenito manji: Stranica 21
22 Utjecaj razvoja mikroprocesora na konkurentno programiranje Razlog za to objašnjava Amdahlov zakon. Ako je u nekom programu proporcija dijelova programa koji se mogu paralelno izvršavati jednaka p, onda se povećanjem broja CPU-a može dobiti ovo povećanje: Npr. ako imamo 10 procesora i p = 90% programa, onda je maksimalno povećanje brzine 5,26 puta. Stranica 22
23 Sinkronizacijski algoritmi i mehanizmi Lokoti, tj. blokirajuća sinkronizacija Neblokirajući sinkronizacijski mehanizmi, bez lokota (lock-free) Softverska, hardverska i hibridna transakcijska memorija (STM, HTM, hibridna TM) Pritom se koriste sljedeće vrste lokota: test-and-set (TAS) lokoti test-and-test-and-set (TATAS) lokoti lokoti temeljeni na redovima (queue-based locks) hijerarhijski lokoti lokoti tipa čitatelj-pisac (reader-writer locks) Stranica 23
24 Sinkronizacijski algoritmi i mehanizmi Pretpostavimo da smo napisali sljedeći programski kod za računanje sekvence cijelih public class UnsafeSequence { private int value; /** Returns a unique value. */ public int getnext() { return value++; } } Stranica 24
25 Sinkronizacijski algoritmi i mehanizmi Prethodni kod nije dobar u konkurentnom radu. Npr., ako dvije dretve A i B izvode metodu getnext(), moguć je sljedeći tok izvođenja, koji će dati pogrešan rezultat obje dretve dobile su isti broj 10: Problem je u tome što naredba value++ kod izvođenja nije atomarna, već se razlaže na (uobičajeno) tri interne naredbe: temp = value; temp = temp + 1; value = temp. Stranica 25
26 Sinkronizacijski algoritmi i mehanizmi Prethodni program nije korektan, jer njegova točnost ovisi o međusobnom redoslijedu izvođenja naredbi dva (ili više) programa. Taj se problem uobičajeno race conditions. Da bismo riješili taj problem, dretve moramo sinkronizirati. Sinkronizacija se zasniva na ideji da dretve komuniciraju jedna sa drugom kako bi se "dogovorile" o sekvenci akcija. Dretve mogu komunicirati na dva načina: - korištenjem djeljive memorije (shared memory): dretve komuniciraju čitajući i pišući u zajednički dio memorije; ova tehnika je dominanta i bit će korištena u nastavku; - slanjem poruka (message-passing): dretve međusobno komuniciraju porukama. Stranica 26
27 Sinkronizacijski algoritmi i mehanizmi Nažalost, potreba za ekskluzivnim držanjem resursa može dovesti do različitih problema. Najveći problem je deadlock, kada dvije dretve (ili više njih) ostaju blokirane zato što obje trebaju (i) resurs koji je ekskluzivno zauzela druga dretva. Osim deadlocka, problem je i livelock, kada dretva naizgled radi, ali se ne dešava ništa korisno. Problem je i kada se resursi ne dodjeljuju dretvama na pravedan (fer) način, a najgora varijanta je kada neka dretva konstantno ostaje bez resursa - to je tzv. gladovanje (starvation). Međusobno isključivanje (mutual exclusion) je oblik sinkronizacije koji onemogućava istovremeno korištenje djeljivog resursa. S tim je povezan pojam kritične sekcije (critical section): dio programa koji pristupa djeljivom resursu. Stranica 27
28 Sinkronizacijski algoritmi i mehanizmi Sinkronizacijski mehanizmi temeljeni na ideji protokola ulaz / izlaz (iz kritične sekcije) nazivaju se lokoti (locks). Lokoti se mogu realizirati na različite načine. Dobro su poznata dva algoritma za implementaciju lokota: Petersonov algoritam za dvije dretve, te Lamportov Bakery (= pekara) algoritam za n dretvi. Petersonov algoritam je deadlock-free i starvation-free. Lamportov algoritam je deadlock-free, ali i prvi-došao-prviobrađen, što je jače nego starvation-free. No, oba algoritma temeljena na radnom čekanju (busy waiting), što se često naziva i obrtanje (spinning). Stranica 28
29 Sinkronizacijski algoritmi i mehanizmi Spinning je naročito neefikasan kod multitaskinga, pa ima smisla samo tamo gdje je vrijeme čekanja tipično vrlo kratko, pa bi zamjena konteksta bila skuplja od njega. Spin locks se često koriste kod jezgre (kernela) OS-a. Spinning može biti prihvatljiv i kod višeprocesorskih sustava, kada se radno čitanje odvija samo iz priručne memorije CPUa i ne utječe na ostale CPU-e. To je tzv. local spinning. No, Lamportov algoritam nije praktičan i stoga što ima potrebu čitanja i pisanja u n različitih lokacija za n dretvi, a bolji algoritam ne postoji. To pokazuje da je potrebno uvesti sinkronizacijske mehanizme koji su jači od čitaj-piši (read-write), i koristiti ih za izradu algoritama za međusobno isključivanje dretvi. Stranica 29
30 Sinkronizacijski algoritmi i mehanizmi Lokote bi trebalo implementirati sa sljedećim atomarnim osnovnim operacijama (atomic primitives) za sinkronizaciju, koje su kompleksnije od operacija atomarnog čitanja-pisanja. One su realizirane na razini procesora (ovo je pseudokod): test-and-set (x, value) --stara operacija do temp := x; x := value; result := temp end compare-and-swap (x, old, new) --nova operacija do end if x = old then x := new; result := true else result := false end Stranica 30
31 Sinkronizacijski algoritmi i mehanizmi Operacija test-and-set (TAS) bila je osnovna operacija za sinkronizaciju u mikroprocesorima 1990-tih godina. Praktički svaki mikroprocesor dizajniran poslije godine podržava jaču operaciju compare-and-swap (CAS), ili njoj ekivalentnu. No, CAS i CASD (Compare-and-Swap-Double) nisu novost bile su dio IBM 370 arhitekture od 1970! Zanimljiv je pojam broj konsenzusa (consensus number), a to je maksimalni broj procesa za koje određena primitivna operacija (konsenzus objekt) može implementirati problem konsenzusa. Atomarni registri imaju broj konsenzusa 1, TAS ima ima broj konsenzusa 2, a CAS ima beskonačni broj konsenzusa. CAS je osnova (današnjeg) konkurentnog programiranja. Stranica 31
32 Sinkronizacijski algoritmi i mehanizmi Zaključavanje, bez obzira na varijantu, ima i mana. Npr., kada više dretvi istovremeno traže isti lokot, JVM najčešće treba "pomoć" OS-a, pri čemu dretve najčešće bivaju suspendirane. Ako je dretva koja drži lokot odgođena na duže vrijeme, nijedna dretva koja treba taj lokot ne može napredovati. Najgore je: "Nitko stvarno ne zna kako organizirati i održavati veliki sustav temeljen na zaključavanju". Srećom, CAS operacija za sinkronizaciju je po svojoj osnovi optimistička, tj. nije blokirajuća (za razliku od lokota koji su, iako se danas grade na temelju CAS operacije, pesimistički, tj. blokirajući). Zato se pomoću nje mogu graditi neblokirajući (nonblocking) algoritmi bez lokota. Stranica 32
33 Sinkronizacijski algoritmi i mehanizmi Trošak korištenja CAS operacije kod današnjih procesora varira, od oko 10 do oko 150 procesorskih ciklusa, pri čemu se stalno radi na ubrzavanju. Korištenje CAS-a je jako doprinijelo implementaciji neblokirajućih konkurentnih algoritama i struktura podataka. Npr. U Javi 5, a naročito 6, implementirani su (pomoću CAS) algoritmi i strukture podataka koji se u konkurentnom radu ponašaju dramatično brže od Java 4 i prethodnih verzija. No, algoritme koji koriste CAS vrlo je teško smisliti i često su vrlo neintuitivni. Osnovna teškoća sa svim današnjim sinkronizacijskim operacijama (pa i CAS) je da one rade na samo jednoj riječi memorije, što tjera na korištenje kompleksnih i neprirodnih algoritama. Stranica 33
34 Sinkronizacijski algoritmi i mehanizmi Zato je izmišljena transakcijska memorija (TM), a njena realizacija može biti softverska (STM), hardverska (HTM) ili hibridna. Transakcija je sekvenca koraka koje izvršava jedna dretva. Transakcije moraju biti serijabilne (serializable), što znači da mora izgledati kao da se izvršavaju sekvencijalno i onda kada se izvršavaju paralelno. Serijabilnost je na jača varijanta linearizabilnosti (linearizability). Linearizabilnost definira atomarnost individualnog objekta. Serijabilnost definira atomarnost cijele transakcije. Ispravno implementirane, transakcije nemaju problem deadlocka ili livelocka. Stranica 34
35 Sinkronizacijski algoritmi i mehanizmi Često se kaže da se transakcijska memorija ponaša slično kao transakcije u bazi podataka. No, za razliku od transakcija u bazi podataka, kod kojih se radi zaključavanje redaka tablica, kod transakcijske memorije nema zaključavanja, tako da se nikad ne može desiti deadlock. Transakcijska memorija se ponaša optimistički, tj. polazi od toga da problema u ažuriranju neće biti. Ako se na kraju ipak pokaže da ima problema, transakcija radi rollback. Napomenimo da deadlock u bazi podataka nije problem, jer DBMS detektira deadlock i poništava jednu od sesija koja se nalazi u deadlock konfliktu. Stranica 35
36 Sinkronizacijski algoritmi i mehanizmi STM na razini jezika podržava npr. jezik Clojure, a na razini biblioteke jezik Scala. Poboljšanja kod današnjih realizacija STM-a: Stranica 36
37 Sinkronizacijski algoritmi i mehanizmi Danas barem tri mikroprocesora podržavaju HTM: Vega firme Azul Systems (već 10 godina) BlueGene/Q firme IBM (4 godine) Intel Haswell (2 godine). HTM koristi tzv. MESI protokol: - Modified: linija cache-a je modificirana; - Exclusive: linija nije modificirana, i nijedan drugi procesor ju nema; - Shared: linija nije modificirana, ali drugi procesori ju mogu imati; - Invalid: linija ne sadrži suvisle podatke. Stranica 37
38 Sinkronizacijski algoritmi i mehanizmi Procesor IBM BlueGene/Q ima hardversku transakcijsku memoriju Ima 18 jezgri - jedna je namijenjena za OS, - jedna je rezerva Superračunalo Sequoia ima procesora, tj jezgri! Stranica 38
39 Sinkronizacijski algoritmi i mehanizmi IBM BlueGene/Q mikroprocesor je ipak prvenstveno namijenjen za izradu superračunala, pa je za "obično" programiranje značajniji Intel mikroprocesor Haswell arhitekture koji isto podržava HTM (ne u svim verzijama). Time se HTM uvodi u masovniju primjenu i vjerojatno će značajno olakšati pisanje nekih konkurentnih programa. Za razliku od mikroprocesora IBM BlueGene/Q, Intelovi mikroprocesori podržavaju transakcijsku memoriju i između mikroprocesorskih čipova, a ne samo između jezgri jednog čipa. Intelovi Haswell mikroprocesori zanimljivi su i po tome što imaju dva načina podržavanja transakcijske memorije. Stranica 39
40 Sinkronizacijski algoritmi i mehanizmi Hardware Lock Elision način omogućava da se programi koji koriste zaključavanje vrlo lako prerade tako da koriste HTM. Suština je u tome da procesor "laže" dretve da su dobile lokot, a da stvarno nikakvog zaključavanja nema. Takvi programi rade i na "starim" procesorima bez HTM-a, ali sa zaključavanjem. Novonapisani programi mogu koristiti napredniji način Restricted Transactional Memory, tj. Mogu koristiti eksplicitne naredbe XBEGIN, XEND ili XABORT za pokretanje transakcije, normalno završavanje ili abortiranje. Kod pokretanja nove transakcije (sa XBEGIN) dretva može navesti i "fallback" rutinu koja se automatski izvršava ako transakcija ne uspije. Stranica 40
41 HTM poezija Međ programerskim pukom zavladala silna euforija - uskoro stiže nam trkom hardverska transakcijska memorija. Stranica 41
42 Konkurentno programiranje u Javi verzije 1 4 Svaka Java aplikacija koristi dretve. Kada se starta JVM, on kreira posebne dretve, npr. za GC (garbage collection), uz main dretvu. Kada koristimo Java AWT ili Swing framework, oni kreiraju posebnu dretvu za upravljanje GUI-em. Kada koristimo servlete ili RMI, oni kreiraju pričuvu (pool) dretvi. Zato, kada koristimo te frameworke, moramo biti upoznati sa konkurentnošću u Javi. Svaki takav framework uvodi u našu aplikaciju konkurentnost na implicitan način, te moramo znati napraviti da mješavina našeg koda i frameworkovog koda bude sigurna u višedretvenom radu. Stranica 42
43 Konkurentno programiranje u Javi verzije 1 4 Kada želimo napraviti svoju dretvu, imamo u Javi dva načina; jedan način je da napravimo klasu koja nasljeđuje klasu Thread i da nadjačamo (override) metodu run(), kao što prikazuje sljedeći primjer: class Worker1 extends Thread { } public void run() { // impl.dotask1() here} class Worker2 extends Thread { } public void run() {// impl.dotask2() here} Stranica 43
44 Konkurentno programiranje u Javi verzije 1 4 U nastavku se prikazuje implementacija metode compute() iz neke treće klase, koja kreira dvije dretve, tako da dva posla (tasks) mogu biti izvedena paralelno (ako postoje dva slobodna CPU-a koja ih izvode): void compute() { Worker1 worker1 = new Thread(); Worker2 worker2 = new Thread(); worker1.start(); worker2.start(); } Stranica 44
45 Konkurentno programiranje u Javi verzije 1 4 Pretpostavimo da želimo dobiti rezultat obje dretve: return worker1.getresult()+worker2.getresult(); Očito, moramo čekati da obje dretve završe prije nego dobijemo taj rezultat. To se postiže sa join(): int compute() { } worker1.start(); worker2.start(); worker1.join(); worker2.join(); return worker1.getresult() + worker2.getresult(); Stranica 45
46 Konkurentno programiranje u Javi verzije 1 4 Postoji i drugi način za kreiranje dretvi u Javi. Prethodno prikazani način (kreiranje klase koja nasljeđuje klasu Thread), iako izgleda logičan, manje se koristi jer je manje fleksibilan. Problem je u tome što u Javi (za sada) postoji samo jednostruko nasljeđivanje ponašanja, tj. klasa (a ne samo sučelja). "Višestruko nasljeđivanje klasa je korisno, koliko god mi šutjeli o tome :)" (odnosno - koliko god nas pokušavali uvjeriti u suprotno). Bez višestrukog nasljeđivanja klasa, ako naša klasa "potroši" jednostruko nasljeđivanje za klasu Thread, ne može naslijediti od neke druge klase. Stranica 46
47 Konkurentno programiranje u Javi verzije 1 4 Prvo se napiše "pomoćna" klasa koja nasljeđuje sučelje Runnable, koja mora implementirati metodu run(): public class RunThread implements Runnable { } String id; public RunThread(String id) {this.id = id;} public void run() {// do something } System.out.println("This is thread " + id); A onda se objekt te "pomoćne" klase šalje konstruktoru: Thread mt = new Thread(new RunThread("mt")); mt.start();... Stranica 47
48 Konkurentno programiranje u Javi verzije 1 4 Problemi nastaju kada se dvije dretve upliću jedna drugoj u posao, npr. tako da modificiraju isti objekt. To može stvoriti netočne rezultate i naziva se race condition: class Counter { private volatile int value = 0; public int getvalue() {return value;} public void setvalue(int somevalue) { value = somevalue; } public void increment() {value++} } Stranica 48
49 Konkurentno programiranje u Javi verzije 1 4 Pretpostavimo da neka metoda u drugoj klasi radi: x.setvalue(0); x.increment(); int i = x.getvalue(); Koju vrijednost ima varijabla i na kraju ovih naredbi? Za jednodretveni program, odgovor je 1. U konkurentnom radu brojač može biti modificiran od drugih dretvi, tako da rezultat ovisi o ispreplitanju naredbi ove dretve sa naredbama neke druge dretve. Taj se problem rješava pomoću sinkronizacije koja se zove međusobno isključivanje (mutual exclusion). Svaki objekt u Javi ima lokot (lock). Nasljeđuje se automatski od superklase Object. Lokot istovremeno može držati (zaključati) samo jedna dretva. Stranica 49
50 Konkurentno programiranje u Javi verzije 1 4 Objekt koji će služiti kao lokot može se kreirati ovako: Object lock = new Object(); Dretva koja traži lokot to radi pomoću naredbe synchronized, koja označava početak synchronized bloka: synchronized(lock) { // critical section} Kada dretva dođe do početka tog bloka, pokuša zaključati lokot objekta koji je naveden kao argument naredbe synchronized. Ako je lokot zaključan od neke druge dretve, polazna dretva čeka dok on ne postane otključan. Nakon toga ga polazna dretva drži zaključanim sve do kraja tog bloka. Stranica 50
51 Konkurentno programiranje u Javi verzije 1 4 Problem iz prethodnog primjera mogli bismo riješiti pomoću synchronized ovako: // prva dretva synchronized(lock) { x.setvalue(0); x.increment(); int i = x.getvalue(); } // druga dretva synchronized(lock) {x.setvalue(2);} Stranica 51
52 Konkurentno programiranje u Javi verzije 1 4 Osim bloka, i cijela metoda (funkcija / procedura) može imati synchronized na početku: synchronized type method(args) { } // body što je isto kao i ovo: type method(args) { } synchronized(this) { } // body Stranica 52
53 Konkurentno programiranje u Javi verzije 1 4 Zaštita pristupa djeljivim varijablama nije jedini razlog zašto dretve moraju biti međusobno sinkronizirane. Često puta treba odgoditi izvođenje metode (ili dijela metode) u nekoj dretvi, dok se ne zadovolji određeni uvjet (a taj uvjet nije samo otključavanje određenog lokota). To se zove sinkronizacija na temelju uvjeta (condition synchronization), koja se u Javi implementira pomoću naredbi wait / notifyall / notify, koje se pozivaju nad sinkroniziranim objektima. Jedan primjer problema koji traži sinkronizaciju na temelju uvjeta je tzv. problem proizvođač-potrošač (producerconsumer problem), koji je čest u praksi (u različitim varijantama). Stranica 53
54 Konkurentno programiranje u Javi verzije 1 4 Proizvođač u svakoj iteraciji (beskonačne) petlje proizvodi podatke koje potrošač konzumira. Potrošač u svakoj iteraciji petlje troši podatke koje je proizveo proizvođač. Proizvođači i potrošači komuniciraju preko djeljivog međuspremnika (buffer) koji implementira red (queue). U ovom primjeru smatramo da je red neograničen. Prvo pretpostavimo da imamo klasu Buffer (koja implementira neograničeni red) i da imamo jedan objekt te klase: Buffer buffer = new Buffer(); Proizvođači dodaju podatke na kraj reda, koristeći metodu (reda) void put(int item), a potrošači skidaju podatak sa reda koristeći metodu int get(). Broj podataka koji se nalaze u redu može se dobiti pomoću metode int size(). Stranica 54
55 Konkurentno programiranje u Javi verzije 1 4 Pretpostavimo da u klasi Consumer imamo sljedeće: public void consume() { } int value; synchronized(buffer) { } // incorrect: buffer could be empty value = buffer.get(); Metoda nije dobra, jer ne provjerava da li je red (tj. međuspremnik) prazan, što može prouzročiti grešku kod izvođenja (runtime error). Dretva treba čekati dok red bude neprazan i tek tada pročitati podatak iz njega. Stranica 55
56 Konkurentno programiranje u Javi verzije 1 4 Čekanje se u Javi može napraviti pomoću metode wait(), koja se može pozvati samo nad objektom koji je prethodno zaključan, tj. samo unutar synchronized bloka. Wait() tada blokira tekuću dretvu i otpušta lokot koji je dretva držala. public void consume() throws InterruptedException { } int value; synchronized (buffer) { } while(buffer.size() == 0) {buffer.wait();} value = buffer.get(); Stranica 56
57 Konkurentno programiranje u Javi verzije 1 4 Sada lokot može zaključati neka druga dretva, koja može mijenjati stanje navedene kondicije. Da obavijesti prvu dretvu o promjeni kondicije, druga dretva poziva notify(). To odblokira prvu dretvu, koja čeka na taj lokot, ali druga dretva ne otključa lokot odmah, već tek na kraju svog synchronized bloka, unutar kojega je i pozvala notify(): public void produce() { } int value = random.producevalue(); synchronized(buffer) { } buffer.put(value); buffer.notify(); Stranica 57
58 Konkurentno programiranje u Javi verzije 1 4 Odblokirana dretva ne može biti sigurna da je uvjet valjan i kada ona dođe na red, jer je u međuvremenu neka treća dretva mogla potrošiti podatak i red je možda opet prazan. Stoga dretva potrošač mora ispitivati uvjet u while petlji. Važno je i to što notify() uvijek odblokira samo jednu dretvu koja čeka na određeni lokot (bilo koju!). Stoga je u praksi puno sigurnije pozivati notifyall(), koja odblokira sve dretve koje čekaju na određeni lokot. Metode wait(), notify() / notifyall() rade interno sa tzv. unutarnjim redovima kondicija (intrinsic condition queues). U Javi 5 postoji njihova generalizacija, koja omogućava da programeri eksplicitno rade sa kondicijama. Stranica 58
59 Konkurentno programiranje u Javi verzije 1 4 Na kraju, prikažimo kako može nastati deadlock, kada se dvije dretve (ili grupa dretvi) blokiraju zauvijek: public class C extends Thread { private Object a; private Object b; public C(Object x, Object y) {a = x; b = y;} public void run() { synchronized (a) { synchronized (b) {...} } } } Stranica 59
60 Konkurentno programiranje u Javi verzije 1 4 Sada se izvodi npr. sljedeći kod, gdje su a1 i b1 tipa Object: C t1 = new C(a1, b1); C t2 = new C(b1, a1); t1.start(); t2.start(); Budući da su argumenti a1 i b1 međusobno permutirani kod kreiranja dretvi t1 i t2, može doći do takve sekvence poziva u kojem dretva t1 zaključa objekt a1, dretva t2 zaključa objekt b1, i onda su obje dretve blokirane. Java sustav neće detektirati (i onda riješiti) deadlock. Zato programer mora paziti da do deadlocka ne dođe. U Javi 5 postoji mogućnost da se program lakše napiše tako da ne dođe do deadlocka. Stranica 60
61 Konkurentno programiranje u Javi verzije 5 7 U Javi verzije 5, koja se pojavila godine, uvedeno je dosta novina na drugim područjima (generičke klase, bolje kolekcije i dr.), ali i na području konkurentnog programiranja. Kroz novi paket java.util.concurrent uvedene su novosti: - Locks (ReentrantLock, ReadWriteLock...); - Conditions; - Atomic variables; - Executors (thread pools, scheduling); - Futures; - Concurrent Collections; - Synchronizers (Semaphores, Barriers...); - System enhancements. Stranica 61
62 Konkurentno programiranje u Javi verzije 5 7 U Java verziji 6, koja je izašla 2006., nije se pojavilo ništa revolucionarno, uglavnom su se "iznutra" poboljšale biblioteke, tj. riješili bugovi ili poboljšale performanse. U Java verziji 7, koja je izašla 2011., u području konkurentnog programiranja najveća novost je Fork/Join Framework. U Java verziji 8, koja je izašla 2014., u području konkurentnog programiranja najveća novost je Streams (lambda izrazi i default metode su, na neki način, posljedica uvođenja Streams-a, ali su korisne i zasebno). Ukratko će se prikazati samo neke mogućnosti uvedene u Javi 5 (sa poboljšanjima u Javi 6), i to ReentrantLock, ReadWriteLock, Conditions i Atomic variables. Stranica 62
63 Konkurentno programiranje u Javi verzije 5 7 Do Java 5 verzije, jedini mehanizmi za koordinaciju pristupa djeljivim podacima bili su synchronized i volatile. Java 5 uvela je klasu ReentrantLock koja implementira sučelje Lock: public interface Lock { } void lock(); void lockinterruptibly() throws InterruptedException; boolean trylock(); boolean trylock(long timeout, TimeUnit unit) throws InterruptedException; void unlock(); Condition newcondition(); Stranica 63
64 Konkurentno programiranje u Javi verzije 5 7 Zaključavanja pomoću objekata klase ReentrantLock ima istu semantiku kao i synchronized, ali ima i dodatne mogućnosti. Najčešći oblik korištenja: Lock lock = new ReentrantLock();... lock.lock(); try { // update object state // catch exceptions and restore invariants } finally { lock.unlock(); } Stranica 64
65 Konkurentno programiranje u Javi verzije 5 7 Korištenje metode trylock(long timeout,timeunit unit): public boolean trysendonsharedline } (String message, long timeout, TimeUnit unit)throws InterruptedException { long nanostolock = unit.tonanos(timeout) if (!lock.trylock(nanostolock, NANOSECONDS)) return false; try { return sendonsharedline(message); } finally {lock.unlock();} Stranica 65
66 Konkurentno programiranje u Javi verzije 5 7 Korištenje metode lockinterruptibly(): public boolean sendonsharedline(string message) throws InterruptedException { lock.lockinterruptibly(); try { return cancellablesendonsharedline(message); } finally { lock.unlock(); } } Stranica 66
67 Konkurentno programiranje u Javi verzije 5 7 ReentrantLock lokoti mogu biti fer i ne-fer (default) lokoti. Fer lokoti osiguravaju da dretve dobivaju lokote po redoslijedu prispijeća zahtjeva. Stranica 67
68 Konkurentno programiranje u Javi verzije 5 7 Postoje i lokoti klase ReentrantReadWriteLock: istovremeno može raditi više čitatelja koji blokiraju pisce, ali može raditi samo jedan pisac, koji blokira čitatelje i (druge) pisce. Stranica 68
69 Konkurentno programiranje u Javi verzije 5 7 U Java 5 verziji pojavili su se i objekti-kondicije (condition objects). Kao što su eksplicitni lokoti generalizacija unutarnjih lokota, tako su i objekti-kondicije generalizacija unutarnjih redova kondicija (intrinsic condition queues). Kondicija (condition) se povezuje sa Lock objektom na taj način da se pozove Lock.newCondition na već kreiranom lokotu (Lock objektu). Za razliku od unutarnjih lokota i njihovih redova kondicija, gdje je uz jedan unutarnji lokot vezan samo jedan red kondicija, kod eksplicitnih lokota može se vezati više kondicija za jedan lokot, ako postoji potreba. Kondicije imaju metode await, signal, signalall, koje su ekvivalentne metodama wait, notify, notifyall kod unutarnjih redova kondicija. Stranica 69
70 Konkurentno programiranje u Javi verzije 5 7 Primjer korištenja kondicija za implementaciju ograničenog međuspremnika (na jedan lokot vežu se dvije kondicije, te se koriste nove metode await i signal): class BoundedBuffer { Lock lock = new ReentrantLock(); //Povezivanje jednog lokota i dvije kondicije Condition notfull = lock.newcondition(); Condition notempty = lock.newcondition(); Object[] items = new Object[100]; int putptr, takeptr, count; Stranica 70
71 Konkurentno programiranje u Javi verzije 5 7 public void put(object x)throws IE { } lock.lock(); try { while (count == items.length) notfull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notempty.signal(); } finally {lock.unlock();} Stranica 71
72 Konkurentno programiranje u Javi verzije 5 7 public Object take() throws IE { } lock.lock(); try { while (count == 0) notempty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notfull.signal(); return x; } finally {lock.unlock();} Stranica 72
73 Konkurentno programiranje u Javi verzije 5 7 Atomarne varijable su na neki način generalizacija volatilnih varijabli (volatile variables) koje su postojale i prije Jave 5. Atomarne varijable su, kao i lokoti u novim verzijama Jave, implementirane uglavnom uz pomoć CAS (compare-andswap) operacije, koja je opisana u 4. točki. Jedino kad određeni hardver ne podržava tu operaciju, onda JVM umjesto CAS obično koristi spinn lock (zaključavanje pomoću radnog čekanja). JVM-ovi su, kao i operacijski sustavi, koristili CAS (ako je postojao na određenom hardveru) i prije Jave 5, ali tek od Jave 5 mogu Java klase (uključujući i one koje mi pišemo) koristiti CAS operaciju. Stranica 73
74 Konkurentno programiranje u Javi verzije 5 7 Propusnost za ReentrantLock, atomarne varijable i tzv. ThreadLocal varijable (nešto slično kao kada u BP sesija čita svoju vlastitu verziju podataka u UNDO tablespaceu): Stranica 74
75 Konkurentno programiranje u Javi verzije 5 7 Usporedba propusnosti ConcurrentHashMap i sinkronizirane kolekcije (8 - jezgreni procesor): Stranica 75
76 Java 8 - najvažnije nove mogućnosti: Streams, lambda, default metode Na temelju onoga što čitamo i čujemo, mogli bismo zaključiti da je najvažnija nova mogućnost u Javi 8 lambda izraz (ili kraće, lambda). Inače, lambda izraz je (u Javi) naziv za metodu bez imena. U pravilu je ta metoda funkcija, a ne procedura. Zato možemo reći i da lambda izraz je anonimna funkcija, koja se može javiti kao parametar (ili povratna vrijednost) druge funkcije (koja je, onda, funkcija višeg reda). U Javi 8 pojavile su se i tzv. default metode u Java sučeljima (interfaces). One, zapravo, predstavljaju uvođenje višestrukog nasljeđivanja implementacije u Javu. Međutim, lambda izrazi i default metode su, na neki način, posljedica uvođenja treće važne mogućnosti u Javi 8, a to su Streamsi, koji nadograđuju dosadašnje Java kolekcije. Stranica 76
77 Java 8 Streams (java.util.stream) - zašto su potrebni? Pojava masivno višejezgrenih procesora traži bolji i lakši način izrade paralelnih programa od dosadašnjih načina. Jedan (dobar) način je da se koristi funkcijsko programiranje, a naročito paralelne kolekcije. Java nema paralelne kolekcije (collections), ali su zato uvedeni Streamsi, kako bi se postojeće kolekcije "zaogrnule" u (paralelne) Streamse i mogle (indirektno) paralelizirati. Kako bi se olakšalo korištenje Streamsa, bilo je potrebno uvesti i lambda izraze i default metode. Međutim, lambda izrazi i default metode mogu biti korisni i za ostale svrhe, ne samo tvorcima API-a, već i "običnim" programerima. Za razliku od dosadašnjih kolekcija, koje sadrže sve svoje elemente u memoriji, Streamse možemo shvatiti kao "vremenske kolekcije", čiji se elementi (kojih teoretski može biti i beskonačan broj) stvaraju po potrebi. Stranica 77
78 Java 8 razlika između eksterne i interne iteracije "Stare" Java kolekcije koriste eksternu (eksplicitnu) iteraciju, koju piše programer. Streamsi imaju internu iteraciju. Streamsima se može poslati naš kod, kao lambda izraz, za definiranje obrade elemenata: Stranica 78
79 Java 8 Streams programiranje je deklarativno (što, ne kako), kao SQL // 1. "klasična" obrada "klasične" kolekcije - for petlja private static void checkbalance(list<account> acclist) { for (Account a : acclist) if (a.balance() < a.threshold) a.alert(); } // 2. primjena lambda izraza za obradu "klasične" kolekcije private static void checkbalance(list<account> acclist) { acclist.foreach( (Account a) -> { if (a.balance() < a.threshold) a.alert(); } ); } // 3. primjena Streamsa za paralelizaciju "klasične" kolekcije private static void checkbalance(list<account> acclist) { acclist.parallelstream().foreach( (Account a) -> { if (a.balance() < a.threshold) a.alert(); } ); } Stranica 79
80 Java 8 default metode Kako je već rečeno, default metode su u Javi 8 trebale prvenstveno zbog uvođenja Stream API-a, iako su default metode korisne i za ostale svrhe (ne samo tvorcima API-a). Kod uvođenja Streamsa, bilo je potrebno nadograđivati brojna postojeća Java sučelja, tj. dodavati im nove metode. Međutim, kad dodajemo nove metode u sučelje, moramo mijenjati sve klase koje ga (direktno ili indirektno) nasljeđuju, što može značiti izmjenu milijuna redaka programskog koda. Default metode su riješile taj problem. Sučelje sada može imati i implementaciju metode, a ne samo deklaraciju. Java 8 sučelje sa default metodom nije tako moćno kao Scala trait. Scala trait može imati i ne-default metode, može imati stanje (atribute), može se komponirati za vrijeme runtimea, može pristupati instanci klase koja ga nasljeđuje. Ništa od toga Java 8 sučelje (sa default metodama) ne može. Stranica 80
81 Java 8 default metode // 1. ako bismo postojeće sučelje Iterable // htjeli proširiti sa novom metodom foreach, // morali bismo mijenjati svaku klasu // koja (direktno ili indirektno) nasljeđuje to sučelje public interface Iterable<T> { public Iterator<T> iterator(); public void foreach(consumer<? super T> consumer); } // 2. default metode rješavaju taj problem public interface Iterable<T> { public r<t> iterator(); public default void foreach(consumer<? super T> consumer) { for (T t : this) { consumer.accept(t); } } } Stranica 81
82 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Kako je već rečeno, u Javi 5 su kroz paket java.util.concurrent uvedeni executori (tj. sučelja Executor, ExecutorService, Callable, Future, klase Executors, ThreadPoolExecutor, FutureTask i dr.) Executori, za razliku od direktnog rada s klasom Thread, pomažu da se programeri koncentriraju na kreiranje zadataka koji će se poslati executoru na izvršavanje, a optimizaciju izvršavanja rade executori, koji koriste thread pool. Executori najčešće kreiraju fiksni thread pool: ExecutorService ex = Executors.newFixedThreadPool(4); Može se kreirati i cached thread pool, kod kojeg se automatski kreira onoliko Java dretvi koliko je potrebno: = Executors.newCachedThreadPool; Moguće je napraviti i thread pool sa samo jednom dretvom: = Executors.newSingleThreadExecutor; Stranica 82
83 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Executorima se može predati zadatak koji je instanca klase sučelja Runnable. Ako je potrebno da zadatak vrati rezultat, onda se zadatak kreira kao instanca klase sučelja Callable. Budući da Callable (kao i Runnable) zadatak može izvršavati asinkrono, kod asinkronog izvršavanja potrebna je i instanca klase sučelja Future za dobijanje statusa i rezultata rada Callable. U našem ćemo primjeru koristi Callable i Future. Zadatak je: naći koliko ima prim (prostih) brojeva među prvih N (npr ) prirodnih brojeva (N zadajemo). Naravno, želimo zadatak riješiti kroz paralelno programiranje, tako da maksimalno koristimo procesorske resurse. Naravno, cilj je postići minimalno vrijeme za izvršenje zadatka. Stranica 83
84 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Pitanje je kako podijeliti zadatak na podzadatke. Npr., ako je zadatak pretraživati prim brojeve do 10 milijuna, možemo kreirati 10 podzadataka, od kojih će svaki pretraživati milijun brojeva, ili kreirati podzadataka, od kojih će svaki pretraživati tisuću brojeva itd. Zapravo, prvo pitanje je koliko Java dretvi kreirati? Možda onoliko koliko ima podzadataka? To najčešće ne bi bilo dobro! Java VM ne radi baš idealno sa prevelikim brojem Java dretvi (možda je par tisuća već previše). Jedan od razloga je i trošenje memorije za stack (svake) Java dretve. Osim toga, budući da su Java dretve najčešće realizirane kroz dretve operacijskog sustava, zamjena konteksta dretvi nije baš bez troškova (iako se kaže da je puno "jeftinija" od zamjene konteksta procesa operacijskog sustava). Stranica 84
85 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Kako odrediti (relativno) optimalan broj Java dretvi? Ako je problem računski vrlo intenzivan, tj. uglavnom ovisi o procesoru, a ne o I/O (Input/Output) operacijama, onda broj Java dretvi možemo postaviti tako da bude jednak (ili malo veći) broju HW (hardverskih) dretvi. Ako je problem IO intenzivan, onda se može kreirati više Java dretvi nego što ima HW dretvi. Za (približno) određivanje broja Java dretvi može se koristiti jednostavna formula: broj_java_dretvi = broj_hw_dretvi / (1 koeficijent_blokiranja) Koeficijent blokiranja (blocking coefficient) je broj između 0 i 1 i nije ga lako odrediti. Računski intenzivni problemi imaju koeficijent koji se približava nuli, pa je tada preporučeni broj Java dretvi jednak ili nešto malo veći od broja HW dretvi. Stranica 85
86 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka IO intenzivni problemi mogu imati koeficijent koji se približava jedinici. Ako je koeficijent blokiranja npr. 50%, onda je po ovoj formuli preporučeni broj Java dretvi duplo veći od broja HW dretvi. No, sada treba odrediti kako podijeliti problem, tj. koliko ćemo imati podzadataka. Svaki podzadatak radit će konkurentno, pa ih svakako treba biti barem onoliko koliko ima Java dretvi. Ako bi broj podzadataka bio potpuno jednak broju Java dretvi, time bi se ignorirala priroda problema koji treba rješavati. Naime, u tom slučaju bi dijelovi programa trebali biti savršeno dobro izbalansirani. U našem zadatku, ako se broj dijelova naivno odredi tako da se raspon brojeva podijeli sa brojem dretvi, zanemaruje se važna činjenica da je lakše naći prim brojeve u donjim dijelovima raspona brojeva, nego u gornjim dijelovima. Stranica 86
87 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka U općenitom slučaju može se primijeniti relativno jednostavna tehnika: broj podzadataka treba biti dovoljno velik da se iskoriste postojeće Java dretve, tj. ne smije se desiti da neke Java dretve ostanu neiskorištene. Dakle, broj podzadataka svakako mora biti veći od broja Java dretvi. Naravno, nije lako odrediti (a ponekad niti moguće) koliki točno treba biti taj broj najčešće treba eksperimentirati. Uglavnom se pokazuje da se kod početnog povećanja broja podzadataka dobije značajno povećanje performansi, a sa daljnjim povećanjem broja, povećanje performansi je sve manje (performanse se mogu i smanjiti). Iza slike slijedi program, koji ima ove ulazne parametre: - number: gornja granica do koje se traže prim brojevi; - poolsize: broj Java dretvi; - numberofparts: broj podzadataka. Stranica 87
88 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Pronalaženje prim brojeva na μp sa 8 HW dretvi (4 jezgre * 2) - prikaz efekta mijenjanja broja Java dretvi (PoolSize, os x) i broja podzadataka (različite krivulje): Stranica 88
89 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka import java.util.concurrent.executorservice;... public class ExecutorPrimeFinder {... public static void main(final String[] args) { if (args.length < 3) { System.out.println("Usage: number poolsize numberofparts"); } else { final int number = Integer.parseInt(args[0]); final int poolsize = Integer.parseInt(args[1]); final int numberofparts = Integer.parseInt(args[2]); ExecutorPrimeFinder task = new ExecutorPrimeFinder(); final long starttime = System.nanoTime(); final long numberofprimes = task.countprimes(number, poolsize, numberofparts); final long endtime = System.nanoTime(); System.out.printf("Number of primes under %d is %d\n", number, numberofprimes, numberofparts); System.out.println("Time (seconds) taken is " + (endtime - starttime) / 1.0e9); }}} Stranica 89
90 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka protected int countprimes (final int number, final int poolsize, final int numberofparts) { int count = 0; try { final List<Callable<Integer>> partitions = new ArrayList<Callable<Integer>>(); final int chunksperpartition = number / numberofparts; for(int i = 0; i < numberofparts; i++) { final int lower = (i * chunksperpartition) + 1; final int upper = (i == numberofparts - 1)? number : lower + chunksperpartition - 1; partitions.add(new Callable<Integer>() { public Integer call() { return countprimesinrange(lower, upper); } }); }... Stranica 90
91 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka protected int countprimes (final int number, final int poolsize, final int numberofparts) {... final ExecutorService executorpool = Executors.newFixedThreadPool(poolSize); final List<Future<Integer>> resultfromparts = executorpool.invokeall(partitions,10000,timeunit.seconds); executorpool.shutdown(); } for(final Future<Integer> result : resultfromparts) { count += result.get(); } } catch(exception ex) { throw new RuntimeException(ex); } return count; Stranica 91
92 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka public int countprimesinrange(final int lower, final int upper) { int total = 0; for(int i = lower; i <= upper; i++) { if (isprime(i)) total++; } return total; } private boolean isprime(final int number) { if (number <= 1) return false; if (number == 2) return true; if (number % 2 == 0) return false; for(int i = 3; i <= Math.sqrt(number); i = i + 2) { if (number % i == 0) return false; } return true; } Stranica 92
93 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Kako je već rečeno, u Javi 7 je uveden ForkJoin framework, koji je, zapravo, specijalna verzija executora. Mark Reinhold, Chief Architect, Java Platform Group u "Divide and Conquer Parallelism with the Fork/Join Framework" ( ): The fork/join framework minimizes per-task overhead for compute-intensive tasks Not recommended for tasks that mix CPU and I/O activity A portable way to express many parallel algorithms Code is independent of execution topology Reasonably efficient for a wide range of core counts Library-managed parallelism Stranica 93
94 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Mark Reinhold, Chief Architect, Java Platform Group u "Divide and Conquer Parallelism with the Fork/Join Framework" ( ): No silver bullet - Many point solutions: - Divide & conquer (fork/join) - Work queues + thread pools - Bulk data operations (select / map / reduce) - Actors - Software transactional memory (STM) - GPU-based SIMD-style computation Stranica 94
95 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka "Divide and Conquer" ("Divide et impera", "Podijeli pa vladaj" ili "Zavadi pa vladaj" stara rimska poslovica). Implementaciju ExecutorService sučelja u slučaju ForkJoin frameworka radi klasa ForkJoinPool. Tipično se ForkJoinPool instanci šalje samo jedan zadatak (task), a onda ForkJoinPool instanca i zadatak zajedno primjenjuju tehniku Divide and Conquer. Broj Java dretvi u poolu se može zadati eksplicitno ili implicitno: -- broj Java dretvi se zadaje eksplicitno (u ovom slučaju 8) ForkJoinPool fjpool = new ForkJoinPool(8); -- ili implicitno (na računalu sa 8 HW dretvi, bit će ih 8) -- framework koristi metodu Runtime.availableProcessors() ForkJoinPool fjpool = new ForkJoinPool(); Stranica 95
96 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Zadatak (task) treba biti instanca podklase apstraktne klase ForkJoinTask, preciznije podklasa apstraktne podklase klase ForkJoinTask, a najčešće su to RecursiveTask (u primjeru) ili RecursiveAction. ForkJoinTask ima puno metoda, ali najvažnije su: compute(), fork(), join() Pseudo kod za compute: if (podzadatakjedovoljnomali()) { rijesipodzadatak(); } else { MojForkJoinTask lijevapolovica =... } MojForkJoinTask desnapolovica =... lijevapolovica.fork(); -- stavi u queue desnapolovica.compute(); -- radi lijevapolovica.join(); -- čekaj završetak Stranica 96
97 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Za razliku od većine ExecutorService implementacija, kod ForkJoin frameworka svaka Java dretva u ForkJoinPool-u ima svoj red (queue) podzadataka na kojima radi. Metoda fork() stavlja ForkJoinTask u red tekuće Java dretve. Inicijalno je zauzeta samo jedna Java dretva - kada joj pošaljemo (cijeli) zadatak. Dretva tada počinje dijeliti zadatak u dva podzadatka, pa prvi podzadatak (lijevi) stavi u red, a drugi podzadatak (desni) pokuša izvršiti (i tako rekurzivno): Stranica 97
98 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Ključna značajka ForkJoin frameworka je Work Stealing (krađa posla). Java dretve kradu posao (podzadatak) drugoj Java dretvi iz njenog reda podzadataka, i stavljaju ga u svoj red (nešto što većina nas ne bi nikad napravila ). Vrlo je važan redoslijed stavljanja podzadataka u red. Podzadaci koji se prvi stavljaju u red trebaju predstavljati veći dio posla. Npr. na početku imamo jedan zadatak, koji pokriva 100% posla. Njega dijelimo u dva podzadatka, svaki po (otprilike) 50% posla. Prvi stavljamo u red, a drugi obrađujemo, pri čemu drugi opet dijelimo u polovice, itd. One Java dretve koje nemaju posla (tj. njihov red je prazan), kradu posao drugim Java dretvama, i to tako da uzmu posao (podzadatak) koji je najstariji u redu, a to je istovremeno i najveći posao iz reda druge Java dretve. Sljedeća slika pokazuje ta događanja, sa 4 Java dretve. Stranica 98
99 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Stranica 99
100 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Kada bi se zadatak mogao savršeno dijeliti na jednake polovice, ne bi niti bilo potrebe za ForkJoin frameworkom, mogli bismo koristiti i standardne executore. No, to je u praksi rijetko tako. Npr., u našem slučaju je lakše pretraživati prim brojeve po donjoj polovici raspona brojeva, nego gornjoj (jer gornja polovica sadrži veće brojeve). Zato je važno podijeliti posao na dovoljno veliki broj podzadataka, tako da (sve do samog kraja) niti jedna Java dretva ne ostane bez posla (tj. treba biti tako da jedna dretva uvijek može ukrasti posao drugoj dretvi). Dijeljenje na podzadatke se, za razliku od primjera sa običnim executorima, radi implicitno ne zadaje se broj podzadataka, već se određuje kada je podzadatak dovoljno mali. Nažalost, ne postoji opća metoda kojom se ispravno određuje veličina tog malog podzadatka to se radi eksperimentalno. Stranica 100
101 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka Podzadatak na kojem se poziva metoda join() može tada biti već gotov, jer ga je možda ukrala druga Java dretva, i već napravila. Ili može biti ukraden, ali ga druga dretva upravo radi, pa tada treba čekati da završi. Treći je slučaj da podzadatak nije ukraden i tada ga radi tekuća dretva. Poziv join() metode u compute() metodi treba biti jedna od zadnjih radnji, iza poziva fork() metode i rekurzivnog poziva compute() metode. Budući da je to jako važno, postoji metoda invokeall(a2, a1); koja zamjenjuje niz a1.fork(); a2.compute(); a1.join(); Kako je već rečeno, zadatak (task) treba biti instanca podklase apstraktnih klasa RecursiveAction ili RecursiveTask. RecursiveAction se koristi onda kada nije potrebno vraćati rezultat, a RecursiveTask kada je potrebno vraćati rezultat (kao u našem primjeru). Stranica 101
102 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka import java.util.concurrent.forkjoinpool;... public class ForkJoinPrimeFinderTask extends RecursiveTask<Integer> { private static int threshold; private int start; private int end; public ForkJoinPrimeFinderTask (final int thestart, final int theend) { start = thestart; end = theend; } } public static void main(final String[] args) { if (args.length < 1 args.length > 3) { System.out.println("Usage: number poolsize threshold OR number poolsize OR number"); return; }... Stranica 102
103 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka public static void main(final String[] args) {... final int number = Integer.parseInt(args[0]); ForkJoinPrimeFinderTask task = new ForkJoinPrimeFinderTask(1, number); ForkJoinPool fjpool; if (args.length == 2 args.length == 3) { fjpool = new ForkJoinPool(Integer.parseInt(args[1])); } else { fjpool = new ForkJoinPool(); } if (args.length == 3) { threshold = Integer.parseInt(args[2]); } else { threshold = 100; final long starttime = System.nanoTime(); final long numberofprimes = fjpool.invoke(task); final long endtime = System.nanoTime(); System.out.printf("Number of primes under %d is %d\n", number, numberofprimes); System.out.println("Time (seconds) taken is " + (endtime - starttime) / 1.0e9); } Stranica 103
104 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka protected Integer compute() { if (end - start <= threshold) { return countprimesinrange(start, end); } else { int halfway = ((end - start) / 2) + start; ForkJoinPrimeFinderTask t1 = new ForkJoinPrimeFinderTask(start, halfway); ForkJoinPrimeFinderTask t2 = new ForkJoinPrimeFinderTask(halfWay + 1, end); } } t1.fork(); int count2 = t2.compute(); int count1 = t1.join(); return count1 + count2; Stranica 104
105 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka -- ovo je isto kao u primjeru Executora public int countprimesinrange(final int lower, final int upper) { int total = 0; for(int i = lower; i <= upper; i++) { if (isprime(i)) total++; } return total; } private boolean isprime(final int number) { if (number <= 1) return false; if (number == 2) return true; if (number % 2 == 0) return false; for(int i = 3; i <= Math.sqrt(number); i = i + 2) { if (number % i == 0) return false; } return true; } Stranica 105
106 Usporedba Java 5/6 Executora i Java 7 ForkJoin frameworka ExecutorPrimeFinder Number of primes under is Time (seconds) taken is 12,70 ExecutorPrimeFinder Time (seconds) taken is 6,60 ExecutorPrimeFinder Time (seconds) taken is 3,20 ExecutorPrimeFinder Time (seconds) taken is 3,18 ExecutorPrimeFinder Time (seconds) taken is 3,17 ForkJoinPrimeFinderTask Number of primes under is Time (seconds) taken is 14,41 ForkJoinPrimeFinderTask Time (seconds) taken is 7,36 ForkJoinPrimeFinderTask Time (seconds) taken is 3,91 ForkJoinPrimeFinderTask Time (seconds) taken is 3,28 ForkJoinPrimeFinderTask Time (seconds) taken is 3,25 ForkJoinPrimeFinderTask Time (seconds) taken is 2,93 Stranica 106
107 Zaključak Mooreov zakon vrijedi i dalje. No, radni takt procesora praktički je prestao rasti oko godine. Umjesto povećanja brzine, proizvođači povećavaju broj CPU-a (jezgri) na jednom mikroprocesorskom čipu. Dok smo kod jednojezgrenih procesora povećanjem takta procesora dobili linearno povećanje brzine programa, kod višejezgrenih procesora program najčešće moramo pisati drugačije da bismo iskoristili raspoložive jezgre, a razlog za to objašnjava Amdahlov zakon. Nažalost, konkurentne programe nije lako pisati. Iako dretve rade paralelno, moramo investirati veliki trud da implementiramo tehnike koje ih sprečavaju da na loš način utječu jedna na drugu. Stranica 107
108 Zaključak Nije lako pisati tzv. blokirajuće algoritme, koji koriste različite vrste lokota za (blokirajuću) sinkronizaciju. Svi se ti lokoti danas uglavnom zasnivaju na mikroprocesorskoj funkciji (operaciji) Compare And Swap (CAS), ili sličnoj. Korištenje lokota (zaključavanje) ima dosta mana, a najveća je što "Nitko stvarno ne zna kako organizirati i održavati veliki sustav temeljen na zaključavanju". Još je teže pisati neblokirajuće konkurentne algoritme, koji ne koriste zaključavanje. I oni se interno temelje na CAS. Njih je posebno teško smisliti i često su vrlo neintuitivni. Osnovna teškoća sa svim današnjim sinkronizacijskim operacijama je da one rade na samo jednoj riječi memorije, što tjera na korištenje kompleksnih i neprirodnih algoritama. Stranica 108
109 Zaključak Zato je izmišljena transakcijska memorija (TM), koja može biti softverska (STM), hardverska (HTM) ili hibridna. Postoje implementacije STM-a na razini jezika (npr. jezik Clojure) ili na razini biblioteka (npr. jezik Scala). Što se tiče HTM-a, danas postoje barem tri mikroprocesora koja ju podržavaju - Azul Systems Vega, IBM BlueGene/Q, Intel Haswell. Postoje i neka softverska rješenja, koja omogućavaju relativno jednostavno i sigurno konkurentno programiranje u Javi (preciznije, paralelno programiranje). Između ostalih, to su executori i ForkJoin framework (koji je specijalna vrsta executora). Nažalost, nisu svi zadaci prikladni za paralelizaciju pomoću tih rješenja. Stranica 109
PowerPoint Presentation
Java konkurentno programiranje Životni ciklus niti i problemi sinhronizacije resursa Multitasking Multithreading Životni ciklus niti http://www.roseindia.net/java/thread/lifecycle-of-threads.shtml Životni
ВишеTutoring System for Distance Learning of Java Programming Language
Deklaracija promenljivih Inicijalizacija promenljivih Deklaracija promenljive obuhvata: dodelu simboličkog imena promenljivoj i određivanje tipa promenljive (tip određuje koja će vrsta memorijskog registra
ВишеSlide 1
Funkcionalno programiranje Interoperabilnost jezika Scala i Java, 2019. Prevođenje u Java bajt kod Svi Java tipovi imaju ekvivalentan tip u jeziku Scala Većina Scala koda se direktno preslikava u odgovarajući
ВишеProgramiranje 2 0. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/4
Programiranje 2 0. predavanje Saša Singer singer@math.hr web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/48 Sadržaj predavanja Ponavljanje onog dijela C-a koji
ВишеDrugi kolokvij iz predmeta Operacijski sustavi 2. srpnja Napomene: PISATI ČITKO! Zadatke 7-10 rješavati na ovom papiru ili uz njih napisati "na
Drugi kolokvij iz predmeta Operacijski sustavi 2. srpnja 2019. Napomene: PISATI ČITKO! Zadatke 7-10 rješavati na ovom papiru ili uz njih napisati "na papirima". 1. (2) Opisati pristupni sklop za izravni
ВишеP2.1 Projektovanje paralelnih algoritama 1
Projektovanje paralelnih algoritama I Uvod Osnove dinamičke paralelizacije 1 Primer: Fibonačijev niz Primer rekurz. računanja Fibonačijevih brojeva: F 0 = 0; F 1 = 1; F i = F i -1 + F i -2 za i 2 Algoritam
ВишеKDP
Региони Региони Програмска парадигма за приступ критичној секцији Увођење посебне синтаксе за експлицитно означавање критичних секција Обезбеђивање међусобног искључивања процеса Условни критични регион
ВишеRačunarski praktikum I - Vježbe 07 - Podstrukture, const, reference
Prirodoslovno-matematički fakultet Matematički odsjek Sveučilište u Zagrebu RAČUNARSKI PRAKTIKUM I Vježbe 07 - Podstrukture, const, reference v2018/2019. Sastavio: Zvonimir Bujanović Podstrukture Član
ВишеRazvoj programa, Code::Blocks, struktura programa, printf, scanf, konverzioni karakteri predavač: Nadežda Jakšić
Razvoj programa, Code::Blocks, struktura programa, printf, scanf, konverzioni karakteri predavač: Nadežda Jakšić projektni zadatak projektovanje programa (algoritmi) pisanje programskog koda, izvorni kod,
Више_sheets.dvi
Zavod za elektroniku, mikroelektroniku, 28. studenog 2008. računalne i inteligentne sustave 2. me duispit iz Arhitekture računala 2, teorijski dio 1. Koja komponenta modernih računala nije bila prisutnau
ВишеTutoring System for Distance Learning of Java Programming Language
Niz (array) Nizovi Niz je lista elemenata istog tipa sa zajedničkim imenom. Redosled elemenata u nizovnoj strukturi je bitan. Konkretnom elementu niza pristupa se preko zajedničkog imena niza i konkretne
ВишеInženjering informacionih sistema
Fakultet tehničkih nauka, Novi Sad Inženjering informacionih sistema Dr Ivan Luković Dr Slavica Kordić Nikola Obrenović Milanka Bjelica Dr Jelena Borocki Dr Milan Delić UML UML (Unified Modeling Language)
ВишеTutoring System for Distance Learning of Java Programming Language
Uvod u programiranje dr Ninoslava Savić Predavanja (3) sreda: 11:15 13:50 Učionica 16 Konsultacije sreda: 15 17 h Kabinet 43 Uvod u programiranje Fond časova: 3+3 Broj ESPB: 7 Ocena znanja (max. broj poena
ВишеTest ispravio: (1) (2) Ukupan broj bodova: 21. veljače od 13:00 do 14:00 Županijsko natjecanje / Osnove informatike Osnovne škole Ime i prezime
Test ispravio: () () Ukupan broj bodova:. veljače 04. od 3:00 do 4:00 Ime i prezime Razred Škola Županija Mentor Sadržaj Upute za natjecatelje... Zadaci... Upute za natjecatelje Vrijeme pisanja: 60 minuta
ВишеUvod u računarstvo 2+2
Programiranje 2 doc.dr.sc. Goranka Nogo PMF Matematički odsjek, Zagreb Kontakt ured: 228, drugi kat e-mail: nogo@math.hr konzultacije: četvrtak, 12:00-14:00 petak, 11:00-12:00 neki drugi termin, uz prethodni
ВишеUVOD - OD JAVE DO C# ELEMENTARNE RAZLIKE Veliki broj Java/C# razlika su uglavnom preimenovane ključne reči i razlike u konvencijama imenovanja. Neke o
UVOD - OD JAVE DO C# ELEMENTARNE RAZLIKE Veliki broj Java/C# razlika su uglavnom preimenovane ključne reči i razlike u konvencijama imenovanja. Neke od tih jezičkih razlika su: Java kod se prevodi u.class
ВишеMicrosoft PowerPoint - OOPpredavanja05 [Compatibility Mode]
OBJEKTNO ORIJENTISANO PROGRAMIRANJE PREDAVANJE 5 OBJEKTI U INTERAKCIJI Miloš Kovačević Đorđe Nedeljković 1 /25 OSNOVNI KONCEPTI - Abstrakcija - Modularizacija - Objektne reference - Klasni dijagram - Objektni
ВишеP3.2 Paralelno programiranje 2
Paralelno programiranje II Analiza zavisnosti Struktura algoritma Pomoćne strukture Komunikacioni šabloni 1 4 Koraka paralelizacije programa 2 Evo algoritma. Gde je paralelizam? Dekompozicija zadataka
ВишеRačunarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1
Računarske mreže Čas 2 Ivana Tanasijević e-mail: ivana@matf.bg.ac.rs Matematički fakultet, Beograd 1 Utvrđivanje gradiva sa prethodnog časa: popunjavanje adresne strukture, kreiranje soketa, privezivanje
ВишеNastavna cjelina: 1. Jezik računala Kataloška tema: 1.1. Bit 1.2. Brojevi zapisani četvorkom bitova Nastavna jedinica: 1.1. Bit 1.2. Brojevi zapisan
Nastavna cjelina: 1. Osnove IKT-a Kataloška tema: 1.6. Paralelni i slijedni ulazno-izlazni pristupi računala 1.7. Svojstva računala Unutar računala podatci su prikazani električnim digitalnim signalima
ВишеPROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije
PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije korake. Uz dobro razrađen algoritam neku radnju ćemo
ВишеMicrosoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]
Programski jezik C organizacija izvornog programa Prevođenje Pisanje programa izvorni program Prevođenje programa izvršni program Izvršavanje programa rezultat Faze prevođenja Pretprocesiranje Kompilacija
ВишеMicrosoft PowerPoint - 03-Slozenost [Compatibility Mode]
Сложеност алгоритама (Програмирање 2, глава 3, глава 4-4.3) Проблем: класа задатака истог типа Велики број различитих (коректних) алгоритама Величина (димензија) проблема нпр. количина података које треба
ВишеFunkcije predavač: Nadežda Jakšić
Funkcije predavač: Nadežda Jakšić funkcije delovi programa koji izvršavaju neki zadatak, celinu; dele na ugrađene, korisničke i main funkciju ugrađene funkcije printf,scanf... da bi se one izvršile potrebno
ВишеMicrosoft Word - 11 Pokazivaci
Pokazivači U dosadašnjem radu smo imali prilike da koristimo promenljive koje smo deklarisali na početku nekog bloka. Prilikom deklaracije promenljiva dobija jedinstveni naziv i odgovarajući prostor u
ВишеPowerPoint Presentation
Tehnička škola 9. maj Bačka Palanka Programiranje III razred Tok izvršavanja programa Tok izvršavanja programa Dosadašnji kod se izvršavao praktično linearno. Nije postojala nikakva uslovna ili brojačka
ВишеZadatak 011 Razmotrite sljedeći primjer. package hr.fer.oopj.primjeri.p011; public class Main { } public static void main(string[] args) { obrada(2.71
Zadatak 011 Razmotrite sljedeći primjer. package hr.fer.oopj.primjeri.p011; public class Main { public static void main(string[] args) { obrada(2.7182818284590452354); private static void obrada(double
ВишеUniverzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br
Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Brkić SI 29/15 Zrenjanin 2018. Softversko inženjerstvo
ВишеLogičke izjave i logičke funkcije
Logičke izjave i logičke funkcije Građa računala, prijenos podataka u računalu Što su logičke izjave? Logička izjava je tvrdnja koja može biti istinita (True) ili lažna (False). Ako je u logičkoj izjavi
ВишеELEKTROTEHNIČKI FAKULTET, UNIVERZITET U BEOGRADU KATEDRA ZA ELEKTRONIKU UVOD U ELEKTRONIKU - 13E041UE LABORATORIJSKA VEŽBA Primena mikrokontrolera
ELEKTROTEHNIČKI FAKULTET, UNIVERZITET U BEOGRADU KATEDRA ZA ELEKTRONIKU UVOD U ELEKTRONIKU - 13E041UE LABORATORIJSKA VEŽBA Primena mikrokontrolera CILJ VEŽBE Cilj ove vežbe je da se studenti kreiranjem
ВишеVjezbe
SOFTVERSKO INŽENJERSTVO Vježbe 8: Activity dijagrami Robert Manger Sveučilište u Zagrebu PMF-Matematički odsjek Akademska godina 2018/2019. Sadržaj Vježbi 8 Općenito o activity dijagramima Aktivnosti,
ВишеMicrosoft Word - predavanje8
DERIVACIJA KOMPOZICIJE FUNKCIJA Ponekad je potrebno derivirati funkcije koje nisu jednostavne (složene su). Na primjer, funkcija sin2 je kompozicija funkcija sin (vanjska funkcija) i 2 (unutarnja funkcija).
ВишеRAČUNALO
RAČUNALO HARDVER + SOFTVER RAČUNALO HARDVER strojna oprema računala tj. tvrdi, materijalni, opipljivi dijelovi računala kućište i sve komponente u njemu, vanjske jedinice SOFTVER neopipljivi dijelovi računala
ВишеPowerPoint Presentation
Mehanizmi čuvanja podataka baznog sustava za potrebe Billing aplikacije Autor: Domagoj Dukarić, HEP ODS d.o.o. Koautor: Mario Blažanović, HEP ODS d.o.o. Ukratko o Oracle bazi Instanca memorijske strukture
ВишеJEZGRO OPERATIVNOG SISTEMA I UPRAVLJANJE PROCESIMA 1. Šta je jezgro, a šta proces? Jezgro (nukleus ili kernel) je osnovni deo svakog operativnog siste
JEZGRO OPERATIVNOG SISTEMA I UPRAVLJANJE PROCESIMA 1. Šta je jezgro, a šta proces? Jezgro (nukleus ili kernel) je osnovni deo svakog operativnog sistema. U hijerarhijskom (slojevitom) modelu, jezgro je
ВишеRačunarski praktikum I - Vježbe 09 - this, static
Prirodoslovno-matematički fakultet Matematički odsjek Sveučilište u Zagrebu RAČUNARSKI PRAKTIKUM I Vježbe 09 - this, static v2018/2019. Sastavio: Zvonimir Bujanović Pokazivač this Kako funkcija članica
ВишеMicrosoft PowerPoint - 13-Funkcije_2.ppt [Compatibility Mode]
Osnove programiranja Funkcije - Metode Prenos parametara Po vrednosti Po referenci Po izlazu Sadržaj Opseg važenja promenljive u drugim strukturama Rekurzije Prenos parametara Metoda može vratiti isključivo
ВишеP11.3 Analiza zivotnog veka, Graf smetnji
Поједностављени поглед на задњи део компајлера Међурепрезентација (Међујезик IR) Избор инструкција Додела ресурса Распоређивање инструкција Инструкције циљне архитектуре 1 Поједностављени поглед на задњи
ВишеTutoring System for Distance Learning of Java Programming Language
Obeležene petlje Obeležene petlje Obeležavanje petlje nekim identifikatorom omogućava da se programski tok usmeri na mesto u programu specificirano tim identifikatorom. Ako se iza naredbi break ili continue
ВишеGenerated by Foxit PDF Creator Foxit Software For evaluation only. Operativni sistem U računarstvu, operativni sistem (OS
Operativni sistem U računarstvu, operativni sistem (OS) je kompleksan programski sistem koji kontroliše i upravlja uređajima i računarskim komponentama i obavljanje osnovne sistemske radnje. Operativni
ВишеMicrosoft PowerPoint - Programski_Jezik_C_Organizacija_Izvrsnog_Programa [Compatibility Mode]
Организација извршног програма (Марић, Јаничић: Програмирање 1, 9.3.3) Извршавање програма После успешног превођења (претпроцесирања, компилације, повезивања) програм може да се изврши Извршавање се захтева
ВишеOblikovanje i analiza algoritama 5. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 5. pr
Oblikovanje i analiza algoritama 5. predavanje Saša Singer singer@math.hr web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 5. predavanje p. 1/68 Sadržaj predavanja Nehomogene rekurzije
Вишеkriteriji ocjenjivanja - informatika 8
8. razred Nastavne cjeline: 1. Osnove informatike 2. Pohranjivanje multimedijalnih sadržaja, obrada zvuka 3. Baze podataka - MS Access 4. Izrada prezentacije 5. Timska izrada web stranice 6. Kritički odnos
ВишеProgramiranje za UNIX Okruženje unix procesa
Programiranje za UNIX Okruženje unix procesa Sadržaj Memorijska slika UNIX procesa Argumenti naredbenog retka i varijable okruženja Životni ciklus procesa Izlazni status procesa 2 Memorijska slika UNIX
ВишеPDO
PDO Marijan Šuflaj FER, 2018 Sadržaj PDO Osnove Izvršavanje upita Ranjivosti Dohvaćanje rezultata upita PDO - PHP Data Objects Jednostavno i konzistetno sučelje za pristup bazama podataka iz PHP-a Isti
ВишеAlgoritmi SŠ P1
Županijsko natjecanje iz informatike Srednja škola 9. veljače 2018. RJEŠENJA ZADATAKA Napomena: kodovi za većinu opisanih algoritama dani su u Pythonu radi jednostavnosti i lakše čitljivosti. Zbog prirode
ВишеPowerPoint Presentation
VMware Horizon 7 What s New Bojan Andrejić i Stefan Đoković COMING Computer Engineering Uvod u VMware Horizon 7 Obezbeđuje unapređeno i bezbedno upravljanje i isporučivanje Windows ili Linux desktopova,
ВишеSlide 1
OSNOVNI POJMOVI Naredba je uputa računalu za obavljanje određene radnje. Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Pisanje programa zovemo programiranje. Programski jezik
ВишеPowerPoint Presentation
i n f o r m a c i j s k i i n ž e n j e r i n g Usporedba Microsoft Analysis Services i Hyperion Essbase OLAP Marko Hilak Krešimir Futivić Maja Inđić 15.10.2009 Microsoft Analysis Services i Hyperion Essbase
ВишеOblikovanje i analiza algoritama 4. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 4. pr
Oblikovanje i analiza algoritama 4. predavanje Saša Singer singer@math.hr web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 4. predavanje p. 1/69 Sadržaj predavanja Složenost u praksi
ВишеWeb programiranje i primjene - Osnovni pojmovi WEB tehnologije korišteni u kolegiju
Osnovni pojmovi WEB tehnologije korišteni u kolegiju Ivan Vazler Odjel za matematiku Sveučilište u Osijeku 16. listopada 2013. WWW - World Wide Web World Wide Web (WWW) svjetska mreža računala s izvorima
ВишеPrimenjeno programiranje - vezbe GUI i baze podataka
Primenjeno programiranje - Vežbe Java i NetBeans IDE 6.5 Kreiranje korisničkog interfejsa Primer jednostavne aplikacije: 1. Odabrati opciju File > New Project 2. Meñu kategorijama odabrati Java i podkategoriju
ВишеFunkcije predavač: Nadežda Jakšić
Funkcije predavač: Nadežda Jakšić do sada su korišćene "gotove" funkcije iz standardnih biblioteka (cin, cout...) one su pozivane iz main funkcije koja je glavna funkcija u programu jer izvršavanje programa
Више23. siječnja od 13:00 do 14:00 Školsko natjecanje / Osnove informatike Srednje škole RJEŠENJA ZADATAKA S OBJAŠNJENJIMA Sponzori Medijski pokrovi
3. siječnja 0. od 3:00 do 4:00 RJEŠENJA ZADATAKA S OBJAŠNJENJIMA Sponzori Medijski pokrovitelji Sadržaj Zadaci. 4.... Zadaci 5. 0.... 3 od 8 Zadaci. 4. U sljedećim pitanjima na pitanja odgovaraš upisivanjem
ВишеProjekti šabloni
Projekti obrasci Kreiranje objekata Uvod Enkapsuliraju znanje o tome koje konkretno klase koristi sistem Sakrivaju instanciranje objekata i načine na koji se oni povezuju i reprezentuju Ostatak sistema
Више1 NOVO U MNG CENTRU!!! OVLADAJTE TEHNOLOGIJOM IZRADE JAVA EE APLIKACIJA KORIŠ C ENJEM ORACLE ADF-A O - Otkrijte brzinu razvoja aplikacija sa ADF-om -
1 NOVO U MNG CENTRU!!! OVLADAJTE TEHNOLOGIJOM IZRADE JAVA EE APLIKACIJA KORIŠ C ENJEM ORACLE ADF-A O - Otkrijte brzinu razvoja aplikacija sa ADF-om - Minimizujte pisanje programskog koda - Smanjite obim
Више(Microsoft PowerPoint - 903_\216nidari\346_Java Persistence.pptx)
Java Persistence API (JPA) najbolje prakse Slavko Žnidarić Beta Tau Beta slavko.znidaric@btb.hr Vaš podatkovni sloj? Vaš šef, DBA ili klijent? Vi? Uzroci loših performansi Previše upita Spori upiti Loše
ВишеMicrosoft Word - privitak prijedloga odluke
Informatički sustav za prikupljanje, simulaciju i prikaz podataka o cijenama javnih komunikacijskih usluga (dalje: Sustav e-tarife) Zagreb, HRVATSKA AGENCIJA ZA POŠTU I ELEKTRONIČKE KOMUNIKACIJE Roberta
ВишеClassroom Expectations
АТ-8: Терминирање производно-технолошких ентитета Проф. др Зоран Миљковић Садржај Пројектовање флексибилних ; Математички модел за оптимизацију флексибилних ; Генетички алгоритми у оптимизацији флексибилних
ВишеSlide 1
Kako jednostavnije preći na višu verziju Formsa Ivan Lovrić, Vedran Latin 14.10.2009. Sadržaj prezentacije Predmet migracije Razlozi za migraciju Infrastruktura potrebna za migraciju Pilot migracija Migracija
ВишеMicrosoft Word - 6ms001
Zadatak 001 (Anela, ekonomska škola) Riješi sustav jednadžbi: 5 z = 0 + + z = 14 4 + + z = 16 Rješenje 001 Sustav rješavamo Gaussovom metodom eliminacije (isključivanja). Gaussova metoda provodi se pomoću
ВишеMicrosoft PowerPoint - C-4-1
Pregled iskaza u C-u Izraz; Iskaz dodele, serijski komponovani iskaz; blok Uslovni iskazi i izrazi; složeno grananje Iterativni iskazi Iskaz dodele Promena vrednosti a = Ψ; Izračunava vrednost izraza Ψ,
ВишеMicrosoft Word - AIDA2kolokvijumRsmerResenja.doc
Konstrukcija i analiza algoritama 2 (prvi kolokvijum, smer R) 1. a) Konstruisati AVL stablo od brojeva 100, 132, 134, 170, 180, 112, 188, 184, 181, 165 (2 poena) b) Konkatenacija je operacija nad dva skupa
ВишеDijagrami sekvenci
Dijagrami sekvenci Izrada dijagrama sekvenci Dijagram sekvenci koristi se za specifikaciju vremenskih zahteva u opisu složenih scenarija opis toka poruka između objekata kojima se realizuje odgovarajuća
ВишеУвод у организацију и архитектуру рачунара 1
Увод у организацију и архитектуру рачунара 2 Александар Картељ kartelj@matf.bg.ac.rs Напомена: садржај ових слајдова је преузет од проф. Саше Малкова Увод у организацију и архитектуру рачунара 2 1 Секвенцијалне
ВишеMicrosoft Word - Java_introduction_NEW_SYLLABUS.doc
[Complete introduction into Java programming language] Syllabus Semestar, Godina Informacije o instruktoru Instruktor(i) Email Lokacija i dostupnost 1. Ime, prezime 2. Emir, Puška E-mail adresa emirpuska1988@gmail.com
ВишеPOSLOVNI INFORMACIONI SISTEMI I RA^UNARSKE
ZNAČAJ RAČUNARSKIH KOMUNIKACIJA U BANKARSKOM POSLOVANJU RAČUNARSKE MREŽE Računarske mreže su nastale kombinacijom računara i telekomunikacija dve tehnologije sa veoma različitom tradicijom i istorijom.
ВишеPHP proširenja za rad sa bazama podataka Postoje pojedinačna proširenja za različite tipove baza podataka sa svojim bibliotekama funkcija npr. postoji
PHP proširenja za rad sa bazama podataka Postoje pojedinačna proširenja za različite tipove baza podataka sa svojim bibliotekama funkcija npr. postoji podrška za IBM DB2, Oracle, Ingres, MySQL, PostgreSQL,
ВишеUvod u računarstvo 2+2
Ulaz i izlaz podataka Ulaz i izlaz podataka Nakon odslušanog bit ćete u stanju: navesti sintaksu naredbi za unos/ispis znakova znakovnih nizova cijelih brojeva realnih brojeva jednostruke i dvostruke preciznosti
ВишеRačunarski praktikum I - Vježbe 01 - Uvod
Prirodoslovno-matematički fakultet Matematički odsjek Sveučilište u Zagrebu RAČUNARSKI PRAKTIKUM I Vježbe 01 - Uvod v2018/2019. Sastavio: Zvonimir Bujanović Gradivo i način polaganja Gradivo: osnove jezika
ВишеP9.1 Dodela resursa, Bojenje grafa
Фаза доделе ресурса Ова фаза се у литератури назива и фазом доделе регистара, при чему се под регистрима подразумева скуп ресурса истог типа. Додела регистара променљивама из графа сметњи се обавља тзв.
ВишеDržavna matura iz informatike
DRŽAVNA MATURA IZ INFORMATIKE U ŠK. GOD. 2013./14. 2016./17. SADRŽAJ Osnovne informacije o ispitu iz informatike Područja ispitivanja Pragovi prolaznosti u 2014./15. Primjeri zadataka po područjima ispitivanja
ВишеVEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstr
VEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstrirana upotreba konstruktora, svojstava, metoda klase,
ВишеP1.1 Analiza efikasnosti algoritama 1
Analiza efikasnosti algoritama I Asimptotske notacije Master metoda (teorema) 1 Asimptotske notacije (1/2) Služe za opis vremena izvršenja algoritma T(n) gde je n N veličina ulaznih podataka npr. br. elemenata
ВишеPuTTY CERT.hr-PUBDOC
PuTTY CERT.hr-PUBDOC-2018-12-371 Sadržaj 1 UVOD... 3 2 INSTALACIJA ALATA PUTTY... 4 3 KORIŠTENJE ALATA PUTTY... 7 3.1 POVEZIVANJE S UDALJENIM RAČUNALOM... 7 3.2 POHRANA PROFILA KORISNIČKIH SJEDNICA...
ВишеMrežno računarstvo
MREŽNO RAČUNARSTVO Soketi za servere (iz glave 9,10 u 4. izdanju) 1 Soketi za servere klijenti programi koji otvaraju soket do servera koji osluškuje konekcije klijentski soketi nisu dovoljni klijenti
ВишеWeb orijentirana rješenja u turizmu
TESTIRANJE KONKURENTNIH TRANSAKCIJA Zlatko Sirotić, univ.spec.inf. d.o.o. Pula Stranica 1 Neki izabrani (stručni) radovi - HrOUG 2015a: Povratak u Prolog (ili Mrav i med na valjku) - HrOUG 2015b: Kada
Више06 Poverljivost simetricnih algoritama1
ЗАШТИТА ПОДАТАКА Симетрични алгоритми заштите поверљивост симетричних алгоритама Преглед биће објашњено: коришћење симетричних алгоритама заштите како би се заштитила поверљивост потреба за добрим системом
ВишеQlikView Training
QlikView Napredni Poslovni Sustavi d.o.o. Svjetlana Čubek Neven Kranjčec 7. 8. svibanj 2014 Sadržaj Što je QlikView? QlikView značajke Što čini QlikView jedinstvenim? Tipični korisnici QlikView alata Prezentacija
Више8 2 upiti_izvjesca.indd
1 2. Baze podataka Upiti i izvješća baze podataka Na početku cjeline o bazama podataka napravili ste plošnu bazu podataka o natjecanjima učenika. Sada ćete izraditi relacijsku bazu u Accessu o učenicima
Више3.Kontrlne (upravlja~ke) strukture u Javi
Објектно орјентисано програмирање Владимир Филиповић vladaf@matf.bg.ac.rs Александар Картељ kartelj@matf.bg.ac.rs Низови у програмском језику Јава Владимир Филиповић vladaf@matf.bg.ac.rs Александар Картељ
ВишеFunkcijska sučelja: često korištena za modeliranje objekata koji obavljaju određene poslove Anotirana su signaliziraju da se t
Funkcijska sučelja: često korištena za modeliranje objekata koji obavljaju određene poslove Anotirana su s @FunctionalInterface; signaliziraju da se ta sučelja mogu koristiti za stvaranje objekata u lambda-izrazima
ВишеWAMSTER Prezentacija
WAMSTER Mi smo Studio Elektronike Rijeka d.o.o. tvrtka za razvoj tehnoloških rješenja u automatici i elektronici tvrka osnovana 2006. na temelju komercijalizacije rezultata magistarskog rada locirani u
ВишеSveučilište u Zagrebu
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA RAČUNALNA FORENZIKA SEMINAR VoIP enkripcija Ivan Laznibat Zagreb, siječanj, 2017. Sadržaj 1. Uvod... 1 2. VoIP enkripcija... 3 2.1 PKI (eng.
ВишеSadržaj 1 Diskretan slučajan vektor Definicija slučajnog vektora Diskretan slučajan vektor
Sadržaj Diskretan slučajan vektor Definicija slučajnog vektora 2 Diskretan slučajan vektor Funkcija distribucije slučajnog vektora 2 4 Nezavisnost slučajnih vektora 2 5 Očekivanje slučajnog vektora 6 Kovarijanca
ВишеMicrosoft Word - 15ms261
Zadatak 6 (Mirko, elektrotehnička škola) Rješenje 6 Odredite sup S, inf S, ma S i min S u skupu R ako je S = { R } a b = a a b + b a b, c < 0 a c b c. ( ), : 5. Skratiti razlomak znači brojnik i nazivnik
Више2015_k2_z12.dvi
OBLIKOVANJE I ANALIZA ALGORITAMA 2. kolokvij 27. 1. 2016. Skice rješenja prva dva zadatka 1. (20) Zadano je n poslova. Svaki posao je zadan kao vremenski interval realnih brojeva, P i = [p i,k i ],zai
ВишеОрт колоквијум
Испит из Основа рачунарске технике - / (6.6.. Р е ш е њ е Задатак Комбинациона мрежа има пет улаза, по два за број освојених сетова тенисера и један сигнал који одлучује ко је бољи уколико је резултат
Више070-ALIP2-udzbenik.indb
0. U uvodnom ćemo poglavlju ponoviti osnove programskog jezika C s kojima smo se susreli u. razredu. U kratkom pregledu navedeni su operatori (aritmetički, relacijski i logički), neke od funkcija iz biblioteka
ВишеDocument ID / Revision : 0419/1.1 ID Issuer Sustav (sustav izdavatelja identifikacijskih oznaka) Upute za registraciju gospodarskih subjekata
ID Issuer Sustav (sustav izdavatelja identifikacijskih oznaka) Upute za registraciju gospodarskih subjekata Gospodarski subjekti Definicija: U skladu s Direktivom 2014/40/EU gospodarski subjekt svaka
ВишеPROMENLJIVE, TIPOVI PROMENLJIVIH
PROMENLJIVE, TIPOVI PROMENLJIVIH Šta je promenljiva? To je objekat jezika koji ima ime i kome se mogu dodeljivati vrednosti. Svakoj promenljivoj se dodeljuje registar (memorijska lokacija) operativne memorije
ВишеAlgoritmi i arhitekture DSP I
Univerzitet u Novom Sadu Fakultet Tehničkih Nauka Katedra za računarsku tehniku i međuračunarske komunikacije Algoritmi i arhitekture DSP I INTERNA ORGANIACIJA DIGITALNOG PROCESORA A OBRADU SIGNALA INTERNA
ВишеКласе комбинација презентације (Хортона) и к о бајаги скрипте (Ово је прича коју врло радо причам) нови тип података: дефинишу могуће вредности подата
Класе комбинација презентације (Хортона) и к о бајаги скрипте (Ово је прича коју врло радо причам) нови тип података: дефинишу могуће вредности података и операције над њима Дефиниција класе садржи само
ВишеDržavno natjecanje / Osnove informatike Srednje škole Zadaci U sljedećim pitanjima na odgovore odgovaraš upisivanjem slova koji se nalazi ispred
Zadaci. 8. U sljedećim pitanjima na odgovore odgovaraš upisivanjem slova koji se nalazi ispred točnog odgovora, u za to predviđen prostor. Odgovor Ako želimo stvoriti i pohraniti sliku, ali tako da promjenom
ВишеRecuva CERT.hr-PUBDOC
Recuva CERT.hr-PUBDOC-2019-5-379 Sadržaj 1 UVOD... 3 2 INSTALACIJA ALATA RECUVA... 4 3 KORIŠTENJE ALATA RECUVA... 7 4 ZAKLJUČAK... 13 Ovaj dokument izradio je Laboratorij za sustave i signale Zavoda za
ВишеProgramski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk
Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijski program: Informacioni inženjering Informacioni inženjering 1 Rekurzivne funkcije Binarna stabla Informacioni
ВишеMicrosoft PowerPoint - JavaP9_2019
Programski jezik JAVA PREDAVANJE 9 2019 www.etf.ac.me Datoteke u Javi U paketu java.io nalaze se klase za rad sa datotekama i direktorijumima. Funkcionalnost koju omogućavaju te klase sastoji se od kreiranja,
ВишеPowerPoint Presentation
Visoka škola strukovnih studija za informacione i komunikacione tehnologije MVC - Modeli Školska 2017/18. Dr Nenad Kojić, dipl. inž. Luka Lukić, struk. inž. Danijela Nikitin, spec.stuk.inž MVC.htaccess
Више