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.



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

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

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

Synchronizace paralelních procesů

PARA Filozofové, kuřáci a holič

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

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

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

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

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

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

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

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

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

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

Paralelní programování

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

Procesy a vlákna - synchronizace

Paralelní programování

Synchronizace Mgr. Josef Horálek

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

Téma 36. Petr Husa

Jak je definována kritická sekce? Jaký je rozdíl mezi aktivním čekáním a blokováním procesů?

Test. 11.(vyp) tz. 9 vypadku (100%)

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

Management procesu II Mgr. Josef Horálek

Chapter 6: Process Syncronization

Anotace. Dynamické programování, diskrétní simulace.

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

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

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

Téma 5 Synchronizace procesů a problém uváznutí Obsah

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.

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

Synchronizace vjj 1

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

Uživatelská příručka Evidence příchozí a odchozí pošty a elektronický archiv. V prostředí společnosti. Pražská vodohospodářská společnost a.s.

Téma 5 Synchronizace procesů a problém uváznutí

Paralelní programování

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Pavel Procházka. 3. prosince 2014

Komunikace eorders. aegis. aegis.cz. Konference Common 2009 Malá Fatra. Evžen Kučera

KIV/PIA Semestrální práce

Chapter 6: Process Synchronization

Chapter 6: Process Synchronization

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

IB109 Návrh a implementace paralelních systémů. Kolektivní komunikační primitava. RNDr. Jiří Barnat, Ph.D.

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)

Chapter 7: Process Synchronization

Programování. Debugging a testování. Martin Urza

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

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

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Úvod do simulace - 1

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

Operační systémy. Cvičení 5: Volání jádra, procesy, vlákna.

PREPROCESOR POKRAČOVÁNÍ

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

Jazykové konstrukce pro paralelní výpočty

Poslední nenulová číslice faktoriálu

PŘETĚŽOVÁNÍ OPERÁTORŮ

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

Česká letecká servisní a. s.

Pojem algoritmus a jeho základní vlastnosti

Abstraktní datové typy FRONTA

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

Abstraktní datové typy

Tabulka. Datová struktura, která umožňuje vkládat a později vybírat informace podle identifikačního klíče. Mohou být:

Algoritmizace. 1. Úvod. Algoritmus

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:

TTreeView je ten strom vlevo (vzhled se dá upravovat) a TListView je ten seznam vpravo (včetně volitelných módů zobrazení jako ikony).

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

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

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

Paralelní programování

Petr Štěpán, K13133 KN-E-129 Téma 5. Synchronizace a deadlock

Lekce 25 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY 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

Práce s velkými sestavami

alkoholu v organismu, jízdu výtahů s lidmi...).

Téma 4. Synchronizace a deadlock

Interpret jazyka IFJ2011

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Zadání Vytvoříme jednoduchý multithread HTTP server v jazyce Java Spustíme si ho na lokálním počítači A otestujeme ho Zdrojový kód je v

Téma 4. Plánování procesů a synchronizace

Třídy a struktury v C++

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ DOKTORSKÁ DISERTAČNÍ PRÁCE

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)

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

Programovací jazyky s podporou vláken Java

PRG036 Technologie XML

B4B35OSY: Operační systémy

Co nabízí Telefonní linka Premium?

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

NetLogo Uživatelská příručka

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

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

Kód Producent-Konzument

Kód Producent-Konzument. Je to korektní řešení?

Karty Prší. Anotace: Abstract: Gymnázium, Praha 6, Arabská 14 předmět Programování, vyučující Tomáš Obdržálek

Transkript:

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. Dvě sémantiky vzhledem k hodnotám čítače: 1. čítač >= 0 Operace DOWN zkontroluje hodnotu semaforu. Jestliže je větší než 0, sníží hodnotu semaforu o 1 a operace skončí. Jestliže je rovna 0, operace DOWN se zablokuje a příslušný proces je přidán do fronty čekajících procesů na daném semaforu. Operace UP zjistí, zda je fronta čekajících procesů na daném semaforu neprázdná. Pokud ano, vybere jeden z čekajících procesů (např. nejdéle čekající) a ten odblokuje (tj. pokračuje za svou operací DOWN). Pokud je fronta prázdná, zvětší čítač semaforu o 1. 2. čítač libovolný (záporná hodnota je počet zablokovaných procesů) Operace DOWN sníží hodnotu semaforu o 1. Jestliže je větší nebo roven 0, operace skončí. Jestliže je menší než 0, operace DOWN se zablokuje a příslušný proces je přidán do fronty čekajících procesů na daném semaforu. Operace UP zvětší čítač semaforu o 1. Pokud je hodnota menší rovna 0, zkontroluje, zda je fronta čekajících procesů na daném semaforu neprázdná. Pokud ano, vybere jeden z čekajících procesů a ten odblokuje. Binární semafory nabývají pouze hodnot 0 a 1. Dá se jimi snadno vytvořit kritická sekce "uzávorkovaná" mezi operace DOWN a UP příslušného semaforu.

Monitory Pro zjednodušení práce a zamezení chyb při použití semaforů bylo navrženo synchronizační primitivum monitor. Monitor je soubor funkcí, proměnných a datových struktur, který jsou sdružen do zvláštního balíku. Procesy smí volat funkce z monitoru, kdykoliv chtějí, ale nemají přístup k proměnným monitoru z funkcí mimo monitor. Navíc monitor zaručuje, že v jednom okamžiku může být aktivní nejvýše jeden proces v jedné instanci monitoru. Monitor je konstrukcí programovacího jazyka a překladač tudíž ví, že funkce monitoru je třeba překládat jinak. Záleží na překladači, jak implementuje monitory (typicky pomocí semaforů). Protože vzájemné vyloučení zařizuje překladač a ne programátor, zabrání se mnoha chybám. Stačí pouze vědět, že všechny kritické operace je třeba provádět v monitorech. Blokování procesů uvnitř funkcí monitoru pomocí podmíněných proměnných a operacemi WAIT a SIGNAL na nich definovaných. Podmíněné proměnné nejsou čítače (na rozdíl od semaforů). Když funkce monitoru zjistí, že nemůže pokračovat, volá operaci WAIT a zablokuje aktivní proces v monitoru. To umožní jinému procesu vniknout do monitoru. Jiný proces může být probuzen pomocí operace SIGNAL (jeden z čekajících z množiny zablokovaných procesů na dané podmíněné proměnné). Tady ale vzniká problém, že v jednom okamžiku jsou dva procesy v jedné instanci monitoru. Existují dvě řešení: 1. Spustit probuzený proces a druhý uspat 2. Proces volající SIGNAL okamžitě opustí monitor.

Zprávy Systémová volání SEND a RECEIVE pro zasílání a příjem zpráv. Zpráva je nějaká přenášená informace mezi odesilatelem a příjemcem. SEND zašle zprávu. Nikdy se nezablokuje. Pokud na zprávu čeká příjemce operací RECEIVE, je mu zpráva doručena a příjemce odblokován. RECEIVE zprávu přijímá. Pokud žádná zpráva není dostupná, přijímající proces je zablokován. Je třeba vyřešit problém adresace, tj. určení odesilatele a příjemce. Lze řešit např. identifikací procesu na daném počítači. Jiným řešením je zavedení schránek (mailboxů) a adresace pomocí identifikace schránky. Schránka je vyrovnávací paměť typicky pevné délky. Do ní jsou zprávy ukládány operací SEND a z ní vybírány operací RECEIVE. Schránka modifikuje operaci SEND: pokud je schránka plná, zablokuje se i SEND. Zajímavým případem je situace, kdy je schránka nulové velikosti. Pokud je odesilatelem proveden SEND a ještě tam není žádný příjemce čekající operací RECEIVE, musí odesilatel počkat. Podobně příjemce čeká na odesilatele, až něco zašle. Po předání zprávy, tj. je provedena operace SEND i RECEIVE na jednu schránku, se oba procesy opět rozběhnou. Tento případ se nazývá dostaveníčko (randezvous).

Ekvivalence primitiv Semafory, monitory a zprávy jsou vzájemně ekvivalentní. Implementace semaforů pomocí zpráv pomocí synchronizačního procesu - serveru semaforů. Problém obědvajících filozofů Pět filozofů sedí kolem kulatého stolu. Každý filozof má talíř špaget. U každého talíře je jedna vidlička. Špagety jsou tak slizké, že je k jídlu zapotřebí dvou vidliček. Život filozofů sestává ze střídajících se období jídla a přemýšlení. Když filozof dostane hlad, pokusí se vzít v libovolném pořadí dvě vidličky přilehlé k jeho talíři. Pokud se mu to podaří, chvilku jí, a pak zase vidličky v libovolném pořadí odloží. Napište program, který simuluje život filozofa.

#define N 5 /* počet filozofů */ void philosopher(int i)/* i: který filozof (0 až N-1) */ for(;;) think(); /* filozof myslí */ take_fork(i); /* vezmi levou vidličku */ take_fork((i+1) % N); /* vezmi pravou vidličku */ eat(); /* hurá na špagety */ put_fork(i); /* odlož levou vidličku */ put_fork((i+1) % N); /* odlož pravou vidličku */ Funkce take_fork vezme vidličku se zablokováním, pokud není dostupná. Pokud ji ale všech pět filozofů uchopí ve stejném okamžiku, všichni se zablokují čekáním na druhou. Je to špatně!!! Modifikace: filozof se uchopí levou vidličku a podívá se, jestli je pravá vidlička volná. Pokud není, položím zpět levou vidličku. Tato modifikace vede ke stavu nazvaném vyhladovění (starvation) - program není zablokovaný, ale nedělá, co by měl. Problém ospalého holiče Holičství má jednoho holiče, jedno holičské křeslo a N křesel pro čekající zákazníky. Jestliže není přítomen žádný zákazník, holič se posadí a spí. Když přijde zákazník, tak probudí holiče a jde si sednou do holičského křesla. Jestliže přijdou další zákaznící a holič už stříhá, tak si sedají do křesel pro zákazníky. Pokud už není žádné volné křeslo pro zákazníky, zákazník odejde. Napište program, který simuluje holiče a zákazníky.

Problém producent/konzument se semafory #define N 100 /* velikost bufferu */ semaphore mutex = 1;/* řídí přístup do kritické sekce */ semaphore empty = N;/* počet volných položek v bufferu */ semaphore full = 0;/* počet užitých položek bufferu */ void producer(void) int item; for(;;) produce_item(&item);/* připrav další prvek */ down(&empty); /* sniž čítač volných položek */ down(&mutex); /* vstup do kritické sekce */ enter_item(item); /* ulož nový prvek do bufferu */ up(&mutex); /* opusť kritickou sekci */ up(&full); /* zvětši počet užitých položek */ void consumer(void) int item; for(;;) down(&full); /* sniž čítač užitých položek */ down(&mutex); /* vstup do kritické sekce */ remove_item(&item);/* načti další prvek z bufferu */ up(&mutex); /* opusť kritickou sekci */ up(&empty); /* zvětši počet volných položek */ consume_item(item);/* zpracuj prvek */

Problém producent/konzument s monitory monitor ProducerConsumer condition full, empty; integer count; procedure enter; if count = N then wait(full); enter_item; count := count + 1; if count = 1 then signal(empty); end; procedure remove; if count = 0 then wait(empty); remove_item; count := count - 1; if count = N-1 then signal(full); end; count := 0; end monitor; procedure producer; while true do produce_item; ProducerConsumer.enter; end end; procedure consumer; while true do ProducerConsumer.remove; consume_item; end end;

Problém producent/konzument se zprávami Předpokládáme, že všechny zaslané a ještě nepřijaté zprávy jsou meziukládány systémem. #define N 100 /* počet položek bufferu */ void producer(void) int item; message m; for(;;) produce_item(&item); receive(consumer, &m); /* čekej na příchod díry */ build_message(&m, item); /* vytvoř zprávu */ send(consumer, &m); /* vyšli prvek */ void consumer(void) int item, i; message m; for(i=0;i<n;i++) send(producer, &m); /* vyšli N děr */ for(;;) receive(producer, &m); /* čekej na příchod prvku */ extract_item(&m, &item); /* vyber prvek */ send(producer, &m); /* vyšli díru */ consume_item(item);

Problém obědvajících filozofů se semafory #define N 5 /* počet filozofů */ #define LEFT (i-1)%n /* číslo levého souseda i */ #define RIGHT (i+1)%n/* číslo pravého souseda i*/ enum THINKING, HUNGRY, EATING state[n]; semaphore mutex = 1; semaphore s[n]; void test(int i) if(state[i]==hungry && state[left]!=eating && state[right]!=eating) state[i] = EATING; up(s[i]); void take_forks(int i) down(mutex); /* vstup do kritické sekce */ state[i] = HUNGRY; /* filozof i má hlad */ test(i); /* zkus získat dvě vidličky */ up(mutex); /* odchod z kritické sekce */ down(s[i]); /* při nezískání vidliček se blokuje */ void put_forks(int i) down(mutex); /* vstup do kritické sekce */ state[i] = THINKING; /* filozof dojedl */ test(left); /* zjisti, zda levý soused může jíst */ test(right); /* zjisti, zda pravý soused může jíst */ up(mutex); /* opusť kritickou sekci */

void philosopher(int i) for(;;) think(); take_forks(i); /* vezmi dvě vidličky */ eat(); put_forks(i); /* odlož obě vidličky */ Problém ospalého holiče #define CHAIRS 5 /* počet volných křesel */ int waiting = 0; /* počet čekajících zákazníků */ void barber(void) for(;;) receive(customer);/* je někdo připraven na holení */ waiting--; /* počet čekajících se sníží */ send(customer); /* pozvu ho do holičského křesla */ cut_hair(); void customer(void) if(waiting<chairs) /* ještě je tu volné křeslo */ waiting++; /* zvyšuje se počet čekajících */ send(barber); /* probuď holiče */ receive(barber); /* došla na mě řada */ get_haircut();