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



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

Paralelní programování

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

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

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.

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

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

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

PARA Filozofové, kuřáci a holič

Procesy a vlákna - synchronizace

Synchronizace Mgr. Josef Horálek

Paralelní programování

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Programování. Psaní čistého kódu. Martin Urza

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

Programovací jazyk Pascal

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

PREPROCESOR POKRAČOVÁNÍ

VY_32_INOVACE_08_2_04_PR

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

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

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

PB přednáška (26. října 2015)

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

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

Jazyk VHDL zápis čísel, znaků a řetězců. Jazyk VHDL základní datové typy a operátory. Kurz A0B38FPGA Aplikace hradlových polí

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Více o konstruktorech a destruktorech

03. Synchronizace procesů. ZOS 2006, L. Pešička

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

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

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Úvod do programovacích jazyků (Java)

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

NPRG030 Programování I, 2017/18 1 / :22:16

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

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

NPRG030 Programování I, 2010/11

14. Složitější konstrukce

Synchronizace paralelních procesů

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Řídicí struktury. alg3 1

Abstraktní datové typy

NPRG030 Programování I, 2016/17 1 / :58:13

Úvod do programování

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Čipové karty Lekařská informatika

Paralelní programování

Činnost: 1) Vyhodnotí se výraz E. 2) Jeho hodnota se uloží do proměnné V.

Abstraktní datové typy FRONTA

přetížení operátorů (o)

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Mělká a hluboká kopie

Jazyk VHDL konstanty, signály a proměnné. Jazyk VHDL paralelní a sekvenční doména. Kurz A0B38FPGA Aplikace hradlových polí

Digitální učební materiál

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

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Jazykové konstrukce pro paralelní výpočty

5 Rekurze a zásobník. Rekurzivní volání metody

Konstruktory a destruktory

Algoritmizace prostorových úloh

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

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

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

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

Digitální učební materiál

Algoritmizace a programování

Programování v C++ První kroky

Jazyk C# a platforma.net

Tematická oblast: Programování 1 (VY_32_INOVACE_08_1_PR) Anotace: Využití ve výuce: Použité zdroje:

Abstraktní třídy, polymorfní struktury

Digitální učební materiál

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

PB161 Programování v jazyce C++ Přednáška 4

Algoritmizace prostorových úloh

Sada 1 - Základy programování

Digitální učební materiál

Jazyk C# (seminář 6)

Digitální učební materiál

Sada 1 - Základy programování

Operační systémy - modelování a algoritmy paralelních výpočtů

2 Strukturované datové typy Pole Záznam Množina... 4

Algoritmizace a programování

Distribuovaná synchronizace. Paralelní a distribuované systémy. 11. Přednáška Vzájemné vyloučení. Centralizovaný algoritmus - fronta procesů

Grafické znázornění vláken a klasické problémy synchronizace

Digitální učební materiál

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

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

Šablony, kontejnery a iterátory

Digitální učební materiál

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

10. Architektura klient/server a třívrstvá architektura

10. Architektura klient/server a třívrstvá architektura

Souhrn Apendixu A doporučení VHDL

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

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

Transkript:

Cvičení 9 - Monitory na rozdíl od semaforů je monitor jazyková konstrukce monitor = Pascalský blok podobný proceduře nebo fci uvnitř monitoru jsou definovány proměnné, procedury a fce proměnné monitoru nejsou viditelné zvenčí, jsou dostupné pouze procedurám a fcím monitoru procedury a fce jsou viditelné a volatelné zvenčí (vně monitoru) v BACI nemohou být monitory vnořené, v monitoru nelze definovat fci monitor m; var proměnné... procedure p;... inicializace; kód mezi a end se spustí před spuštěním hlavního programu používá se pro inicializaci proměnných monitoru monitory se používají pro vzájemné vyloučení a synchronizaci v jednu chvíli může v monitoru běžet pouze jedna procedura nebo fce výhoda - strukturovaný popis, kód zajišťující vzájemné vyloučení není rozptýlen kritická sekce programu se přesune do monitoru Úloha 4 (ošetření KS pomocí monitoru) Program demonstrující časový souběh ošetřete pomocí monitoru. proměnná x bude proměnnou monitoru vytvoříme procedury monitoru "nastav", "zvětši" a "prozraď" - nastaví hodnotu x, zvětší x o 1, vrátí hodnotu x monitor chápeme jako objekt, procedury jako jeho metody

Řešení: // demonstrace monitoru monitor m { int x; void setx(int val) { x = val; int getx() { return x; void incx() { x++; void a() { int i; for (i=0; i<50; i++) incx(); int main() { setx(0); co { a(); a(); cout << "x=" << getx() << endl;

synchronizace pouze vzájemné vyloučení - nestačí pro synchronizaci (např. nevyřešili bychom problém producent / konzument) pro synchronizaci v monitoru se používají podmínky (condition variables) mohou být definovány pouze v monitoru, neobsahují hodnotu nad podmínkami definovány 2 operace - wait a signal - v BACI procedury: PROCEDURE WAITC(cond : CONDITION); WAITC zablokuje proces v monitoru; pokud je některý proces připraven vstoupit do monitoru, bude mu to dovoleno PROCEDURE SIGNALC(cond : CONDITION); pokud existuje jeden nebo více procesů spících nad podmínkou, jeden vzbudí pokud nad podmínkou nespí žádný proces, nedělá nic (na rozdíl od operace V(sem) nad semaforem, která si "zapamatuje" že byla zavolána) Hoarova definice monitoru - v BACI spící je vzbuzen ihned, proto je proces volající SIGNALC pozastaven Co pokusit se řešit mutexy pomocí monitorů? monitor uuu; var c: condition; l: boolean:=false; procedure mylock; if l then waitc(c); l:=true; procedure myunlock; l:=false; signalc(c);

Implementace spravedlivých semaforů Fce empty oproti tradičním monitorům v BACI navíc fce empty(cond: condition) vrací true pokud nad podmínkou cond nikdo nespí jinak vrací false Prioritní čekání PROCEDURE WAITC(cond: CONDITION); WAITC zablokuje proces v monitoru; pokud je některý proces připraven vstoupit do monitoru, bude mu to dovoleno PROCEDURE WAITC(cond: CONDITION; prio: INTEGER); jako WAITC(cond), ale procesu je přiřazena priorita pro vzbuzení (tj. pořadí, ve kterém budou procesy vzbuzeny); defaultní priorita je 10 nižší číslo = vyšší priorita většina reálných implementací monitorů (např. v Javě, Delphi apod.) nemá prioritní WAIT prioritní schéma lze použít pro implementaci FIFO pro buzení čekajících procesů zavedeme proměnnou monitoru s aktuální prioritou prio := prio+1; WAITC(cond, prio); PROCEDURE SIGNALC(cond: CONDITION); pokud existuje jeden nebo více procesů spících nad podmínkou, vzbudí proces s nejnižším číslem "prio" (proces s nejvyšší prioritou) pokud nad podmínkou nespí žádný proces, nedělá nic (na rozdíl od operace V(sem) nad semaforem, která si "zapamatuje" že byla zavolána) v BACI spící je vzbuzen ihned - proto je proces volající SIGNALC pozastaven => procesy volající SIGNALC to provádějí typicky jako svou poslední instrukci

Úloha 1 (večeřící filosofové) 5 filosofů sedí kolem kulatého stolu každý filosof před sebou talíř se špagetami mezi každými dvěma talíři je vidlička špagety jsou tak klouzavé, že filosof potřebuje 2 vidličky, aby mohl jíst program by měl vypisovat: "Filosof #N ji" pozor - syntaxe BACI: místo konstant se nedají používat konstantní výrazy problém s fcí modulo: (-1 mod 3) je -1 monitor večeřící_filosofové; const N=5; var f: array [0.. N-1] of integer; { vidličky a: array [0.. N-1] of condition; { vidličky jsou k dispozici i: integer; procedure chci_jíst(i: integer) if f[i] < 2 then a[i].wait; f[(i-1) mod N] -= 1; f[(i+1) mod N] -= 1; procedure mám_dost(i: integer) f[(i-1) mod N] += 1; f[(i+1) mod N] += 1; if f[(i-1) mod N] = 2 then a[(i-1) mod N].signal; if f[(i+1) mod N] = 2 then a[(i+1) mod N].signal for i:=0 to 4 do f[i] := 2;

Úloha 2 (implementace semaforů pomocí monitorů) Na přednášce jsme si řekli, že stejnou vyjadřovací sílu semaforů a monitorů můžeme ukázat tím, že budeme semafory implementovat pomocí monitorů a naopak. Na přednášce bylo uvedeno řešení semaforů pomocí monitorů. Jak bychom implementovali monitory pomocí semaforů? operace nad semafory jsou definovány takto: operace P(sem): pokud sem>0, sníží sem o 1 jinak pozastaví proces, který chtěl provést operaci P. operace V(sem): pokud je nad semaforem sem zablokovaný jeden nebo více procesů, vzbudí jeden z procesů; proces pro vzbuzení je vybrán náhodně jinak zvýší sem o 1 implementace bude obsahovat následující procedury monitoru: monp - provede operaci P nad jedním semaforem implementovaným v monitoru monv - provede operaci V Řešení: monitor monsem; var sem: integer; blocked: condition; procedure monp; if sem > 0 then sem := sem - 1 else waitc(blocked)

procedure monv; if not empty(blocked) then signalc(blocked) else sem := sem + 1 procedure monini(val: integer); sem := val { inicializace sem:=1 Rozšíření 2-1 (implementace bez fce empty) jak byste implementovali semafory pomocí monitorů, pokud by nebyla fce empty()? monitor monsem2; var sem: integer; blocked: condition; procedure monp; if sem=0 then waitc(con); sem:=sem-1; procedure monv; signalc(con); sem:=sem+1

{ inicializace sem:=1 Rozšíření 2-2 (implementace množiny semaforů) dovolte uživateli označit semafor const hodnotou v rozsahu 1 až 3 (tj. číslo bude sloužit jako "handle" pro přístup k semaforu, resp. ve vaší implementaci bude indexem pro přístup k odpovídajícím proměnným) * procedura implementující - operaci P bude monp(s: integer) - operaci V bude monv(s: integer) - inicializaci semaforu monini(s: integer, val: integer) Poznámka: Řešení není maximálně paralelní, protože vzájemné vyloučení při operacích P a V se odehrává i v případě, že se operace odehrávají nad různými semafory. V reálných programovacích jazycích bývají monitory součástí konstrukce typu objekt - s každým objektem je sdružen monitor (v BACI by bylo podobné chování možné emulovat pomocí samostatného monitoru pro každý semafor). Úloha 3 (spravedlivé semafory pomocí monitorů) Semafor v BACI je implementován podle Dijkstrovy definice, tj. procesy spící nad semaforem jsou buzeny v náhodném pořadí. Pro nekončící procesy však v sobě náhodné buzení skrývá nebezpečí, že dojde k vyhladovění některého procesu. Ve většině reálných OS se proto používají tzv. spravedlivé semafory, kde jsou procesy buzeny ve FIFO pořadí. pomocí prioritního čekání rozšířit na "spravedlivé" semafory. procedury FIFO_P(sem: integer), FIFO_V(sem: integer).

ověřit, že je funkční a pracuje jako FIFO Úloha 4 (producent/konzument pomocí monitorů) Implementujte řešení zjednodušeného problému producent/konzument pomocí monitoru. Velikost vyrovbávací paměti bude pouze jeden znak nebo integer. program simple_prod_cons; monitor m; var e, f: condition; isempty: boolean; buffer: integer; procedure insert(x: integer); if not isempty then waitc(e); buffer:=x; isempty:=false; signalc(f) procedure remove(var x: integer); if isempty then waitc(f); x:=buffer; isempty:=true; signalc(e); procedure Producer; var i: integer; for i:=1 to 99 do

insert(i); procedure Consumer; var x: integer; repeat remove(x); write(x, ', '); until x=99; writeln co Producer; Consumer coend end.