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



Podobné dokumenty
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

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

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

Jednotný vizuální styl: podpis v ové korespondenci.

Operace nad celými tabulkami

Školní kolo soutěže Mladý programátor 2016, kategorie A, B

Nastavení telefonu T-Mobile MDA Touch

Synchronizace vjj 1

Výsledky přijímacích zkoušek

Zabezpečení Uživatelská příručka

Programování 1. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

ANOTACE K VÝUKOVÉ SADĚ

Vydání občanského průkazu

téma: Formuláře v MS Access

V této části manuálu bude popsán postup jak vytvářet a modifikovat stránky v publikačním systému Moris a jak plně využít všech možností systému.

Záloha a obnovení Uživatelská příručka

Návod a používání BLMFis

-1- N á v r h ČÁST PRVNÍ OBECNÁ USTANOVENÍ. 1 Předmět úpravy

Návod k obsluze HLSI Myčka nádobí

OBSAH BALENÍ SOFTWARE CD PŘEHLED PANELU

Pomocník diabetika Uživatelská příručka

ZPRÁVA O PRŮBĚHU ŘEŠENÍ PROJEKTU

Obrázek. Základní popis, zadání úkolu. Struktura tříd,

Obchodní podmínky pro spolupráci se společností Iweol EU s.r.o.

Ovládání TV platformy a funkce Chytrá TV

Žáci mají k dispozici pracovní list. Formou kolektivní diskuze a výkladu si osvojí grafickou minimalizaci zápisu logické funkce

rozlišení obrazovky 1024 x 768 pixelů operační systém Windows 2000, Windows XP, Windows Vista 1 volný sériový port (volitelný) přístup na internet

účetních informací státu při přenosu účetního záznamu,

Manuál uživatele čipové karty s certifikátem

Dálkové ovládání HP Media remote control (pouze u vybraných modelů) Uživatelská příručka

E-škola návod pro rodiče

Úprava tabulek v MS Word. Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T. G. Masaryka, Kostelec nad Orlicí

ŘÁD UPRAVUJÍCÍ POSTUP DO DALŠÍHO ROČNÍKU

NÁVOD K VYUŽÍVÁNÍ MICROSOFT IT ACADEMY E-LEARNING

Zálohování a obnova Uživatelská příručka

DATABÁZE DŮLEŽITÉ: Před načtením nové databáze do vaší databáze si prosím přečtěte následující informace, které vám umožní:

sexta, druhý ročník Celkem hodin

CLOUDOVÁ ŘEŠENÍ OFFICE 365 PRO JEDNOTLIVCE

Speciální způsoby záchrany s využitím vrtulníku

Popis služby Modulární služby Dell

Podrobný postup pro vygenerování a zaslání Žádosti o podporu a příloh OPR přes Portál farmáře

3 Vývojová prostředí, základní prvky jazyka Java, konvence jazyka Java

Kapitola 1: Co je Delphi 19. Překlad projektu 23

Výzva k podání nabídek (zadávací dokumentace)

PŘÍLOHA Č. 9 PRAVIDLA PRO PROVÁDĚNÍ INFORMAČNÍCH A PROPAGAČNÍCH OPATŘENÍ. Řízená kopie elektronická Vydání: 1 Revize:0 Strana 1 z 11

Operační systém z hlediska procesu Mgr. Josef Horálek

29 Evidence smluv. Popis modulu. Záložka Evidence smluv

Elektrická měření 4: 4/ Osciloskop (blokové schéma, činnost bloků, zobrazení průběhu na stínítku )

Uživatelský manuál pro práci se stránkami OMS a MS provozované portálem Myslivost.cz. Verze 1.0

Pračka EVOGT 14064D3. Návod k použití

Návod k používání registračního systému ČSLH

TECHNICKÁ DATA Nominální napájecí napětí : Rozsah napájecího napětí : Spotřeba proudu při 12 V stejn. :

Regenerace zahrady MŠ Neděliště

Počítačová grafika 2. Opakování. Úprava barev a tónů. Retuše a efekty.

Poukázky v obálkách. MOJESODEXO.CZ - Poukázky v obálkách Uživatelská příručka MOJESODEXO.CZ. Uživatelská příručka. Strana 1 / 1. Verze aplikace: 1.4.

Aktualizace softwaru Uživatelská příručka

Uživatelské postupy v ISÚI Založení ulice a změna příslušnosti adresního místa k ulici

Co najdete v ASPI? (pro uživatele SVI FSE UJEP)

Vybavení pro separaci a svoz BRKO

Pokyn D Sdělení Ministerstva financí k rozsahu dokumentace způsobu tvorby cen mezi spojenými osobami

VÝZVA A ZADÁVACÍ DOKUMENTACE

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

PŘÍLOHA 1.6 SMLOUVY O PŘÍSTUPU K VEŘEJNÉ PEVNÉ KOMUNIKAČNÍ SÍTI LOGISTIKA KONCOVÝCH ZAŘÍZENÍ

NÁVRHOVÝ PROGRAM VÝMĚNÍKŮ TEPLA FIRMY SECESPOL CAIRO PŘÍRUČKA UŽIVATELE

Metodika kontroly naplněnosti pracovních míst

VYHLÁŠKA ČÁST PRVNÍ STÁTNÍ ZKOUŠKY Z GRAFICKÝCH DISCIPLÍN. Předmět úpravy

Metodický list číslo 11 Včlenění rozdělovače do jednoduchého vedení. do poschodí Vydáno dne: 5. března 2007 Stran: 5

DR3 Vydáno dne: 5. března 2007 Stran: 5

Obsah. Obsah. Úvod... 7

Zásady a podmínky pro poskytování dotací na program Podpora implementace Evropské charty regionálních či menšinových jazyků 2011

Zabezpečení. Uživatelská příručka

PARLAMENT ČESKÉ REPUBLIKY Poslanecká sněmovna 2005 IV. volební období

Magnetic Levitation Control

Nastavení telefonu Samsung I9195 Galaxy S4 mini

Registr UJO. Příručka pro uživatele. Institut biostatistiky a analýz. Lékařské a Přírodovědecké fakulty Masarykovy univerzity.

6. Příklady aplikací Start/stop Pulzní start/stop. Příručka projektanta VLT AQUA Drive

První kroky v portálu

Manuál Kentico CMSDesk pro KDU-ČSL

KÓDOVÝ ZÁMEK 1105/2 A 1156/10

ČEZ Prodej, s.r.o., sídlem Duhová 425/1, 14053, Praha, IČ , zast. David Jünger, Mgr., sídlem 28. října 438/219, 70900, Ostrava

INFORMATIKA. aplikační software pro práci s informacemi PRAŽSKÝ HRAD. Pracovní list pro žáky. Gymnázium K. V. Raise, Hlinsko, Adámkova 55

Testovací aplikace Matematika není věda

Seznámení žáků s pojmem makra, možnosti využití, praktické vytvoření makra.

STAGE DESK-16 16kanálový dimmer ovladač UŽIVATELSKÁ PŘÍRUČKA

OBCHODNÍ PODMÍNKY. obchodní společnosti Intrea-Piko, s.r.o. se sídlem Sasanková 2657/2, Praha 10 IČ:

O D B O R O V É S D R U Ž E N Í Ž E L E Z N I Č Á Ř Ů Republiková rada seniorů JEDNACÍ ŘÁD. 1. Úvodní ustanovení

DIGITÁLNÍ HRACÍ HODINY DGT 2000 FIDE OFICIÁLNÍ ŠACHOVÉ HODINY

OBCHODNÍ PODMÍNKY ÚVODNÍ USTANOVENÍ

Úprava fotografií hledání detailu, zvětšování (pracovní list)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT. Cyklus while, do-while, dělitelnost, Euklidův algoritmus

SMLOUVA O POSKYTNUTÍ DOTACE

Šicí stroje NX-400 NX-200

INTERNETOVÝ TRH S POHLEDÁVKAMI. Uživatelská příručka

1. Požadavky na provoz aplikací IISPP

Maturitní témata z předmětu Programování a databázové systémy. pro šk. rok 2012/2013

Příručka pro zadavatele E-ZAK krok za krokem

58/2016 Sb. VYHLÁKA ČÁST PRVNÍ STÁTNÍ ZKOUKY Z GRAFICKÝCH DISCIPLÍN

FULL HD fotopast s MMS - 12MP, IP54

WEBDISPEČINK NA MOBILNÍCH ZAŘÍZENÍCH PŘÍRUČKA PRO WD MOBILE

Android Elizabeth. Verze: 1.3

Transkript:

Cvičení č. 6 Synchronizace ve Windows 3 Body Datum: 3.4.2008 1

Obsah 1. Úvod...2 2. Pokyny pro odevzdání...2 3. Příprava...2 4. Úlohy...3 4.1 Doporučení pro implementaci...3 4.5 Přehled použitých funkcí Windows...4 1. Úvod V tomto cvičení si ukážeme prostředky pro synchronizaci prováděcích toků a procesů v prostředí Windows. Vytvoříme několik ukázkových programů s různými způsoby synchronizace. Cílem cvičení je získat představu o synchronizačních objektech dostupných v prostředí Windows a na řešení modelových úloh získat praktické dovednosti v této oblasti. V rámci cvičení bude upravováno několik ukázkových programů, které využívají následující synchronizační objekty Windows: kritické sekce, mutexy, semafory, události. 2. Pokyny pro odevzdání Výstupem cvičení bude protokol krátká zpráva o řešení úloh na cvičení. Šablonu protokolu si stáhněte z Moodle. Protokol by měl obsahovat odpovědi na otázky, zdrojový kód Vašich řešení podle zadání, případně stručný popis úprav v ukázkovém kódu podle bodu 4 v tomto dokumentu. Protokol pojmenujte svým jménem ve formátu Prijmeni_Jmeno a odevzdejte na Moodle. 3. Příprava Prostudujte si prezentaci na Moodle Windows - synchronizace. Pro oživení základních pojmů si může znovu pročíst také dokument Synchronizace dostupný na Moodle v jedné z předchozích lekcí, která se zabývala synchronizací. 2

4. Úlohy Stáhněte si z Moodle ukázkové programy (synchron_win_ukazky.zip). Jednotlivé programy postupně přeložte a spusťte. V programech proveďte úpravy (vyřešte úkoly) podle popisu v hlavičkách jednotlivých souborů. Úkoly jsou také shrnuty dále. MUTEXY: Upravte thread_cteni tak, aby čekala na mutex maximálně 50 ms. Pokud mutex do té doby nezíská, vypíše hlášení na obrazovku a nebude pracovat se sdílenými daty. Pokud mutex získá, vypíše obsah sdílené proměnné jako v původním programu. SEMAFORY: Přidejte do programu ještě jeden prováděcí tok, který bude zobrazovat hodnotu ze sdílené proměnné a upravte semafor tak, aby mohly ze sdílené proměnné číst současně dva toky (zvětšete počáteční hodnotu počitadla semaforu na 2). Při uvolňování semaforu vypisujte na obrazovku hodnotu jeho počitadla (parametr lppreviouscount). POZOR: funkce pro zápis musí volat dvakrát funkci WaitForSingleObject, aby získala "obě hodnoty" semaforu. Jen tak bude zajištěno, že v době zápisu ze sdílené proměnné některý prováděcí tok nebude současně číst. UDÁLOSTI: Vysvětlete, jaký problém může nastat v ukázkovém programu při přístupu ke sdílené proměnné g_ndata. Vyřešte tento problém s použitím ještě jedné události (ta bude signalizovat dokončení práce s naměřenými daty). Do protokolu uveďte řešení jednotlivých úkolů. Vložte pouze kód v nezbytném rozsahu tak, aby bylo zřejmé řešení úkolů. Kód doplňte také stručným slovním popisem řešení. 4.1 Doporučení pro implementaci Čekání na mutex s určením maximální doby čekání: Funkce WaitForSingleObject vrací jednu ze tří konstant, podle které lze určit výsledek čekání: WAIT_OBJECT_0 stav objektu, na který se čekalo byl signalizován. Jinak řečeno čekání bylo úspěšné. Toto je návratový kód, který odpovídá příznivému výsledku = získání např. mutexu. WAIT_TIMEOUT uplynula maximální doba čekání (timeout) aniž by byl objekt signalizován. Např. mutex je tedy vlastně jiným prováděcím tokem a nebyl dosud uvolněn. WAIT_ABANDONED Mutex nebyl uvolněn prováděcím tokem, který už ale skončil. To znamená, že je v prováděcím toku chyba, a tok skončil, aniž by uvolnil mutex, který si přivlastnil. Náš tok tedy může se sdílenými daty chráněnými tímto mutexem pracovat. Měli bychom ale především opravit chybu v toku, který mutex neuvolnil. Příklad použití timeout při čekání na mutex: DWORD r = WaitForSingleObject(hMutex, 50); if ( r == WAIT_TIMEOUT ) { printf("mutex nebyl ziskan v pozadovanem case.\n Cekam znovu..."); } Poznámka: Funkce WaitForSingleObject je podrobně popsána na konci tohoto dokumentu. 3

Semafor s možností několika čtoucích thread, ale pouze jedné zapisující: Semafor má hodnotu počitadla 2, tj. dva prováděcí toky jej mohou získat současně a číst ze sdílených dat. Prováděcí tok, který sdílená data mění se ale musí vyvarovat změny v době, kdy některý tok data čte. Proto volá před zápisem funkci WaitForSingleObject dvakrát, čímž sníží hodnotu počitadla semaforu na nulu. Tím je zaručeno že žádná jiná thread v době zápisu nebude data číst. Získání semaforu dvakrát před zápisem do sdílené proměnné z níž mohou najednou číst dva prováděcí toky tedy vypadá takto: WaitForSingleObject(hSemafor, INFINITE); WaitForSingleObject(hSemafor, INFINITE); // nyní pracovat se sdílenou proměnnou // Uvolnit semafor POZOR: pocitadlo zvysime o 2. ReleaseSemaphore(hSemafor, 2, NULL ); Všimněte si, že funkci ReleaseSemaphore je jako druhý parametr předáno 2, tj. počitadlo semaforu se zvýší o 2 - protože jsme předtím čekali na semafor dvakrát a nyní chceme zase umožnit číst sdílená data až dvěma tokům současně. Čtoucí toky získávají i uvolňují semafor pouze jednou (volají ReleaseSemaphore s hodnotou 1). 4.5 Přehled použitých funkcí Windows Práce s kritickými sekcemi void WINAPI InitializeCriticalSection( out LPCRITICAL_SECTION lpcriticalsection); Inicializuje objekt kritické sekce. lpcriticalsection - ukazatel na objekt kritické sekce, který se má inicializovat. Tento objekt definujeme následovně: CRITICAL_SECTION Sekce; void WINAPI EnterCriticalSection( inout LPCRITICAL_SECTION lpcriticalsection); Čeká na vlastnictví kritické sekce. Funkce vrátí až když je volajícímu prováděcímu toku přiděleno vlastnictví kritické sekce. lpcriticalsection ukazatel na objekt kritické sekce, jejíž vlastnictví se má získat. void WINAPI LeaveCriticalSection( inout LPCRITICAL_SECTION lpcriticalsection); Vzdá se vlastnictví kritické sekce. lpcriticalsection - ukazatel na objekt kritické sekce, jejíž vlastnictví se uvolňuje. 4

Práce s mutexy HANDLE WINAPI CreateMutex( in_opt LPSECURITY_ATTRIBUTES lpmutexattributes, in BOOL binitialowner, in_opt LPCTSTR lpname); Funkce vytvoří mutex. lpmutexattributes nastavení zabezpečení mutexu. NULL pro výchozí hodnotu. binitialowner - Pokud je TRUE, volající prováděcí tok získá zároveň s vytvořením mutexu jeho vlastnictví. lpname jméno mutexu. Může být NULL pokud mutex nemá mít jméno. Poznámka: jméno je nutné pokud je mutex využívám více procesy. Funkce vrací handle vytvořeného mutexu nebo NULL pokud selže. BOOL WINAPI ReleaseMutex( in HANDLE hmutex ); Vzdá se vlastnictví daného mutexu. hmutex handle mutexu, jehož vlastnictví se uvolňuje. Poznámka: Pro získání vlastnictví mutexu se využije některá z čekacích funkcí, např. WaitForSingleObject, viz níže. Práce se semafory HANDLE WINAPI CreateSemaphore( in_opt LPSECURITY_ATTRIBUTES lpsemaphoreattributes, in LONG linitialcount, in LONG lmaximumcount, in_opt LPCTSTR lpname); Funkce vytvoří semafor. lpsemaphoreattributes nastavení zabezpečení semaforu. NULL pro výchozí hodnotu. linitialcount počáteční hodnota počitadla semaforu lmaximumcount maximální hodnota počitadla semaforu. lpname - jméno semaforu. Může být NULL pokud semafor nemá mít jméno. Poznámka: jméno je nutné pokud je semafor využívám více procesy. Funkce vrací handle vytvořeného semaforu nebo NULL pokud selže. 5

BOOL WINAPI ReleaseSemaphore( in HANDLE hsemaphore, in LONG lreleasecount, out_opt LPLONG lppreviouscount ); Vzdá se vlastnictví semaforu. hsemaphore handle semaforu jehož vlastnictví se uvolňuje. lreleasecount hodnota, o kterou se má zvýšit počitadlo semaforu. lppreviouscount ukazatel na proměnnou, do které bude uložena předchozí hodnota počitadla semaforu (před zvýšením touto funkcí). Může být NULL pokud hodnota není požadována. Poznámka: Pro získání vlastnictví semaforu se využije některá z čekacích funkcí, např. WaitForSingleObject, viz níže. Práce s událostmi HANDLE WINAPI CreateEvent( in_opt LPSECURITY_ATTRIBUTES lpeventattributes, in BOOL bmanualreset, in BOOL binitialstate, in_opt LPCTSTR lpname); Funkce vytvoří objekt události. lpeventattributes nastavení zabezpečení pro vytvářený objekt události. NULL pro výchozí hodnotu. bmanualreset TRUE pokud má být vytvořená událost ručně resetovaná (manual reset). Taková událost zůstává po signalizaci v signalizovaném stavu až do resetování voláním funkce ResetEvent. Důsledkem je, že všechny prováděcí toky, které na tuto událost čekají jsou probuzeny. Pokud je parametr FALSE, je vytvořena automaticky resetovaná událost. Po signalizaci takové události je vždy probuzen pouze jeden z prováděcích toků, které na ni čekají a událost je automaticky resetována. binitialstate TRUE pokud má být událost po vytvoření také signalizována. lpname - jméno události. Může být NULL pokud událost nemá mít jméno. Poznámka: jméno je nutné pokud je událost využívána pro komunikaci mezi procesy. Prováděcí toky v rámci jednoho procesu událost používají prostřednictvím globální proměnné (handle). Funkce vrací handle vytvořené události nebo NULL pokud selže. 6

BOOL WINAPI SetEvent( in HANDLE hevent); Signalizuje danou událost. hevent handle události, která se má signalizovat. Poznámka: Pro čekání na událost se využije některá z čekacích funkcí, např. WaitForSingleObject, viz níže. Ostatní funkce DWORD WINAPI WaitForSingleObject(HANDLE hhandle, DWORD dwmilisecond ); Funkce čeká na zadaný synchronizační objekt dokud nezíská jeho vlastnictví nebo dokud neuplyne nastavený čas. hhandle handle synchronizačního objektu, na který se má čekat, např. mutexu, semaforu nebo události. dwmiliseconds maximální doba čekání v milisekundách. INFINITE pokud se má čekat neomezenou dobu. Funkce vrací jednu ze tří hodnot: o WAIT_OBJECT_0 stav objektu, na který se čekalo byl signalizován. Jinak řečeno, čekání bylo úspěšné. Toto je návratový kód, který odpovídá příznivému výsledku, získání např. mutexu. o WAIT_TIMEOUT uplynula maximální doba čekání (timeout) aniž by byl objekt signalizován. Např. mutex je vlastněn jiným prováděcím tokem a nebyl dosud uvolněn. o WAIT_ABANDONED Mutex nebyl uvolněn prováděcím tokem, který už ale skončil. To znamená, že je v prováděcím toku chyba, a tok skončil, aniž by uvolnil mutex, který si přivlastnil. Náš tok může tedy v podstatě se sdílenými daty chráněnými tímto mutexem pracovat. Měli bychom ale především opravit chybu v toku, který mutex neuvolnil. Poznámka: Příklad použití funkce je uveden výše v tomto dokumentu. BOOL WINAPI CloseHandle( in HANDLE hobject); Funkce zavírá handle objektu (mutexu, semaforu, thread atd.) Poznámka: Voláním funkce je v systému sníženo interní počitadlo odkazů na daný objekt (např. mutex) a pokud počitadlo dosáhne nuly, je objekt odstraněn ze systému. Všimněte si, že v ukázkových programech voláme tuto funkci po vytvoření prováděcího toku. Pokud bychom tak neučinili, i po skončení běhu příslušného toku by jeho objekt stále existoval (a zabíral paměť) protože handle toku by nebylo zavřeno. hobject handle objektu, který se má zavřít. 7

DWORD WINAPI GetTickCount(void); Funkce vrací počet milisekund, které uběhly od startu systému. Po 49,7 dne hodnota přeteče a pokračuje znovu od nuly. VOID WINAPI Sleep( in DWORD dwmilliseconds); Pozastaví vykonávání aktuálního prováděcího toku na zadaný počet milisekund. dwmilliseconds - Doba na kterou má být thread pozastavena, v milisekundách. Hodnota 0 způsobí, že se volající thread vzdá zbytku svého časového kvanta (time slice). Podrobnosti k jednotlivým funkcím můžete najít v nápovědě Visual Studio nebo online na MSDN. 5. Odkazy Moodle podpora předmětu na http://vyuka.fai.utb.cz. Magisterské Studium, Programování realtime aplikací. Klíč k zápisu je PR2008. MSDN Library Online dokumentace k funkcím a produktům Microsoft. http://msdn2.microsoft.com/en-us/library/default.aspx 8