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



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

Paralelní programování

Paralelní programování

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

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

Paralelní programování

Synchronizace Mgr. Josef Horálek

Procesy a vlákna - synchronizace

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

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

Semafory Zobecněním operací WAKEUP a SLEEP přidáním celočíselného čítače vzniknou semafory a jejich atomické operace DOWN a UP.

Konstruktory a destruktory

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

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

04. Mutexy, monitory. ZOS 2006, L. Pešička

Management procesu I Mgr. Josef Horálek

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

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)

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

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Management procesu II Mgr. Josef Horálek

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

MQL4 COURSE. By Coders guru -5 Smyčky & Rozhodnutí Část 2

Lineární datové struktury

2010/2011 ZS. Operační systém. procesy a vlákna. interakce a synchronizace

Paralelní programování

Prezentace a vysvětlení programového prostředí NXC

Vzájemné vyloučení procesů

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

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

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

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

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

Lineární datové struktury

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

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Sada 1 - PHP. 03. Proměnné, konstanty

Linux a vlákna - Linuxové noviny 8-9/1998. Linuxové noviny 08-09/98

Spojová implementace lineárních datových struktur

Paralelní programování

setup() { I = 0; } loop() { I = I + 1; }

IRAE 07/08 Přednáška č. 7. Začátek (head)

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Oborové číslo Hodnocení - část A Hodnocení - část B Hodnocení - část A+B. 1. úloha (4 body) Kolik existuje cest délky 4 v grafu K11? 2.

DUM č. 20 v sadě. 29. Inf-5 RoboLab a Lego Mindstorms

ADT/ADS = abstraktní datové typy / struktury

Synchronizace paralelních procesů

Více o konstruktorech a destruktorech

Paralelní a distribuované výpočty (B4B36PDV)

Řídicí struktury. alg3 1

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

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

Architektury paralelních počítačů II.

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Pavel Procházka. 3. prosince 2014

Programování v C++ 1, 1. cvičení

Datové struktury. alg12 1

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

PB071 Programování v jazyce C

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

Popis funkcí exportovaných z knihovny nddbe.dll

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

Programování v jazyce JavaScript

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

Teoretická informatika Tomáš Foltýnek Paralelní programování

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

Cvičení č. 2. Komunikace mezi procesy Program Hodiny. 4 body

8 Třídy, objekty, metody, předávání argumentů metod

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Programovací jazyk C++ Hodina 1

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

PREPROCESOR POKRAČOVÁNÍ

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Kolekce, cyklus foreach

6 Příkazy řízení toku

Algoritmy a datové struktury

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Knihovna RecDBXLib ZÁZNAMY V DATABOXU TXV

Algoritmizace a programování

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

UNIVERZITA OBRANY. Knihovna HLAGate. Programátorská dokumentace. Petr Františ

Základy programování (IZP)

Úvod do programovacích jazyků (Java)

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

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

Mělká a hluboká kopie

Procesy a vlákna (Processes and Threads)

PES lib (C + PASCAL) KNIHOVNY KOMUNIKAÈNÍCH FUNKCÍ 03/ PESlib KOMUNIKAČNÍ KNIHOVNY C, PASCAL 03/ stran 1

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

OS Konkurence procesů a IPC

Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček

Transkript:

Operační systémy Tomáš Hudec 7 Prostředky programovacích jazyků pro IPC Obsah: 7.1 Monitor, 7.1.1 Použití monitoru pro řízení přístupu do kritické sekce, 7.1.2 Použití monitoru pro synchronizaci, 7.1.3 Producenti a konzumenti pomocí monitoru, 7.2 Bariéra, 7.2.1 Bariéra v posixových vláknech, 7.3 Podmínková proměnná, 7.4 Opakování. Řada programovacích jazyků nabízí prostředky pro meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce. 7.1 Monitor Monitor je nástrojem pro vzájemného vylučování a synchronizace. Koncept monitoru vynalezl již v roce 1972 Per Brinch Hansen. O dva roky později koncept podmínkových front monitoru vylepšil Tony Hoare (plným jménem sir Charles Antony Richard Hoare). Jedná se konstrukci programovacího jazyka velmi podobnou třídě. Všechny lokální proměnné jsou přístupné pouze pomocí funkcí monitoru. Nejdůležitější vlastností monitoru je, že uvnitř něj smí být v každém okamžiku nejvýše jedno vlákno (proces). Tím je zaručeno vzájemné vylučování. Synchronizaci lze řešit pomocí podmínkových proměnných monitoru. S každou podmínkovou proměnnou je sdružena fronta pro vlákna čekající na danou podmínku. Nad podmínkovými proměnnými jsou implementovány operace condition_wait a condition_signal. Operace condition_wait zablokuje vlákno a zařadí je do příslušné fronty (dle podmínkové proměnné). Vlákno může být probuzeno operací condition_signal na příslušné podmínkové proměnné. http://fei-learn.upceucebny.cz/mod/page/view.php?id=5278 1/6

Monitor 7.1.1 Použití monitoru pro řízení přístupu do kritické sekce Jelikož monitor zaručuje vzájemné vylučování při spouštění svých funkcí, stačí deklarovat sdílená data v monitoru a umístit kritickou sekci do jeho funkce. monitor CS { // deklarace sdílených proměnných critical_section() { // kód kritické sekce kritická sekce Kód vláken: repeat CS.critical_section(); // zbytková sekce forever // kritická sekce 7.1.2 Použití monitoru pro synchronizaci Předpokládejme, že jedno vlákno má provést akci (vypočítat hodnotu sdílené proměnné), na kterou musí jiné vlákno počkat (použití vypočtené hodnoty). Pro synchronizaci lze použít podmínkové proměnné monitoru v kombinaci s proměnnou vypovídající o stavu dokončení akce. http://fei-learn.upceucebny.cz/mod/page/view.php?id=5278 2/6

monitor sync { bool done = false; // proměnná určující stav akce cond_t condition; // deklarace podmínkové proměnné finished() { // zavolá se po vykonání akce done = true; condition_signal(condition); await() { // zavolá se při čekání na dokončení akce if (!done) condition_wait(condition); Kód vlákna provádějícího akci, zde vypočtení hodnoty sdílené proměnné x: x = calculate(); sync.finished(); // provedení akce // signalizace dokončení akce Kód vlákna čekajícího na dokončení akce: sync.await(); // pokud akce nebyla ještě provedena, bude čekat use(x); // použití hodnoty sdílené proměnné x vypočtené jiným vláknem 7.1.3 Producenti a konzumenti pomocí monitoru Definice problému vizte předchozí kapitolu. Stačí definovat sdílená data uvnitř monitoru (monitor zajistí vzájemné vylučování) a pro synchronizaci použít podmínkové proměnné. Funkce pro vložení a výběr položek budou součástí monitoru. http://fei-learn.upceucebny.cz/mod/page/view.php?id=5278 3/6

monitor PC { buffer[n]; // sklad: pole o kapacitě n položek in = 0; // index následující volné pozice (pro uložení producentem) out = 0; // index následující obsazené pozice (pro vyzvednutí konzumentem) count = 0; // počet položek ve skladě cond_t not_full; // signalizace volného místa ve skladě cond_t not_empty; // signalizace neprázdného skladu void append(item) { // vkládání do skladu if (count == n) // je-li sklad plný, condition_wait(not_full); // čekání na uvolnění místa kritická sekce buffer[in] = item; // uložení položky do skladu na pozici in in = (in + 1) % n; // posunutí indexu na následující místo count++; // zvýšení počtu uložených položek condition_signal(not_empty); // signalizace neprázdného skladu void take(item_t *item) { // vybírání ze skladu if (count == 0) // je-li sklad prázdný condition_wait(not_empty); // čekání na vložení položky kritická sekce *item = buffer[out]; // vyzvednutí položky ze skladu na pozici out out = (out + 1) % n; // posunutí indexu na následující místo count--; // snížení počtu uložených položek condition_signal(not_full); // signalizace volného místa ve skladě Vlákno producenta: repeat item = produce(); PC.append(item); forever // vyprodukování položky // vložení položky do skladu Vlákno konzumenta: repeat PC.take(&item); consume(item); forever // vyzvednutí položky ze skladu // zpracování položky Vzájemné vylučování je zaručeno, neboť manipulace se sdílenými daty probíhá výhradně v monitoru. 7.2 Bariéra http://fei-learn.upceucebny.cz/mod/page/view.php?id=5278 4/6

Bariéra je speciální proměnná, pomocí které lze synchronizovat skupinu vláken. Jakmile vlákno dorazí k bariéře, bude zablokováno až do okamžiku, než k bariéře dorazí daný počet vláken. Deklarace a inicializace: barrier_t barrier; // deklarace bariéry barrier_init(&barrier, 3); // stanovení počtu vláken k synchronizaci Použití bariér v jednotlivých vláknech: barrier_wait(&barrier); // čekání na daný počet vláken // nyní poběží vlákna souběžně 7.2.1 Bariéra v posixových vláknech Příklad knihovny, která podporuje bariéry, je knihovna posixových vláken. Pro použití bariér je však třeba definovat symbol _XOPEN_SOURCEna hodnotu 600 nebo vyšší ještě před vložením hlavičkového souboru posixových vláken. Deklarace a inicializace: #define _XOPEN_SOURCE 600 // před načtením pthread.h #include <pthread.h> pthread_barrier_t barrier; // deklarace bariéry int rc; // pro uložení návratového stavu rc = pthread_barrier_init(&barrier, NULL, 3); // stanovení počtu vláken k synchronizaci Pokud se má po uvolnění vláken provést nějaká jednorázová akce, lze využít návratové hodnoty čekací funkce, která vrátí právě jednomu vláknu hodnotu PTHREAD_BARRIER_SERIAL_THREADa ostatním hodnotu nula. Jiná hodnota pak znamená chybový stav. Použití bariér v jednotlivých posixových vláknech: rc = pthread_barrier_wait(&barrier); // čekání na daný počet vláken // nyní poběží vlákna souběžně switch (rc) { case PTHREAD_BARRIER_SERIAL_THREAD: // provede se v jediném (nespecifikovaném) vlákně case 0: // provede se ve všech vláknech break; default: // nastala chyba perror("pthread_barrier_wait"); 7.3 Podmínková proměnná Podmínkové proměnné umožňují vláknům čekat na nějakou událost pomocí operace condition_wait. Událost je signalizována operací condition_signal. Pokud žádné vlákno nečeká, je signál ztracen, proto se používá podmínková proměnná společně s testem, zda je třeba čekat. http://fei-learn.upceucebny.cz/mod/page/view.php?id=5278 5/6

Protože test na potřebu čekání nutně používá sdílenou proměnnou, je nutné zajistit vzájemné vylučování například pomocí mutexu. bool done = false; // stav dokončení cond_t cond; // synchronizační podmínková proměnná mutex_t mutex; // mutex pro zajištění vzájemné výlučnosti přístupu k proměnným Kód vlákna provádějícího akci, zde vypočtení hodnoty sdílené proměnné x: x = calculate(); // provedení akce mutex_lock(mutex); // zajištění exkluzivního přístupu done = true; // nastavení stavu dokončení condition_signal(cond); // signalizace dokončení akce mutex_unlock(mutex); // uvolnění přístupu Kód vlákna čekajícího na dokončení akce: mutex_lock(mutex); // zajištění exkluzivního přístupu if (!done) // pokud akce ještě nebyla dokončena, condition_wait(cond); // čekej na dokončení akce mutex_unlock(mutex); // uvolnění přístupu use(x); // použití hodnoty sdílené proměnné x vypočtené jiným vláknem 7.4 Opakování 1. Definujte koncept monitoru a popište jeho vlastnosti. 2. Popište řízení přístupu do kritické sekce pomocí monitoru. 3. Řešte synchronizaci vláken pomocí monitoru. 4. Popište problému svázaných producentů a konzumentů pomocí monitoru. 5. Popište bariéru a způsob jejich použití. 6. Popište podmínkovou proměnnou a synchronizaci vláken pomocí ní. Naposledy změněno: Pondělí, 7. říjen 2013, 15.20 http://fei-learn.upceucebny.cz/mod/page/view.php?id=5278 6/6