Konkurentné programovanie

Podobné dokumenty
Konkurentné programovanie

PowerPoint Presentation

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

História

DediĊnosť

enum

Identity Lifecycle Management

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

midterm2014_1

Objektovo orientované programovanie

Identity Lifecycle Management

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

PowerPoint Presentation

Výnimky

midterm2019

Microsoft PowerPoint - OOP_prednaska_10.pptx

Identity Lifecycle Management

PDS01

Tomáš Jelínek - včely vyhľadávanie

0022-vub-mobilne-tokeny-200x200-v03.indd

Identity Lifecycle Management

PowerPoint Presentation

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Katalóg služieb OTPdirekt-retail

Matej Kendera - PDF, word, lucene, java

PowerPoint Presentation

Microsoft Word - Priloha_1.docx

Úvod do mobilného operačného systému ANDROID

Privátna zóna pre prevádzku Obsah Privátna zóna pre prevádzku 1 Obsah 1 Webová stránka 2 Úvodná stránka 2 Registrácia prevádzka/penzión

PowerPoint Presentation

2

Úvodná prednáška z RaL

Konfigur[PleaseinsertPrerenderUnicode{á}intopreamble]cia dynamick[PleaseinsertPrerenderUnicode{é}intopreamble]ho smerovania na routroch Cisco - Seme

User:Andrej Sedlacek

Súťaž Vráťme knihy do škôl je tu už po 8-krát! O súťaži Občianske združenie Učenie s úsmevom v spolupráci s partnermi internetové kníhkupectvo abcknih

NSK Karta PDF

ECDL Syllabus V50 SK-V01

MO_pred1

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

PowerPoint Presentation

Microsoft Word - a13_45.SK.doc

Spustenie skonvertovanej C-Image zálohy v MS Virtual PC

Strana 1 / 6 Stav účtu Názov a sídlo účastníka: Obecný úrad Diviacka Nová Ves Diviacka Nová Ves Diviacka Nová Ves IČO: Adresa platiteľ

2 RIEŠENIE PROBLÉMOV

Microsoft PowerPoint - Prog_p08.ppt

Prezentácia programu PowerPoint

Univerzita Komenského v Bratislave Fakulta matematiky, fyziky a informatiky Ročníkový projekt (1) Herňa Študijný odbor: Aplikovaná informatika Autor :

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ 4. POKYNY PRE ADMINISTRÁTORA ELEKTRONICKÉHO TESTOVANIA ELEKTRO

NSK Karta PDF

The Mind Staňme sa jednotným celkom! Wolfgang Warsch Hráči: 2-4 osôb Vek: od 8 rokov Trvanie: cca 15 minút Všetci hráči tvoria jeden tím. V prvom kole

eKasa

Návod na vytvorenie kvalifikovaného elektronického podpisu prostredníctvom občianskeho preukazu s čipom Dátum zverejnenia: Verzia: 1 Dátu

Počítačové siete DOCSIS

Relačné a logické bázy dát

Oceňovanie amerických opcií p. 1/17 Oceňovanie amerických opcií Beáta Stehlíková Finančné deriváty, FMFI UK Bratislava

iot business hub whitepaper isdd_em_New.pdf

Vykonávací predpis dekana FEI STU

C(2019)2082/F1 - SK

Import absencí z ASC

Snímka 1

Používateľská príručka POUŽÍVATEĽSKÁ PRÍRUČKA Generátor XML dávok pre Informačný systém kontrolných známok z MS Excel šablóny Dátum: Verzia

Balíčkovanie FreeSWITCH-u pre Debian Autor: Zdenko Holeša, InžProjekt 1, KIS FRI ŽU Predkompilované balíčky Predkompilované balíčky existujú pre Debia

Pracovný postup pre vypĺňanie údajov elektronického formulára IŠIS pre spravodajskú jednotku 1

NARIADENIE EURÓPSKEHO PARLAMENTU A RADY (EÚ) 2019/ zo 17. apríla 2019, - ktorým sa mení nariadenie (EÚ) č. 952/ 2013 s cieľom

ALBATROS_MEDIA

Microsoft Word - mnohouholnik.doc

Aktualizácia č. 1 Usmernenia č. 3/2013 operačný program Vzdelávanie Názov: Usmernenie pre Prijímateľov vo veci periodicity predkladania plánov a harmo

Katalóg cieľových požiadaviek k maturitnej skúške

Zdravé sebavedomie odzrkadľuje spôsob, akým vidíme sami seba. Ak sa chceme stať sebavedomejšími ľuďmi, musíme zmeniť to, čo si myslíme sami o sebe, ak

Microsoft Word - popis.docx

ŤAHÁK PRAKTICKÁ ČASŤ Prerekvizity: LINUX: WINDOWS: Inštalácia Oracle VirtualBoxu a vytvorenie virtuálneho stroja /návod nižšie/ Operačný system Window

Manuál uchádzača ezakazky Manuál uchádzača Dátum vytvorenia dokumentu: Verzia: Autori slovenský Matej Marcin, Stanislava Marošiová Te

10 tipov pre tvoj forex úspech

Microsoft PowerPoint - G_5_1_1_IEEC_2013_IWD_e_EASY_SK.pptx

Používateľská príručka elektronických služieb pre žiadateľov o štatistické informácie október 2016

{LINGO} Špecifikácia výrobku: - Rozmery: 61x18x8mm - hmotnosť: 8,6 g - dosah príjmu signálu: 10m -kapacita a typ batérie: 90mAh, lítium-polymérová bat

OPIdS - finančné riadenie

4:00-4:30 min/km FIT NA JESEŇ Tréningový plán pre rýchle bežkyne 4:30-5:00 min/km Vitaj, poď s nami trénovať podľa plánu! Cieľom jesenného tréningu je

CDT

Gymnázium, Konštantínova 1751/64, Stropkov K r i t é r i á prijímacieho konania do 1. ročníka štvorročného študijného odboru 7902 J gymnázium p

Dotazník spokojnosti zákazníka s produktmi a službami ŠÚ SR

Microsoft Word - Novinky_2012_2.doc

2

Inštalácia

Slovenská technická univerzita v Bratislave Fakulta informatiky a informačných technológií Zápisnica zo stretnutia #4 Tím sixpack Bc. Jozef Blažíček B

aplikácia do mobilého telefónu na stiahnutie digitálneho tachografu

Prevádzka

velryby2_pravidla_FINAL_SK-tisk.indd

Spustenie založenej VM mimo vmware ESX

INTERNET BANKING Ako zrealizovať hromadný prevod VŠETKO, ČO JE MOŽNÉ with.vub.sk, Bank of

7/1/2015 Úvod do databáz, skúškový test, max 25 bodov, 90 min

NSK Karta PDF

Architektúra OS

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

Je super, keď si môžem urobiť každý deň radosť Aplikácia Orange výhody Urobte si radosť každý deň, veď je to jednoduché. Stačí si stiahnuť bezplatnú a

UpRekrea manuál

PowerPoint Presentation

Prepis:

KONKURENTNÉ PROGRAMOVANIE 6. cvičenie: Exekútory

java.util.concurrent Konkurentné kolekcie ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet Rady, dvojsmerné rady (zásobník a rad v jednom) Implementácie BlockingQueue, BlockingDeque LinkedBlockingQueue, ArrayBlockingQueue, SynchronousQueue, PriorityBlockingQueue, DelayQueue, LinkedTransferQueue, LinkedBlockingDeque Synchronizéry Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger Exekútory

Spúšťanie úloh vo vlákne Úloha implementácia interfejsu Runnable public interface Runnable { void run(); } Vlákno samostatný vykonávateľ jednej úlohy Runnable úloha = new MojaÚloha(); Thread thread = new Thread(úloha); Thread.start(); spustenie úlohy, t.j. metódy run() v samostatnom vlákne

Exekútory Implementácie interfejsu Executor public interface Executor { void execute(runnable command); } Vykonávateľ jednej alebo viac úloh Každá z úloh bude vykonaná v samostatnom vlákne Executor exekútor = new MôjExekútor(); Runnable úloha1 = new MojaÚloha1(); exekútor.execute(úloha1); Runnable úloha2 = new MojaÚloha2(); exekútor.execute(úloha2);

Exekútor je správca vlákien a úloh Každý exekútor má vlastnú politiku správy vlákien a úloh kedy vlákna vyrobiť koľko vlákien vyrobiť čo spraviť, ak nejaké vlákno skončí s výnimkou/chybou v ktorom vlákne bude úloha vykonaná koľko úloh sa môže vykonávať súčasne koľko úloh môže čakať na vykonanie čo sa má urobiť pred alebo po vykonaní úlohy Interne ide vždy o nejakú spravovanú množinu vlákien (thread pool), ktorým sú prideľované úlohy odoslané exekútoru Vlákna vo vnútri sú typicky znovupoužívané na nové úlohy a.k.a. Workery

ExecutorService Priame implementácie interfejsu Executor v Jave nie sú ExecutorService Rozšírenie interfejsu Executor o ďalšie metódy na pohodlnejšiu prácu s úlohami ukončenie vykonávania úloh shutdown(), shutdownnow() zistenie či začal shutdown - isshutdown() zistenie či sa ukončil shutdown - isterminated() čakanie na dobehnutie úloh po shutdowne - awaittermination(timeout, unit) ďalšie metódy na spúštanie úloh submit, invokeall, invokeany

Implementácie Exekútorov Vytvárajú sa cez statické metódy triedy Executors: newfixedthreadpool(int počet) premenná počet určuje maximálny počet vlákien ak niektoré vlákna zomrú nahradia sa novými newcachedthreadpool() každej úlohe hneď pridelí vlákno, ak nemá žiadne v zásobe, vyrobí hneď nové newsinglethreadpool() exekútor s jediným aktívnym vláknom newscheduledthreadpool() dokáže odložiť začiatok behu úlohy, prípadne opakovať úlohu viac krát náhrada triedy Timer od Javy 5

Nekonečný pool vlákien Legenda: Viac vlákien = lepšia priepustnosť Viaceré úlohy robím súčasne, každý je vybavený hneď Nekonečnosť je ale nebezpečná Náročnosť obsluhy prepínania vlákien rastie Každé vlákno má pamäťové nároky Operačný systém aj JVM zvyčajne obmedzuje počet vlákien pre jeden proces Java skončí s chybou projekt kľakne Testovanie zvyčajne bez problémov, v reálnej prevádzke (s veľa používateľmi) môžeme naraziť na limity

Konečný pool vlákien newfixedthreadpool(počet) je často najlepšia voľba, kde počet je blízko počtu jadier procesora int jadier = Runtime.getRuntime().availableProcessors(); Ak je úloh viac ako počet, ďalšie úlohy čakajú v rade, pokiaľ nejaká počítaná úloha neskončí producers consumers prijímanie úloh spracovanie úloh poolom vlákien Úloha môže skončiť korektne vlákno dostane novú úlohu z čakajúcich Úloha môže zhodiť vlákno napr. výnimkou exekútor vyrobí nové vlákno do poolu a pridelí mu novú úlohu z čakajúcich úloh

Dva typy úloh Runnable = úloha bez návratovej hodnoty public interface Runnable { void run(); } Callable(T) = úloha s návratovou hodnotou typu T public interface Callable<T> { T call() throws Exception; } Callable úlohu viem vyrobiť z Runnable, ak treba call() po dobehnutí vracia null Callable<Object> callableúloha = Executors.callable(runnableÚloha);

Posielanie úloh do ExecutorService execute(runnable úloha) O aktuálnom stave vykonávania úlohy neviem nič možné stavy: čakajúca na vykonanie, vykonávaná, skončená úspešne, skončená s výnimkou Zaslanú úlohu neviem ukončiť ak chcem, iba ak ukončím celý exekútor aj s ostatnými úlohami submit(runnable úloha), submit(callable úloha) Metóda vráti budúci výsledok úlohy zabalený v inštancii typu Future cez ktorú: viem zistiť stav úlohy a aj úlohu ukončiť, po skončení úlohy viem získať výsledok úlohy alebo výnimku, ak ju úloha vyhodila

Callable a Future Implementáciou Callable<T> vyrobíme úlohu, ktorej metóda call() vracia typ T public interface Callable<T> { T call() throws Exception; } public class Faktoriál implements Callable<Long> { private long n; public Faktoriál(long n) {this.n = n} } Long call() throws NumberTooBigException { return n * fakt(n-1); }

Callable a Future Pošleme úlohu do exekútora cez metódu submit() Návratová hodnota metódy submit() je typu Future Obalený budúci výsledok metódy call() private ExecutorService exekútor; Pošlem úlohu do exekútora, ktorý ju spustí vo vlákne. Callable úloha = new Faktoriál(x); Future<Long> budúcivýsledok = exekútor.submit(úloha); // tu robím zatiaľ čokoľvek, alebo nič Long výsledok = budúcivýsledok.get(); Blokovaná operácia. Spím, kým sa výsledok nevypočíta v niektorom z vlákien exekútora.

Future<V> Cez objekt typu Future Viem počkať, kým úloha skončí a zobrať výsledok get() Ak úloha skončí s výnimkou alebo chybou, vyhodí ju zabalenú v ExecutionException Viem zistiť, či už úloha skončila isdone() Viem úlohu zrušiť cancel(boolean prerušiťvlákno) Ak sa úloha ešte nezačala vykonávať, tak sa ani nevykoná Ak sa začala vykonávať a prerušiťvlákno je false, úloha sa nechá dobehnúť Ak sa začala vykonávať a prerušiťvlákno je true, pokúsi sa prerušiť beh vlákna, v ktorom úloha beží Viem zistiť, či úlohu niekto zrušil iscancelled()

Zadanie 1 Stiahnite si z GitHubu poslednú verziu: https://github.com/petergursky/kopr2016 Nasledovný balíček: sk.ics.upjs.kopr2016.cviko06.zadanie Je to program, ktorý sčíta veľkosti súborov v podstromoch podadresárov daného adresára Analýzu každého podstromu vykonajte ako samostatnú Callable úlohu cez exekútor

Hromadné posielanie úloh do ExecutorService List<Future<T>> invokeall(collection<callable<t>> úlohy) Pošlem do exekútora kolekciu úloh typu Callable<T> Exekútor ich postupne pospúšťa v samostatných vláknach Táto metóda blokuje volajúce vlákno, pokiaľ všetky úlohy v kolekcii neskončia T invokeany(collection<callable<t>> úlohy) Táto metóda blokuje volajúce vlákno, pokiaľ niektorá úloha neskončí úspešne (bez vyhodenia výnimky) Vráti výsledok tejto úlohy Ostatné úlohy zruší

CompletionService Umožňuje niečo medzi invokeall() a invokeany() Chcem všetky riešenia úloh, ale nechcem čakať kým všetky skončia Vyhodnocujem riešenie hneď, ako niektorá úloha skončí a počkám na výsledok ďalšej úlohy

CompletionService Návratový typ Callable úloh ExecutorService exekútor = Executors.newFixedThreadPool(4); CompletionService<Long> completionservice = new ExecutorCompletionService<Long>(exekútor); for (int i = 0; i < 50; i++) completionservice.submit(new Faktorial(i)); // úlohy sa postupne vykonávajú Naposielam 50 Callable úloh for (int i = 0; i < 50; i++) { Future<Long> buducifaktorial = completionservice.take(); Long faktorial = buducifaktorial.get(); System.out.println( jeden z faktoriálov je + faktorial); } Blokovane čakám na ľubovoľné vlákno kým neskončí

Zadania 2, 3 a 4 Modifikujte riešenie zadania 1 tak, že 2. Využite metódu invokeall() 3. Využite CompletionService 4. Navrhnite riešenie cez exekútor, pri ktorom sa využijú všetky jadrá procesora rovnomerne bez ohľadu na hĺbku adresárov Vieme tieto úlohy spraviť iba s toľkými vláknami, ako je jadier? Porovnajte tieto prístupy aj s riešením zadania 1

Exekútor ForkJoinPool (od Javy 7) Špeciálny exekútor pre rekurzívne úlohy Využíva návrhový vzor work stealing pre daný počet vlákien Akceptuje špeciálne typy úloh (potomkovia ForkJoinTask) RecursiveTask<T> - úloha s návratovou hodnotou RecursiveAction úloha bez návratovej hodnoty Rekurzívna úloha vyrába nové rekurzívne úlohy toho istého typu a posiela ich exekútoru Úloha typicky čaká na dobehnutie úloh, čo zavolala, aby zosumarizovala výsledky a mohla tiež skončiť Počas čakania je jej odňaté vlákno pre iné úlohy, ktoré majú čo robiť

Exekútor ForkJoinPool Vytváranie cez konštruktor (defaultne toľko vlákien ako jadier) ForkJoinPool forkjoinpool = new ForkJoinPool(); Alternatívne, ak chceme iba jeden pool, použijeme zdieľaný: ForkJoinPool forkjoinpool = ForkJoinPool.commonPool(); Zaslanie úlohy do exekútora Bez čakania na výsledok execute(úloha) S čakaním na ukončenie úlohy invoke(úloha) Zaslanie úlohy s neskorším počkaním na ukončenie úlohy submit(úloha) Neskoršie počkanie na dokončenie úlohy po volaní submit(úloha) T výsledok = úloha.join(), ak úloha je RecursiveTask<T> úloha.join(), ak úloha je RecursiveAction

RecursiveTask pre ForkJoinPool Prekrývame metódu compute() public class MyTask extends RecursiveTask<MyResult> { public MyResult compute() { //výpočet úlohy MyTask podúloha1 = new MyTask(...); podúloha1.fork(); // odošlem podúlohu exekútoru MyTask podúloha2 = new MyTask(...); podúloha2.fork(); // odošlem podúlohu exekútoru MyResult result1 = podúloha1.join(); // čakám na výsledok podúlohy1 // vlákno mi je odňaté, kým nepríde výsledok MyResult result2 = podúloha2.join(); // čakám na výsledok podúlohy2 // vlákno mi je odňaté, kým nepríde výsledok return createresult(result1,result2); }

RecursiveTask pre ForkJoinPool Dedí od abstraktnej ForkJoinTask Implementuje Future, takže s ním vieme administrovať aj monitorovať úlohu Vieme ho vyrobiť aj z Callable a Runnable úloh ForkJoinTask fjtúloha = ForkJoinTask.adapt(úloha) Vieme spustiť veľa úloh a čakať na nich cez invokeall()... kopa ďalších vychytávok

Zasielanie úloh do ForkJoinPool-u Bez čakania na výsledok S čakaním na výsledok S neskorším čakaním na výsledok pomocou forkjointask.join() Z extrerného kódu Z úlohy vo vnútri execute(forkjointask) forkjointask.fork() invoke(forkjointask) forkjointask.invoke() submit(forkjointask) forkjointask.fork()

Zadanie 5 Modifikujte riešenie predošlých zadaní tak, že využijete exekútor ForkJoinPool a úlohu typu RecursiveTask