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

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

Synchronizace paralelních procesů

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

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

Procesy a vlákna - synchronizace

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

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

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.

Paralelní programování

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ů

Paralelní programování

Synchronizace Mgr. Josef Horálek

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

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

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

Procesy a vlákna (Processes and Threads)

Synchronizace procesů

Chapter 7: Process Synchronization

Synchronizace procesů

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 5: Multiprogramming a multitasking, vlákna

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

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

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)

Téma 36. Petr Husa

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

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

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

Management procesu I Mgr. Josef Horálek

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

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

ÚVOD DO OPERAČNÍCH SYSTÉMŮ

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

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)

Možnosti programování se sdílenými proměnnými. Týden 6 Programování se sdílenými proměnnými (Shared Variables, SV) Procesy a vlákna.

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

Paralelní programování

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

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

Paralelní programování

Paralelní programování

Principy operačních systémů. Lekce 7: Obrana proti deadlocku

Jazykové konstrukce pro paralelní výpočty

Pavel Procházka. 3. prosince 2014

Ukázka zkouškové písemka OSY

Paralelní programování

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

Operační systémy. Přednáška 2: Procesy a vlákna

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

Paralelní programování

Paralelní programování

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Operační systémy. Přednáška 3: Plánování procesů a vláken

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

Chapter 6: Process Syncronization

B4B35OSY: Operační systémy

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

Management procesu II Mgr. Josef Horálek

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

Paralelní programování

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

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

Architektury VLIW M. Skrbek a I. Šimeček

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

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

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

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

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

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

Čipové karty Lekařská informatika

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

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

Česká letecká servisní a. s.

Téma 4. Synchronizace a deadlock

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

x86 assembler and inline assembler in GCC

PROGRAMOVÁNÍ ŘÍDÍCÍCH SYSTÉMŮ

Princip funkce počítače

Operační systémy. Tomáš Vojnar IOS 2009/2010. Vysoké učení technické v Brně Fakulta informačních technologií Božetěchova 2, Brno

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

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

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

Principy operačních systémů. Lekce 4: Správa procesů

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

Vlákna Co je to vlákno?

Chapter 6: Process Synchronization

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

Základní komunikační operace

BI-JPO. (Jednotky počítače) M. Sběrnice

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í

Chapter 6: Process Synchronization

PB002 Základy informačních technologií

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

Poslední aktualizace: 21. května 2015

Základní úrovně: Moorův zákon: multi-core mikroprocesory (CPU) hypertherading pipeline many-core Paralelní systém Instrukce iterace procedura Proces

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

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

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Transkript:

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 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti 1

Paralelní výpočet problémy Bez použití synchronizace Časově závislé chyby (race conditions) = situace kdy více procesů/vláken přistupuje (read/write) ke sdílenému objektu a výsledek je závislý na přepínání kontextu. Při použití synchronizace Uváznutí (deadlock) = situace, kdy několik procesů/vláken čekají na událost, kterou může vyvolat pouze jeden z čekajících procesů/vláken. Livelock = situace, kdy několik procesů/vláken vykonává neužitečnou práci (mění svůj stav), ale nemohou postoupit k vykonávaní užitečné práce. Hladovění (starvation) = situace, kdy ready proces/vlákno je předbíháno a nedostane se k prostředkům. 2

Synchronizační nástroje Hardware Disabling Interrupts (DI) Test and Set Lock instruction (TSL) Exchange instruction (XCHNG) Kernel space Linux: atomic operation, spin locks, reader-writer locks, Solaris: spin locks, adaptive locks, reader-writer locks,... MS Windows: executive dispatcher objects, slim reader-write locks,... User space POSIX Thread: mutexes, condition variables, semaphores, Unix: pipes, signals, System V semaphores, message queues, MS Windows: mutexes, reader-writer locks, semaphores, events,... 3

Aktivní čekání x blokování Pouze jeden proces může vstoupit do kritické sekce. Ostatní procesy musí počkat dokud se kritická sekce neuvolní. Aktivní čekání (busy waiting, spinning) sdílená proměnná indikuje obsazenost kritické sekce proces ve smyčce testuje aktuální hodnotu proměnné do okamžiku než se sekce uvolní Blokování proces provede systémové volání, které ho zablokuje do okamžiku než se sekce uvolní 4

Zákaz přerušení (DI) CPU je přidělováno postupně jednotlivým procesům za pomoci přerušení od časovače nebo jiného přerušení. Proces zakáže všechna přerušení před vstupem do kritické sekce a opět je povolí až po opuštění kritické sekce. Např. instrukce cli/sti pro Intel. Nevýhoda: DI od jednoho uživatele blokuje i ostatní uživatele. Ve víceprocesorovém systému, DI má efekt pouze na aktuálním CPU. Zpomalí reakce na přerušení. Problém se špatně napsanými programy (zablokují CPU). Užitečná technika uvnitř jádra a na jednoprocesorovém systému (ale pouze na krátký čas). Není vhodná pro běžné uživatelské procesy!!! 5

Lock proměnná Vzájemné vyloučení pomocí (sdílené) lock proměnné, kterou proces nastaví když vstupuje do kritické sekce. int lock=0;... while (lock == 1); /* busy waiting is doing */ lock=1; critical_section(); lock=0;... Je to správné řešení? 6

Striktní střídání /* Thread T0 */... while (TRUE) { while (turn!= 0); /* wait */ critical_section(); turn=1; noncritical_section(); /* Thread T1 */... while (TRUE) { while (turn!= 1); /* wait */ critical_section(); turn=0; noncritical_section(); Nevýhody Jedeno vlákno může zpomalit ostatní vlákna. Vlákno nemůže vstoupit do kritické sekce opakovaně (je porušen 3.bod z nutných podmínek... ). 7

Petersonův algoritmus T. Dekker (1968) navrhl algoritmus, který nevyžadoval striktní střídání. G. L. Peterson (1981) popsal jednodušší verzi tohoto algoritmu. L. Hoffman (1990) zobecnil řešení pro n procesů. 8

#define FALSE 0 #define TRUE 1 #define N 2 /* number of processes */ int turn; /* whose turn is it? */ int interested[n]; /* all values initially FALSE */ void enter_section (int process) /* process is 0 or 1 */ { int other; /* number of other processes */ other = 1 - process; /* the opposite of process */ interested[process] = TRUE; /* show that you are interested */ turn = process; /* set flag */ while (turn == process && interested[other]); /* busy waiting */ void leave_section (int process) /* process: who is leaving */ { interested[process] = FALSE; /* indicate departure from CS */ Petersonův algoritmus 9

Instrukce TSL Test and Set Lock (TSL) instrukce načte obsah slova z dané adresy v paměti do registru a nastaví obsah slova na nenulovou hodnotu. CPU provádějící TSL instrukci zamkne paměťovou sběrnici, aby znemožnilo ostatním CPU v přístupu do sdílené paměti dokud se instrukce TSL nedokončí. TSL je atomická instrukce => korektní hardwarové řešení. Výhody TSL může být použita při synchronizaci v multiprocesorových systémech se sdílenou pamětí. 10

Instrukce TSL enter_region: TSL REGISTER,LOCK I copy lock to register and set lock to 1 CMP REGISTER,#0 was lock zero? JNE enter_region I if it was nonzero, lock was set, so loop RET I return to caller; critical region entered leave_region: MOVE LOCK,#0 RET I store a 0 in lock I return to caller Source: A. Tanenbaum, Modern Operating Systems 11

Instrukce XCHG Alternativa k TSL instrukci Exchange instrukce (XCHG) atomicky prohodí obsah slova na dané adrese v paměti a registru. enter_region: MOVE REGISTER,#1 XCHG REGISTER, LOCK CMP REGISTER,#0 JNE enter_region RET I put a 1 in the register I swap the contents of the register and lock variable I was lock zero? I if it was non zero, lock was set, so loop return to caller; critical region entered leave_region: MOVE LOCK,#0 RET I store a 0 in lock I return to caller Source: A. Tanenbaum, Modern Operating Systems 12

Příklady reálných instrukcí Intel procesory xchg (exchanges contents) cmpxchgl (compare-exchange long) Sparc procesory ldstup (load-store unsigned byte) cas (compare-and-swap) 13

Vlastnosti aktivního čekání Pokud se dlouho čeká na vstup do kritické sekce, pak dochází k plýtvání časem procesoru. Pokud OS používá prioritní plánování, potom může vzniknout inverzní prioritní problém proces A má nižší prioritu a nachází se v kritické sekci proces B má vyšší prioritu a čeká pomocí aktivního čekání na vstup do kritické sekce pokud přiřazená priorita je fixní dojde k uváznutí 14

Vzájemné vyloučení pomocí bokování Lepší způsob než zákaz přerušení nebo aktivní čekání. Procesy, které nemohou vstoupit do kritické sekce jsou zablokovány (jejich stav se změnil na blocked a jsou umístěny do čekací fronty). Blokující a deblokující operace jsou obvykle implementovány jako služby jádra OS. 15

sleep() a wakeup() sleep() Systémové volání, které zablokuje proces, který ho zavolal. Zakáže alokování CPU pro tento proces a přesune ho do fronty kde bude čekat. wakeup(proces) Opačná operace, proces je uvolněn z fronty čekajících procesů a bude mu opět přidělováno CPU. Příklady MUTEX (MUTual EXclusion lock) pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock() Podmíněné proměnné pthread_cond_wait(), pthread_cond_signal(), pthread_cond_broadcast() 16

IPC Problém: Producent - konzument Jeden z klasických synchronizačních problémů, který demonstruje problémy paralelního programování. Producent produkuje data a vkládá je do sdílené paměti. Konzument vybírá data ze sdílené paměti. 17

Řešení pomocí sleep()/wakeup() define N 100 /* number of slots in the buffer */ int count = 0; /* number of items in buffer */ void producer(void) { int item; while(true) { item = produce_item(); if (count == N) sleep(); /* if buffer is full, go to sleep */ insert_item(item); count = count + 1; if (count == 1) wakeup(consumer); /* was buffer empty? */ void consumer(void) { int item; while (TRUE) { if (count == 0) sleep(); /* if buffer is empty, go to sleep */ remove_item(&item) count = count 1; if (count == N - 1) wakeup(producer); /* was buffer full? */ consume_item(&item); 18

Řešení pomocí sleep()/wakeup() Abychom se vyhnuli časově závislým chybám, musí být zaručeno, že nedojde k přepnutí kontextu po otestovaní proměnné count. Tato podmínka není v tomto řešení garantována. Problém Operace wakeup() je zavolána na proces, který není ještě uspán. Co se stane? Řešení Wakeup waiting bit. Když je wakeup() zavolána na proces, který ještě nespí, tento bit je nastaven. Při pokusu uspat proces, který má nastaven tento bit, proces se neuspí, ale pouze se resetuje daný bit. 19

Semafory Datový typ semafor obsahuje čítač a frontu čekajících procesů. Nabízí tři základní operace: Init(): Čítač se nastaví na zadané číslo (většinou 1) a fronta se vyprázdní. Down(): Pokud je čítač větší než nula, potom se sníží o jedničku. V opačném případě se volající proces zablokuje a uloží do fronty. Up(): Pokud nějaké procesy čekají ve frontě, potom se jeden z nich probudí. V opačném případě se čítač zvětší o jedničku. Každá z těchto instrukcí je prováděna atomicky (tzn. že během jejího provádění nemůže být přerušena). 20

Semafory Počáteční hodnota čítače semaforu určuje kolik procesů může sdílet nějaký prostředek současně. Z počáteční a aktuální hodnoty lze potom určit, kolik procesů je v daném okamžiku v kritické sekci. Binární semafor Je často nazýván mutex (mutual exclusion). Čítač semaforu je na začátku nastaven na jedničku. Umožňuje jednoduše synchronizovat přístup do kritické sekce. Příklady POSIX: sem_wait(), sem_trywait(), sem_post() UNIX System V: semget(), semctrl(), semop() 21

Kritická sekce hlídaná semaforem typedef int semaphore; semaphore mutex = 1; /* control access to critical section(cs)*/ void process_a(void) { while (TRUE) {... down(&mutex); /* enter CS */ critical_section_of_a; up(&mutex); /* leave CS */... void process_b(void) { while (TRUE) {... down(&mutex); /* enter CS */ critical_section_of_b; up(&mutex); /* leave CS */... 22

Producent-konzument pomocí semaforů #define N 100 /* number slots in buffer */ semaphore mutex = 1; /* guards critical section (CS)*/ semaphore empty = N; /* counts empty slots*/ semaphore full = 0; /* counts full slots*/ void producer(void) { itemtype item; while (TRUE) { produce_item(&item); down(&empty); down(&mutex); /* enter CS*/ enter_item(item); up(&mutex); /* leave CS*/ up(&full); void consumer(void) { itemtype item; while (TRUE) { down(&full); down(&mutex); /* enter CS */ remove_item(&item); up(&mutex); /* leave CS */ up(&empty); consume_item(item); 23

Monitory Problém se semafory Pokud například zapomenete použít operaci up() na konci kritické sekce, potom procesy čekající ve frontě budou čekat navždy (uváznutí). Řešení Vyšší úroveň synchronizace se nazývá monitory. Monitor je konstrukce vyšších programovacích jazyků, která nabízí stejné možnosti jako semafor. Pouze jeden proces může být prováděn uvnitř monitoru v jednom okamžiku. Monitory byly implementovány například v Concurrent Pascal, Pascal-Plus, Modula-2, Modula-3, Java,.NET, 24

Monitory Monitor Množina procedur, proměnných a datových struktur, které jsou seskupeny dohromady ve speciálním modulu/objektu. Pouze jeden proces může být aktivní v daném monitoru v jednom okamžiku. Překladač (nikoliv programátor) se stará o vzájemné vyloučení uvnitř monitoru. Podmíněné proměnné Předdefinovaný datový typ, který umožní pozastavit a opět spustit běžící proces. Operace Wait(c): Pozastaví volající proces na podmíněné proměnné c. Signal(c): Spustí některý z pozastavených procesů na podmíněné proměnné c. 25

Producent-konzument pomocí monitoru monitor Buffer begin_monitor var Buff : array[0..max] of ItemType; count: integer; Full, Empty : condition; procedure Insert(E : ItemType); begin if count = N then Wait(Full); insert_item(e); count := count + 1; if count = 1 then Signal(Empty); end; procedure Remove(var E : ItemType); begin if count = 0 then Wait(Empty); remove_item(e); count := count - 1; if count = N - 1 then Signal(Full); end; count:=0; end_monitor; procedure Producer; begin while true do begin item := produce_item(item); Buffer.Insert(item); end end; procedure Consumer; begin while true do begin Buffer.Remove(item); consume_item(item); end end; 26

Bariéry Pro bariéru definujeme minimální počet procesů/vláken N, které ji mohou prolomit. Když proces dojde k bariéře, tak je zablokován do té doby dokud všech N procesů nedorazí k bariéře. Příklady pthread_barrierattr_init(), pthread_barrier_wait(), pthread_barrierattr_destroy() 27

Zasílání zpráv Dvě základní operace: send(destination,&message), receive(source,&message). Synchronizace Blokující send(), blokující receive() (rendezvous). Neblokující send(), blokující receive(). Neblokující send(), neblokující receive() + test příchozích zpráv. Adresování Přímé: zpráva je uložena přímo do prostoru daného příjemce. Nepřímé: zpráva je uložena dočasně do sdílené datové struktury (mailbox). To umožňuje lépe implementovat kolektivní komunikační algoritmy (one-to-one, one-to-many, many-to-many). Příklad: MPI (Message-Passing Interface). 28

Producent-konzument pomocí zasílání zpráv Typ operací send() je neblokující. receive() je blokující. Všechny zprávy mají stejnou velikost. 29

Producent-konzument pomocí zasílání zpráv #define N 100 /* slots in shared buffer */ void producer(void) { int item; message m, e; while (TRUE) { item = produce_item(); receive(consumer,&e); /* wait for an empty */ build_message(&m,item); /* construct a message */ send(consumer,&m); /* send to consumer */ void consumer(void) { int item, i; message m, e; for (i = 0; i < N; i++) send(producer, &e); /* send N empties */ while (TRUE) { receive(producer, &m); /* get message */ item = extract_item(&m) /* extract item from message */ send(producer,&e); /* send back empty reply */ consume_item(item); 30