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



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

Paralelní programování

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.

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

Paralelní programování

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

Procesy a vlákna - synchronizace

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.

Synchronizace Mgr. Josef Horálek

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

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

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

Vzájemné vyloučení procesů

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)

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

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

PARA Filozofové, kuřáci a holič

Synchronizace paralelních procesů

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

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

Vlákna. První jednoduchý program s vlákny:

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

Procesy a vlákna (Processes and Threads)

Pavel Procházka. 3. prosince 2014

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

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

Výpočet v módu jádro. - přerušení (od zařízení asynchronně) - výjimky - softvérové přerušení. v důsledku událostí

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

ZOS. Verze 2010-srpen-31, v3 L. Pešička

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

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

Přednáška 4. Klasické synchronizační úlohy. Implementace procesů, vláken.

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)

Programovací jazyk Pascal

O datových typech a jejich kontrole

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

Struktura programu v době běhu

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

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

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

Z. Kotala, P. Toman: Java ( Obsah )

5. STRUKTURA PLC PROGRAMU

Paralelní programování

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

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

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

Téma 36. Petr Husa

Paralelní programování

Jazykové konstrukce pro paralelní výpočty

Konstruktory a destruktory

Management procesu I Mgr. Josef Horálek

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

Operační systémy 2: Zápočtové úkoly

TÉMATICKÝ OKRUH Počítače, sítě a operační systémy

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

NPRG030 Programování I, 2015/16 1 / :25:32

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

dovolují dělení velkých úloh na menší = dekompozice

Program a životní cyklus programu

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

Java. Synchronizace v Javě

Souhrn Apendixu A doporučení VHDL

Implementace LL(1) překladů

Česká letecká servisní a. s.

Úvod do programování

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

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

Sada 1 - Základy programování

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

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

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Matematika v programovacích

PB002 Základy informačních technologií

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

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í.

Poslední nenulová číslice faktoriálu

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

Vlákna. První jednoduchý program s vlákny:

Vícevláknové aplikace

Programy v prostředí operačního systému

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

14. Složitější konstrukce

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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

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

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Sdílení dat mezi podprogramy

JavaScript 101. "Trocha života do statických stránek"

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

Procesy a vlákna Mgr. Josef Horálek

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

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

Transkript:

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

Administrativa změna termínů zápočtových testů 7.11.2006 (út), EP130, 18:30 12.12.2006 (út), EP130, 18:30

Semafory Ošetření kritické sekce ukázka více nezávislých kritických sekcí Producent konzument možnost procesu zastavit se a čekat na událost 2 události buffer prázdný spí jeden proces buffer plný spí jiný proces uspání procesu operace semaforu P

Holičství Problém spícího holiče (The barbershop problem) čekárna s N křesly a holičské křeslo žádný zákazník holič spí zákazník vstoupí všechna křesla obsazena odejde holič spí vzbudího křesla volná sedne si na jedno z volných křesel Napsat program, koordinující činnost holiče a zákazníků

Problém spícího holiče proces zákazníka volá funkci gethaircut proces holiče volá funkci cuthair když holič volá cuthair, je právě jeden proces zákazníka volající gethaircut současně

Spící holič datové struktury N počet čekacích křesel customers = 0 počet zákazníků mutex = Semaphore(1) chrání přístup mutexem customer = Semaphore(0) holič čeká na zákazníka (má prázdný obchod) barber = Semaphore(0) zákazník čeká na holiče než mu řekne že má volno

Proces - zákazník 1. mutex.wait () 2. if customers == N+1 3. { mutex.signal (); odchazim_neostrihan_zklaman(); } 4. else { 5. customers += 1; 6. mutex.signal (); 7. customer.signal(); // hlásíme příchod zákazníka 8. barber.wait (); // čekáme, až má holič čas 9. gethaircut (); 10. mutex.wait (); customers -= 1; mutex.signal (); 11. }

Proces holič 1. while (1) { 2. customer.wait (); // čekám na zákazníka 3. barber.signal (); // signalizuji, jsem free 4. cuthair(); 5. }

Holičství Hilzer s Barbershop 3 holičská křesla, 3 holiči čekárna 4 sedící a dále stojící zákazníci požární předpisy maximálně 20 zákazníků v holičství Zákazník vstoupí, není-li překročena kapacita sedne si na pohovku, nebo stojí, je-li plná volný holič zákazník co nejdéle sedí na pohovce je obsloužen a stojící si sedne ostříhaný zákazník holič vezme platbu (jen jedna pokladna v daném čase může platit jen jeden zákazník) Holič stříhá vlasy, přebírá platbu, spí čekaje na zákazníka

Synchronizace Zákazník následující funkce v daném pořadí entershop, sitonsofa, sitinbarberchair, pay, exitshop Holič volá cuthair, acceptpayment Zákazník nemůže entershop, je-li plná kapacita Když je pohovka plná nemůže zavolat sitonsofa dokud jeden ze zákazníků co sedí na pohovce nezavolají sitinbarberchair Dokud všichni tři holiči mají práci, zákazník nemůže zavolat sitinbarberchair, dokud někdo ze zákazníků v křesle nezavolá pay Zákazník musí pay, než holič acceptpayment holič musí acceptpayment, než zákazník může exitshop

FIFO přístup čekající oblasti na stojáka, pohovka spravedlivý přístup k zákazníkům obsluha zákazníků first-in-first-out spravedlivé semafory využívají FIFO

Datové struktury customers = 0 mutex = Semaphore(1) standingroom = Fifo(16) sofa = Fifo(4) chair = Semaphore(3) barber = Semaphore(0) customer = Semaphore(0) cash = Semaphore(0) receipt = Semaphore(0) počet zákazníků čekání ve stoje čekání v sedě volná hol. křesla zaplatí stvrzenka

Holič customer.wait() barber.signal() cuthair() // žádný zákazník,spí // signalizace, holič je volný cash.wait() acceptpayment() receipt.signal() // čekáme až zákazník zapl. // zaplaceno, zákazník ok

Zákazník delší kód uveden v The Little Book of Semaphores (Allen B. Downey), str. 134 (resp. 146) kniha volně dostupná na netu: http://greenteapress.com/semaphores/ knihu doporučuji zájemcům o problematiku synchronizace v OS

Mutexy, monitory Mutexy, implementace Implementace semaforů Problémy se semafory Monitory Různé reakce na signal Implementace monitorů

Mutexy Potřeba zajistit vzájemné vyloučení spin-lock bez aktivního čekání nepotřebujeme obecně schopnost semaforů čítat mutex mutual exclusion paměťový zámek

Implementace mutexu podpora jádra OS mutex_lock:tsl R, mutex ;; R:=mutex a mutex:=1 CMP R, 0 ;; byla v mutex hodnota 0? JE ok ;; pokud byla na OK CALL yield ;; vzdáme se procesoru - naplánuje se jiné vlákno JMP mutex_lock ;; zkusíme znovu, pozdějí ok: RET mutex_unlock: LD mutex, 0 RET ;; ulož 0 do mutex

Implementace mutexu volání yield volající se dobrovolně vzdává procesoru ve prospěch jiných procesů jádro OS přesune proces mezi připravené a časem ho opět naplánuje použití např. vzájemné vyloučení mezi vlákny stejného procesu lze implementovat jako knihovna prog. jazyka

Moderní OS semafory i mutexy obecné (čítající) semafory obecnost i pro řešení problémů meziprocesové komunikace mutexy paměťové zámky, binární semafory pouze pro vzájemné vyloučení při vhodné implementaci efektivnější

Srovnání spin-lock spin-lock vhodný, pokud je čekání krátké a procesy běží paralelně není vhodné pro použití v aplikacích aplikace nepředvídatelné chování obvykle se používá uvnitř jádra OS, v knihovnách,...

Implementace semaforů Procesům poskytneme možnost se pozastavit (zablokovat) při operaci P aktivace operací V

Semafory S každým semaforem je sdruženo: celočíselná proměnná s.c pokud může nabývat i záporné hodnoty s.c vyjadřuje počet blokovaných procesů binární semafor s.mutex vzájemné vyloučení při operacích nad semaforem seznam blokovaných procesů s.l

Seznam blok. procesů Proces, který nemůže dokončit operaci P bude zablokován a uložen do seznamu procesů blokovaných na semaforu s Pokud při operaci V není seznam prázdný vybere ze seznamu jeden proces a odblokuje se

Uložení datové struktury semafor semafory v jádře OS přístup pomocí služeb systému semafory ve sdílené paměti

Popis implementace type semaphore = record m: mutex; // mutex pro přístup k semaforu c: integer; // hodnota semaforu L: seznam procesu end

Popis implement. operace P P(s): mutex_lock(s.m); s.c := s.c - 1; if s.c < 0 then begin zařad volající proces do seznamu s.l; označ volající proces jako BLOKOVANY ; naplánuj některý připravený proces; mutex_unlock(s.mutex); přepni kontext na naplánovaný proces end else mutex_unlock(s.m);

Popis implement. operace V V(s): mutex_lock(s.m); s.c := s.c + 1; if s.c <= 0 then begin vyber a vyjmi proces ze seznamu s.l; odblokuj vybraný proces end; mutex_unlock(s.m);

Popis implementace Pseudokód Skutečná implementace řeší i další detaily Organizace datových struktur Pole, seznamy, Kontrola chyb Např. jeli při operaci V záporné s.c a přitom s.l je prázdné

Popis implementace Implementace v jádře OS Obvykle používá aktivní čekání (spin-lock nad s.mutex) Pouze po dobu operace nad obecným semaforem max. desitky instrukcí - efektivní

Mutexy vs. semafory Mutexy vzájemné vyloučení vláken v jednom procesu Např. knihovní funkce Běží v uživatelském režimu Obecné semafory synchronizace mezi procesy Implementuje jádro OS Běží v režimu jádra Přísup k vnitřním datovým strukturám OS

Problémy se semafory primitiva P a V použita kdekoliv v programu Snadno se udělá chyba Není možné automaticky kontrolovat při překladu

Chyby přehození P a V Přehození P a V operací nad mutexem: Mutex.V() kritická sekce Mutex.P() Důsledek více procesů může vykonávat kritickou sekci současně

Chyby dvě operace P Mutex.P() Kritická sekce Mutex.P() Důsledek - deadlock

Chyby vynechání P, V Proces vynechá mutex.p() Proces vynechá mutex.v() Vynechá obě Důsledek porušení vzájemného vyloučení nebo deadlock

Monitory Snaha najít primitiva vyšší úrovně, která zabrání části potenciálních chyb Hoare (1974) a Hansen (1973) nezávisle na sobě navrhli vysokoúrovňové synchronizační primitivum nazývané monitor Odlišnosti v obou návrzích

Monitor Monitor na rozdíl od semaforů jazyková konstrukce Speciální typ modulu, sdružuje data a procedury, které s nimi mohou manipulovat Procesy mohou volat proceduru monitoru, ale nemohou přistupovat přímo k datům monitoru

Monitor V monitoru může být v jednu chvíli AKTIVNÍ pouze jeden proces Ostatní procesy jsou při pokusu o vstup do monitoru pozastaveny

Terminologie OOP Snaha chápat kritickou sekci jako přístup ke sdílenému objektu Přístup k objektu pouze pomocí určených operací metod Při přístupu k objektu vzájemné vyloučení, přístup po jednom

Monitory v BACI Monitor Pascalský blok podobný proceduře nebo funkci Uvnitř monitoru definovány proměnné, procedury a funkce Proměnné monitoru nejsou viditelné zvenčí Dostupné pouze procedurám a funkcím monitoru Procedury a funkce viditelné a volatelné vně monitoru

Příklad monitoru monitor m; var proměnné... podmínky... procedure p; { procedura uvnitř monitoru } begin... end; begin inicializace; end;

Příklad Použití pro vzájemné vyloučení

monitor m; // příklad vzájemné vyloučení var x: integer; procedure inc_x; { zvětší x } begin x:=x+1; end; function get_x: integer; { vrací x } begin get_x:=x end begin x:=0 end; { inicializace x };

Problém dosavadní definice Výše uvedená definice (částečná) dostačuje pro vzájemné vyloučení ALE nikoliv pro synchronizaci např. řešení producent/konzument Potřebujeme mechanismus, umožňující procesu se pozastavit a tím uvolnit vstup do monitoru S tímto mechanismem jsou monitory úplné

Synchronizace procesů v monitoru Monitory speciální typ proměnné nazývané podmínka (condition variable) Podmínky definovány a použity pouze uvnitř monitoru Nejsou proměnné v klasickém smyslu, neobsahují hodnotu Spíše odkaz na určitou událost nebo stav výpočtu (mělo by se odrážet v názvu podmínky)

Operace nad podmínkami Definovány 2 operace wait a signal C.wait Volající bude pozastaven nad podmínkou C Pokud je některý proces připraven vstoupit do monitoru, bude mu to dovoleno

Operace nad podmínkami C.signal Pokud existuje 1 a více procesů pozastavených nad podmínkou c, reaktivuje jeden z pozastavených procesů, tj. bude mu dovoleno pokračovat v běhu uvnitř monitoru Pokud nad podmínkou nespí žádný proces, nedělá nic Rozdíl oproti V(sem), která si zapamatuje, že byla zavolána

Schéma monitoru

Problém s operací signal Pokud by signál pouze vzbudil proces, běžely by v monitoru dva Vzbuzený proces A proces co zavolal signal ROZPOR s definicí monitoru V monitoru může být v jednu chvíli aktivní pouze jeden proces Několik řešení

Řešení reakce na signal Hoare proces volající c.signal se pozastaví Vzbudí se až poté co předchozí rektivovaný proces opustí monitor nebo se pozastaví Hansen Signal smí být uveden pouze jako poslední příkaz v monitoru Po volání signal musí proces opustit monitor

Jak je to v BACI? Monitory podle Hoara Waitc (cond: condition) Signalc (cond: condition) semantika dle Hoara Waitc (cond: condition, prio: integer) Čekajícímu je možné přiřadit prioritu Vzbuzen bude ten s nejvyšší prioritou Nejvyšší priorita nejnižší číslo prio

Monitory v jazyce Java Existují i jiné varianty monitorů, např. zjednodušené monitory s primitivy wait a notify v jazyce Java a dalších S každým objektem je sdružen monitor, může být i prázdný Metoda nebo blok patřící do monitoru označena klíčovým slovem synchronized

Monitory - Java class jméno { synchronized void metoda() {... } }

Monitory - Java S monitorem je sdružena jedna podmínka, metody: wait() pozastaví volající vlákno notify() označí jedno spící vlákno pro vzbuzení, vzbudí se, až volající opustí monitor (x c.signal, které pozastaví volajícího) notifyall() jakonotify(), ale označí pro vzbuzení všechna spící vlákna

Monitory - Java Pozn. Jde vlastně o třetí řešení problému, jak ošetřit volání signal Čekající může běžet až poté, co proces volající signál opustí monitor

Monitory Java více podmínek Více podmínek, může nastat následujcíí (x od Hoarovských monitorů) Pokud se proces pozastaví, protože proměnná B byla false, nemůže počítat s tím, že po vzbuzení bude B=true

Více podmínek - příklad 2 procesy, nastalo zablokování: P1: if not B1 then c1.wait; P2: if not B2 then c2.wait; Proces běžící v monitoru, způsobí splnění obou podmínek a oznámí to pomocí If B1 then b1.notify; If B2 then b2.notify;

Více podmínek - příklad Po opuštění monitoru se vzbudí proces1 Proces1 způsobí, že B2=false Po vzbuzení P2 bude B2 false Volání metody wait by mělo být v cyklu (x od Hoarovskych) While not B do c.wait;

Java volatile proměnné poznámka Vlákno v Javě si může vytvořit soukromou pracovní kopii sdílené proměnné Zapíše zpět do sdílené paměti pouze při vstupu/výstupu z monitoru Pokud chceme zapisovat proměnnou při každém přístupu deklarovat jako volatile

Shrnutí - monitory Základní varianta Hoarovské monitory V reálných prog. jazycích varianty Prioritní wait (např. BACI) Primitiva wait a notify (Java, Borland Delpi) Výhoda monitorů Automaticky řeší vzájemné vyloučení Větší odolnost proti chybám programátora Nevýhoda Monitory koncepce programovacího jazyka, překladač je musí umět rozpoznat a implementovat

Práce s vlákny v C Některé myšlenky i v rozhraní LINUXu pro práci s vlákny Úsek kódu ohraničený pthread_mutex_lock(m).. pthread_mutex_unlock(m) Uvnitř lze používat obdobu podmínek z monitorů

Práce s vlákny v C pthread_cond_wait(c, m) - atomicky odemkne m a čeká na podmínku pthread_cond_signal(c) - označí 1 vlákno spící nad c pro vzbuzení pthread_cond_broadcast(c) - označí všechna vlákna spící nad c pro vzbuzení

Řešení producent/konzument pomocí monitoru Monitor ProducerConsumer var f, e: condition; i: integer;

procedure enter; begin if i=n then wait(f); {pamět je plná, čekám } enter_item; { vlož položku do bufferu } i:=i+1; if i=1 then signal(e); { prvnıí položka => vzbudím konz. } end; procedure remove; begin if i=0 then wait(e); { pamět je prázdná => čekám } remove_item; { vyjmi položku z bufferu } i:=i-1; if i=n-1 then signal(f); { je zase místo } end;

Inicializační sekce begin i:=0; { inicializace } end end monitor; A vlastní použití monitoru

begin // začátek programu cobegin while true do { producent} begin produkuj zaznam; ProducerConsumer.enter; end {while} while true do { konzument } begin ProducerConsumer.remove; zpracuj zaznam; end {while} coend end.

Implementace monitorů pomocí semaforů Monitory musí umět rozpoznat překladač programovacího jazyka Přeloží je do odpovídajícího kódu Pokud např. OS poskytuje semafory Jak by potom implementace vypadala

Co musí implementace zaručit 1. Běh procesů v monitoru musí být vzájemně vyloučen (pouze 1 v monitoru) 2. Wait musí blokovat aktivní proces v příslušné podmínce 3. Když proces opustí monitor, nebo je blokován podmínkou AND existuje >1 procesů čekajících na vstup do monitoru => musí být jeden z nich vybrán

Implementace monitoru Existuje-li proces pozastavený jako výsledek operace signal, pak je vybrán Jinak je vybrán jeden z procesů čekajících na vstup do monitoru 4. Signal musí zjistit, zda existuje proces čekající nad podmínkou Ano aktuální proces pozastaven a jeden z čekajících reaktivován Ne pokračuje původní proces

Implementace monitoru - poznámky Podrobný popis viz p4monitor.pdf Semafory pozastavení a odblokování procesů Pole semaforů pro každou podmínku jeden Výstupní kod = dovolíme někomu pokračovat Podmínka 3 a, b v tomto pořadí Využívá čítač ucnt