Vývoj aplikačních programů pro systémy DAQ Možnosti vývoje aplikačního SW Jazyk C/C++ Pokročilé techniky programování Vícevláknové aplikace

Podobné dokumenty
Virtuální přístroje. Operační systémy, vývoj aplikačních programů, speciální techniky programování

Virtuální přístroje. Použitá literatura. Operační systémy, vývoj aplikačních programů, speciální techniky programování

Procesy a vlákna (Processes and Threads)

Procesy a vlákna - synchronizace

Cvičení č. 6. Synchronizace ve Windows. 3 Body

Synchronizace vjj 1

Von Neumannovo schéma

Možnosti programování se sdílenými proměnnými. Týden 6 Programování se sdílenými proměnnými (Shared Variables, SV) Procesy a vlákna.

ÚVOD DO OPERAČNÍCH SYSTÉMŮ

Principy operačních systémů. Lekce 5: Multiprogramming a multitasking, vlákna

Management procesu I Mgr. Josef Horálek

Pavel Procházka. 3. prosince 2014

Paralelní programování

Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.

Operační systémy. Přednáška 4: Komunikace mezi procesy

Windows a real-time. Windows Embedded

Řada programovacích jazyků nabízí prostředky pro řešení meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce.

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Paralelní programování

Paralelní programování

Správa procesoru. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 11. březen, 2011

C++ a vnitřní svět. David Bednárek Jakub Yaghob Filip Zavoral

Správa procesoru. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška III. 7. listopad, / 23

Principy operačních systémů. Lekce 6: Synchronizace procesů

Operační systémy pro systémy sběru dat (=DAQ systems). Vývoj aplikačních programů. Operační systémy pro DAQ RTOS VxWorks Windows CE RTX LabVIEW RT

MS WINDOWS II. Jádro. Správa objektů. Správa procesů. Zabezpečení. Správa paměti

Architektura rodiny operačních systémů Windows NT Mgr. Josef Horálek

Cvičení č. 5. Programování ve Windows program stopky 3 Body

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Paralelní programování

Operační systémy. Přednáška 1: Úvod

vjj 1. Priority. Dispatcher

Přidělování CPU Mgr. Josef Horálek

Paralelní programování

Principy operačních systémů. Lekce 4: Správa procesů

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Real Time programování v LabView. Ing. Martin Bušek, Ph.D.

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

VÝUKOVÝ MATERIÁL. 3. ročník učebního oboru Elektrikář Přílohy. bez příloh. Identifikační údaje školy

Paralelní programování

Synchronizace Mgr. Josef Horálek

Činnost počítače po zapnutí

Základní datové struktury

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Principy počítačů a operačních systémů

Procesy a vlákna IPC Komunikace mezi procesy (IPC = Inter-Process Communication)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do Linuxu. SŠSI Tábor 1

Spuštění instalace. nastavení boot z cd v BIOSu vložení CD s instal. médiem spuštění PC. nastavení parametrů instalace (F2 čěština)

ČÁST 1. Základy 32bitového programování ve Windows

Přidělování paměti II Mgr. Josef Horálek

Ukázka zkouškové písemka OSY

Struktura programu v době běhu

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Využijte plný výkon procesorů s více jádry v LabVIEW 8.5

Služba ve Windows. Služba (service) je program

Ovladače pro Windows. Ovladače Windows A4M38KRP. Str. 1

Architektura a koncepce OS OS a HW (archos_hw) Architektura a koncepce OS Jádro OS (archos_kernel) Architektura a koncepce OS Typy OS (archos_typy)

C++ 0x aka C++11. Základním kamenem je třída std::thread

IUJCE 07/08 Přednáška č. 6

Základní principy konstrukce systémové sběrnice - shrnutí. Shrnout základní principy konstrukce a fungování systémových sběrnic.

Operační systém. Logické prostředky výpoč etního systému jsou:

PRINCIPY OPERAČNÍCH SYSTÉMŮ

Téma 3. Procesy a vlákna

Principy operačních systémů. Lekce 1: Úvod

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

PB002 Základy informačních technologií

TG Motion verze 4 Modul Virtuální PLC návod k obsluze

30. Vlákna, jejich atributy, metody, organizace a stavy. Možnosti synchronizace. (A7B36PVJ)

Přednáška 1. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Česká letecká servisní a. s.

PB153 Operační systémy a jejich rozhraní

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Stavba operačního systému

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Principy operačních systémů. Lekce 7: Obrana proti deadlocku

IPA - Lab.1 Úvod do programování v ASM

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Řízení IO přenosů DMA řadičem

Přidělování zdrojů (prostředků)

1. Zpracování událostí na pozadí aplikace

Operační systémy. Přednáška 2: Procesy a vlákna

Konzistentnost. Přednášky z distribuovaných systémů

Lineární datové struktury

Profilová část maturitní zkoušky 2017/2018

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/ Vzdělávání v informačních a komunikačních technologií

Vláknové programování část I

VISUAL BASIC. Přehled témat

Principy operačních systémů

Paralelní programování

09. Memory management. ZOS 2006, L.Pešička

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

LABORATORNÍ CVIČENÍ Střední průmyslová škola elektrotechnická

Pár odpovědí jsem nenašla nikde, a tak jsem je logicky odvodila, a nebo jsem ponechala odpověď z pefky, proto je možné, že někde bude chyba.

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

Transkript:

Vývoj aplikačních programů pro systémy DAQ Možnosti vývoje aplikačního SW Jazyk C/C++ Pokročilé techniky programování Vícevláknové aplikace A3B38PRT Přístrojová technika - přednáška 5

Jaké znalosti jsou nutné při vývoji aplikačních programů pro systémy DAQ? Znalost programování ve vybraném prostředí, ale také dokonalá znalost technických prostředků, počítačových prvků, přístrojů a měřicích modulů, sběrnic, síťových prvků, atd., znalost standardů zaměřených na programování měřicích systémů (např. IEEE488.2, SCPI, VISA, ) Viz 1. až 3. přednáška.

Vývojové prostředky Vývojové systémy na bázi textově orientovaných programovacích jazyků: LabWindows/CVI MS.NET (resp. Visual C/C++, Visual C#, Visual Basic) Vývojové systémy na bázi grafického programování: LabVIEW Agilent VEE Matlab/Simulink

Procesy a vlákna základní témata Procesy/vlákna Výhody a nevýhody použití vláken Jaké operační systémy podporují multithreading? Synchronizace vláken Techniky programování

Procesy Proces (process) - běžící program (= instance programu ). Proces vlastní: privátní adresový prostor systémové prostředky (soubory, dynamicky alokovanou paměť, synchronizační prostředky apod.) nejméně jedno vlákno

Vlákna Vlákno (thread) vzniká při inicializaci procesu (primární vlákno). Primární vlákno může vytvářet vlákna sekundární. Vlákna: sdílejí privátní adresový prostor procesu mohou přistupovat ke globálním proměnným a systémovým prostředkům procesu každé vlákno má vlastní zásobník a vlastní kontext

Multitasking Multiprocessing / multithreading [1] Stallings, W.: Operating Systems. 4 th Ed.Prentice Hall, New Jersey, 2001.

Multiprocessing / multithreading [1] Stallings, W.: Operating Systems. 4 th Ed.Prentice Hall, New Jersey, 2001.

Multitasking Stavy vlákna (procesu) ve víceúlohovém OS PŘIDĚLENÍ PROCESORU RUNNING READY ODEBRÁNÍ PROCESORU USPÁNÍ PROBUZENÍ WAITING (SLEEPING)

Výhody vláken Vícevláknový proces není blokován při zablokování jednoho z vláken (např. při čekání na událost) Paměť a systémové prostředky jsou sdíleny (na rozdíl od procesů), zvyšuje se efektivita jejich využití, zjednodušuje se přenos dat mezi vlákny (např. použití globálních proměnných ale POZOR na kritické sekce!!! v programu) Přepínání kontextu vláken je výrazně rychlejší než přepínání kontextu u procesů

Výhody vláken Efektivní provádění pomalých I/O operací (I/O operace se mohou překrývat s výpočetními operacemi) Výrazné zrychlení programu v případě multiprocesorové architektury (= počítačový systém obsahuje několik procesorů nebo vícejádrové procesory); vlákna běží skutečně paralelně (NE pseudoparalelně!!!) Lepší strukturování programu (Ale s rozumem!!! Nepřehánět počet vláken, zvyšuje časovou režii při přepínání kontextu)

Nevýhody vláken Obtížnější programování Nutnost synchronizace při přístupu ke sdíleným prostředkům (globálním proměnným, periferiím) Velmi obtížné až nereálné ladění programu

MULTITASKING / MULTITHREADING Programování vláken ve Win32 Vytvoření vlákna: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpthreadattributes, DWORD dwstacksize, LPTHREAD_START_ROUTINE lpstartaddress, LPVOID lpparameter, DWORD dwcreationflags, LPDWORD lpthreadid );

Programování vláken ve Win32 Ukončení vlákna: VOID ExitThread ( DWORD dwexitcode ); Ukončení z jiného vlákna: BOOL TerminateThread ( HANDLE hthread, DWORD dwexitcode );

Programování vláken ve Win32 Pozastavení vlákna: DWORD SuspendThread( HANDLE hthread ); Opětovné spuštění vlákna: DWORD ResumeThread( HANDLE hthread );

Přístup ke sdíleným prostředkům operace jsou prováděny ve více krocích při souběžném přístupu může dojít k jejich přerušení vlákno je přeplánováno uprostřed operace výsledek závisí na pořadí provádění vláken nastává tzv. race condition (chyba souběhu)

Řešení chyby souběhu Kritická sekce dokud není operace dokončena, není možné začít jinou, bez ohledu na počet kroků (atomická změna datové struktury) je nutné identifikovat kritické sekce programu systém zajistí vzájemné vyloučení (mutual exlusion) kód kritické sekce může provádět jen jedno vlákno!!

Synchronizace vláken - 1 Cíle: zabránit konfliktům mezi vlákny při přístupu ke sdíleným prostředkům (paměti, souborům, periferním zařízením, ap.) pozastavení běhu vláken, dokud nejsou splněny specifikované podmínky nebo nenastane určená událost; zajistit vykonání určitých programových sekvencí v požadovaném pořadí.

Synchronizace vláken - 2 Optimální mechanismus synchronizace vláken je založen na možnosti převedení vlákna do stavu čekání resp. spánku (waiting, sleeping), kdy mu není přidělován čas procesoru (viz obr. Stavy vlákna ). V tomto stavu vlákno setrvá tak dlouho, dokud nebudou splněny požadované podmínky (např. ukončení jiného vlákna nebo procesu, nenulový stav semaforu, signalizovaná událost, uplynutí nastaveného časového intervalu apod.). Jakmile podmínky nastanou, systém vlákno probudí, tzn. přesune je (v závislosti na jeho prioritě) do příslušné fronty aktivních procesů připravených na přidělení procesoru.

Synchronizace pomocí objektů jádra ve Win32 Synchronizace vláken pomocí funkce: DWORD WaitForSingleObject ( HANDLE hobject, DWORD dwtimeout ); DWORD WaitForMultipleObjects ( DWORD cobjects, CONST HANDLE *lphobjects, BOOL fwaitall, DWORD dwtimeout ); hobject = manipulátor (handle) synchronizačního objektu (mutex, semafor, událost, soubor, proces, vlákno, ) Synchronizační objekt je v signalizovaném nebo nesignalizovaném stavu!

Mutex (Mutual Exclusion) synchronizační objekt typu binární semafor signalizován, pokud není vlastněn žádným vláknem typicky se používá pro přístup do kritické sekce Vytvoření mutexu: HANDLE CreateMutex ( LPSECURITY_ATTRIBUTES lpmutexattributes, BOOL binitialowner, LPCTSTR lpname ); Otevření mutexu: HANDLE OpenMutex ( DWORD fdwaccess, BOOL finherit, LPCTSTR lpszmutexname ); Uvolnění mutexu: BOOL ReleaseMutex ( HANDLE hmutex ); 21

Příklad vícevláknového programu - 1 #include <windows.h> HANDLE hthreads[2]; HANDLE g_hmutex; DWORD dwthreadid1, dwthreadid2; int WinMain(...) { // Vytvoření mutexu g_hmutex = CreateMutex (NULL, FALSE, NULL); 22

Příklad vícevláknového programu - 2 // Vytvoření vláken a jejich okamžité spuštění hthreads[0] = CreateThread (NULL, 0, FirstThread, NULL, 0, &dwthreadid1); hthreads[1] = CreateThread (NULL, 0, SecondThread, NULL, 0, &dwthreadid2); // Čekání na ukončení vláken FirstThread a SecondThread ; // primární vlákno je pozastaveno WaitForMultipleObjects (2,hThreads,TRUE,INFINITE); // Uzavření manipulátorů obou vláken CloseHandle (hthreads[0]); CloseHandle (hthreads[1]); } 23

Příklad vícevláknového programu 3 DWORD WINAPI FirstThread (LPVOID lpvthreadparm) { BOOL fdone = FALSE; DWORD dw; while (!fdone) { // čekání na signalizaci mutexu, vlákno je pozastaveno dw = WaitForSingleObject(g_hMutex, INFINITE); } } if (dw == WAIT_OBJECT_0) { // mutex byl signalizován, vlákno může pokračovat... // hlavní programová sekvence vlákna FirstThread... // uvolnění mutexu ReleaseMutex (g_hmutex); } 24

Příklad vícevláknového programu - 4 DWORD WINAPI SecondThread (LPVOID lpvthreadparm) { BOOL fdone = FALSE; DWORD dw; while (!fdone) { // čekání na signalizaci mutexu, vlákno je pozastaveno dw = WaitForSingleObject(g_hMutex, INFINITE); } } if (dw == WAIT_OBJECT_0) { // mutex byl signalizován, vlákno může pokračovat... // hlavní programová sekvence vlákna SecondThread... // uvolnění mutexu ReleaseMutex (g_hmutex); } 25

Semafory - 1 synchronizační objekty používané např. ke sledování počtu volných systémových prostředků. hodnota semaforu se pohybuje od nuly do specifikované maximální hodnoty. semafor je signalizován, je-li jeho hodnota větší než nula, nesignalizován, je-li hodnota nulová. při volání funkce WaitForSingleObject (hsemaphore, ) systém zjistí, zda je hodnota semaforu větší než nula a pak ji dekrementuje o jedničku k uvolnění semaforu (tzn. inkrementaci jeho hodnoty) se používá volání funkce ReleaseSemaphore() ReleaseSemaphore() má jiné chování než ReleaseMutex(). Může být volána libovolným vláknem, které má k objektu semaforu přístup. Hodnota semaforu je inkrementována o hodnotu danou argumentem creleasecount. 26

Semafory - 2 HANDLE CreateSemaphore ( LPSECURITY_ATTRIBUTES lpsemaphoreattributes, LONG linitialcount, LONG lmaximumcount, LPCTSTR lpname ); HANDLE OpenSemaphore ( DWORD fdwaccess, BOOL finherit, LPCTSTR lpszsemname ); BOOL ReleaseSemaphore ( HANDLE hsemaphore, LONG creleasecount, LPLONG lplpreviouscount ); 27

Příklad použití semaforu HANDLE CreateNewSemaphore(LPSECURITY_ATTRIBUTES lpsa, LONG cinitial, LONG cmax, LPTSTR lpszname) { HANDLE hsem; hsem = CreateSemaphore( lpsa, // pointer na security attributes cinitial, // počáteční hodnota cmax, // maximální hodnota lpszname) // jméno semaforu if (hsem!= NULL && GetLastError() == ERROR_ALREADY_EXISTS) { // semafor již existuje, funkce vrátí NULL CloseHandle(hSem); return NULL; } return hsem; // vrátí handle nově vytvořeného semaforu } 28

Události (Events) Události se zpravidla používají k oznámení, že má být nebo byla ukončena nebo zahájena určitá činnost. Rozlišují se dva typy událostí: ručně resetované a automaticky resetované. Vytvoření události: HANDLE CreateEvent ( LPSECURITY_ATTRIBUTES lpeventattributes, BOOL bmanualreset, BOOL binitialstate, LPCTSTR lpname ); 29

Ručně resetované události do signalizovaného stavu jsou uvedeny voláním funkce: BOOL SetEvent ( HANDLE hevent ); události nejsou prostřednictvím funkcí WaitForSingleObject(), WaitForMultipleObject() převedeny automaticky zpět do nesignalizovaného stavu (jako u mutexu). v signalizovaném stavu událost zůstává tak dlouho, dokud ji některé z vláken explicitně nepřepne do nesignalizovaného stavu. K přepnutí (resetování) se používá funkce: BOOL ResetEvent ( HANDLE hevent ); posloupnost volání SetEvent(), uvolnění všech čekajících vláken a volání ResetEvent() je možné nahradit jedinou funkcí: BOOL PulseEvent ( HANDLE hevent ); 30

Automaticky resetované události s automaticky resetovanými událostmi je možné pracovat podobně jako s ručně resetovanými- jiný je mechanismus resetování!!! do signalizovaného stavu jsou automaticky resetované události uvedeny voláním funkce SetEvent(); oproti ručně resetovaným událostem jsou automaticky resetované události převedeny systémem bezprostředně po probuzení čekajícího vlákna zpět do nesignalizovaného stavu; vběhu může pokračovat pouze jediné vlákno ze všech, která na událost čekají; ostatní vlákna zůstávají pozastavena; použití funkce ResetEvent() je zbytečné. 31

Multithreading v LabWindows/CVI 32

Multithreading v LabWindows/CVI Thread Pool CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, DataAcqThreadFunction, NULL, &functionid); int CVICALLBACK ThreadFunction (void *functiondata); Asynchronous Timer Využití systémového časovače MS Windows. 33

Multithreading v LabWindows/CVI příklad použití Thread Pool int CVICALLBACK DataAcqThreadFunction (void *functiondata); int main(int argc, char *argv[]) { int panelhandle; int functionid; if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ if ((panelhandle = LoadPanel(0, "DAQDisplay.uir", PANEL)) < 0) return -1; DisplayPanel (panelhandle); CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, DataAcqThreadFunction, NULL, &functionid); RunUserInterface (); 34

Příklad - pokračování DiscardPanel (panelhandle); CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE, functionid, 0); return 0; } int CVICALLBACK DataAcqThreadFunction (void *functiondata) { while (!quit) { Acquire(...); Analyze(...); } return 0; } 35

Ochrana dat v LW/CVI Thread Lock ochrana kritické sekce Thread-Local Variables Thread-Safe Variables Thread-Safe Queue Viz Multithreading in LabWindows /CVI, NI-Tutorial-3663. 36

Praktická ukázka Ukázka vývoje vícevláknové aplikace v prostředí LabWindows/CVI. 37