1. Zpracování událostí na pozadí aplikace Ing. Michal Bližňák, Ph.D. Ústav informatiky a umělé inteligence Fakulta aplikované informatiky UTB Zĺın Paralelní procesy a programování, Zĺın, 3. února 2014 1 / 27
Dříve než začneme Osnova kurzu Motivace Obecné informace o kurzu 2 / 27
Podmínky pro udělení zápočtu Dříve než začneme Osnova kurzu Motivace 1 80 % docházka na cvičení 2 Dosažení alespoň 55 bodů ze 100 možných. Body budou přidělovány za: 6 x 0-10 b. za úkol zadaný na cvičeních (různé bodové hodnocení) 2 x 0-25 b. za půlsemestrální práci 1 x 0-15 b. za bonusový úkol 3 Výsledné hodnocení: 0-54 b. : F - nedostatečně 55-63 b. : E - dostatečně 72-64 b. : D - uspokojivě 81-73 b. : C - dobře 90-82 b.: B - velmi dobře 100-91 b.: A - výborně 3 / 27
Doporučená literatura Dříve než začneme Osnova kurzu Motivace Tvrdík, P.: Paralelní systémy a algoritmy, skripta ČVÚT, 2005 Bližňák, M.: Systémové programování, skripta UTB, 2005 Quinn M. J.: Parallel Programming in C with MPI and OpenMP, McGraw-Hill, 2003, ISBN 007-123265-6 Parhami, B.: Introduction to Parallel Processing Algorithms and Architectures, Kluwer Academic Publisher, 2002 Miller, R., Stout, Q. F.: Parallel Algorithms for Regular Architectures Meshes and Pyramids, MIT Press, 1996 http://www.top500.org (aktuální seznam 500 nejvýkonějších paralelních počítačů) 4 / 27
Organizace kurzu Dříve než začneme Osnova kurzu Motivace Přednášky Řízení procesů, vláken a práce na pozadí aplikace Teorie paralelních algoritmů a masivně paralelních výpočetních systémů Paralelní algoritmy a nástroje pro paralelizaci aplikací a algoritmů Cvičení Zpracování úloh na pozadí aplikací, vyžití časovačů (wxwidgets) Správa procesů a podprocesů pomocí (wxwidgets) Tvorba a synchronizace vláken v aplikacích (wxwidgets) Využití knihovny OpenMP pro paralelizaci aplikací (OpenMP) Implementace některých paralelních algoritmů (OpenMP) 5 / 27
Dříve než začneme Osnova kurzu Motivace Řízení procesů, podprocesů a práce na pozadí aplikace Zpracování úloh na pozadí aplikace, časovače (wxwidgets). Procesy, podprocesy, vlákna a jejich synchronizace (wxwidgets). 6 / 27
Dříve než začneme Osnova kurzu Motivace Teorie paralelních algoritmů a masivně paralelních systémů Úvod do paralelismu, příklady paralelních algoritmů. Analýza a hodnocení složitosti paralelních algoritmů. Vlastnosti paralelních a distribuovaných architektur, abstraktní modely paralelismu, PRAM. Vlastnosti a topologie propojovacích sítí. Vnořování a simulace propojovacích sítí. Směrovací algoritmy. 7 / 27
Dříve než začneme Osnova kurzu Motivace Paralelní algoritmy a nástroje pro paralelizaci SW aplikací Knihovna OpenMP a její využití (C/C++). Paralelní redukce, sumy prefixů a jejich aplikace (C/C++, OpenMP). 8 / 27
Dříve než začneme Osnova kurzu Motivace Proč programovat paralelní aplikace Pravidlo č. 1 Jde-li něco naprogramovat jako sekvenční jednovláknovou aplikaci, udělejte to! Proč? Nebudete muset řešit těžko laditelné problémy typu zablokování souběh 9 / 27
Dříve než začneme Osnova kurzu Motivace Proč tedy používat paralelní procesy a vlákna? Zpracování více neblokujících operací v jednom okamžiku Zajištění zpracování asynchronních událostí Zrychlení a optimalizace výpočtů a zvýšení datové propustnosti 10 / 27
Pseudoparalelní zpracování událostí na pozadí aplikace 11 / 27
Techniky pro implementaci pseudoparalelního 1 zpracování úloh na pozadí aplikace: Událost nečinnosti aplikace IDLE Systémové/softwarové časovače 1 Zpracování úlohy probíhá v rámci stejné plánovací jednotky (procesu nebo vlákna) jako zpracování volající funkce. 12 / 27
13 / 27
Doba nečinnosti aplikace Téměř každá aplikace se po většinu času nachází ve stavu nečinnosti IDLE time Aplikace nezpracovává požadavky uživatele nebo operačního systému Je možné zařídit, aby se v době nečinnosti aplikace vykonával uživatelský kód Jednorázově Periodicky 14 / 27
Implementace ve wxwidgets wxwidgets generují v době nečinnosti událost wxevt IDLE Přechod do stavu nečinnosti je indikován vyprázdněním fronty zpráv. Pomocí tabulky událostí můžeme na tuto událost mapovat jakoukoliv obslužnou rutinu. Událost může být generována Jednorázově Periodicky (vynuceně) 15 / 27
Vynucené generování události wxevt IDLE Třída události wxidleevent obsahuje funkce pro vynucené opakování události wxevt IDLE: Vynuceně lze generovat událost IDLE pomocí funkce void wxidleevent::requestmore(bool needmore = TRUE) Zjistit, zda byla aktuální událost IDLE vynuce lze pomocí funkce bool wxidleevent::morerequested() 16 / 27
Použití události wxevt IDLE Listing 1: Obsluha události IDLE v hlavním okně c l a s s I d l e F r a m e : p u b l i c wxframe { p r o t e c t e d : //... void O n I d l e ( w x I d l e E v e n t &e v t ) ; } ; I d l e F r a m e : : I d l e F r a m e ( ) : wxframe ( NULL, wxid ANY, wxt( I d l e Test ) ) { //... Bind ( wxevt IDLE, &I d l e F r a m e : : OnIdle, t h i s ) ; } void I d l e F r a m e : : O n I d l e ( w x I d l e E v e n t& e v t ) { // neco d e l e j... } 17 / 27
Systémové/softwarové časovače 18 / 27
Základní vlastnosti časovačů Operační systémy obvykle obsahují několik typů časovačů. Čím přesnější časování, tím větší nároky na systémové prostředky a provázanost s HW. Časovače, jejichž funkcionalitu zajišt uje přímo OS se nazývají systémové, nebo softwarové časovače. Přesnost časovačů bývá v rozmezí od 1 ms do 1 s. Například systémové časovače ve Windows mají maximální přesnost 10 až 55ms, multimediální časovače až 1ms. 19 / 27
Implementace ve wxwidgets Základní třída časovače je wxtimer. Třídu lze použít jak v konzolových, tak i GUI aplikacích. Třídu wxtimer lze použít dvěma způsoby: odvodit novou třídu od třídy wxtimer a přetížit její virtuální funkci wxtimer::notify(), která je volána s každým tikem časovače, přesměrovat periodicky generované události časovače 2 na libovolný správce události (event handler) a namapovat na ně vlastní obslužné rutiny. 2 Tyto události jsou generovány výchozí implementací virtuální funkce wxtimer::notify(). 20 / 27
Odvození nové třídy časovače 1 Vytvoříme novou třídu odvozenou od třídy wxtimer. 2 Přetížíme virtuální funkci void wxtimer::notify() volanou s každým tikem časovače a v ní implementujeme požadovanou perioidickou činnost. 3 Instanci odvozené třídy lze vytvořit jak staticky na zásobníku, tak dynamicky na haldě. 21 / 27
Přesměrování periodicky generované události časovače 1 Vytvoříme obslužnou rutinu události wxevt TIMER zapouzdřenou třídou události wxtimerevent. 2 Určíme příjemce události: 3 v konstruktoru třídy wxtimer, voláním funkce void wxtimer::setowner(wxevthandler *owner, int id = wxid ANY). 3 Provážeme událost wxevt TIMER s obslužnou rutinou. 3 Na jednoho příjemce lze přesměrovat libovolné množství událostí časovače rozlišených pomocí celočíselného identifikátoru. 22 / 27
Spuštění a zastavení časovače Časovač spustíme voláním funkce bool wxtimer:: Start(int milliseconds = -1, bool oneshot = FALSE) při spuštění určíme periodu časovače, určíme, zda bude událost vygenerována jednorázově, nebo periodicky. Časovač zastavíme voláním funkce void wxtimer::stop(). 23 / 27
Použití časovače 1/3 #i n c l u d e <wx/ t i m e r. h> Listing 2: Definice vlastní třídy časovače // v l a s t n i t r i d a c a s o v a c e s v l a s t n i i m p l e m e n t a c i f c e N o t i f y ( ) c l a s s CustomTimer : p u b l i c wxtimer { p u b l i c : v i r t u a l void N o t i f y ( ) { w x P r i n t f ( Custom t i c k... \ n ) ; } } ; 24 / 27
Použití časovače 2/3 Listing 3: Definice třídy aplikace s instancemi časovačů #i n c l u d e <wx/wx. h> // h l a v n i t r i d a a p l i k a c e s i n s t a n c i s t a n d a r d n i h o // a v l a s t n i h o c a s o v a c e c l a s s TimerApp : p u b l i c wxapp { p u b l i c : v i r t u a l b o o l O n I n i t ( ) ; p r o t e c t e d : wxtimer m Timer ; CustomTimer m CustomTimer ; void OnTimer ( wxtimerevent &e v t ) { w x P r i n t f ( Standard t i c k... \ n ) ; } } ; 25 / 27
Použití časovače 3/3 Listing 4: Inicializace aplikace a časovačů // i n i c i a l i z a c e a p l i k a c e wximplement APP CONSOLE( TimerApp ) ; b o o l TimerApp : : O n I n i t ( ) { Bind ( wxevt TIMER, &TimerApp : : OnTimer, t h i s ) ; m Timer. SetOwner ( t h i s ) ; m Timer. S t a r t ( 1000 ) ; m CustomTimer. S t a r t ( 2000 ) ; } r e t u r n t r u e ; 26 / 27
Děkuji za pozornost A to je pro dnešek vše. Nastává čas pro vaše dotazy... 27 / 27