51

Cursul 5 - andrei.clubcisco.roandrei.clubcisco.ro/cursuri/3so/cursuri/05.Sincronizarea proceselor... · 25.03.2009 2 Suport curs 5 OSC Capitolul 6 Process Synchronization Sec iunile

Embed Size (px)

Citation preview

Cursul 5

5Sincronizarea proceselor25 martie 2009

25.03.2009 2

Suport curs 5

� OSC� Capitolul 6 � Process Synchronization

� �Sec iunile 6.1-6.5, 6.6.1, 6.6.2, 6.8.2-6.8.4� Capitolul 7 - Deadlocks

� MOS� Capitolul 2 � Processes and Threads

� �Sec iunile 2.3.1�2.3.6, 2.3.9, 2.4.2� Capitolul 3 - Deadlocks

� Little Book of Semaphores� Capitolele 1, 2, 3� �Capitolul 4 � Sec iunile 4.1, 4.2

25.03.2009 3

Cuprins

� Problematica IPC� �Condi ii de curs ; sincronizare�� Regiuni critice� Semafoare; mutexuri; bariere� Problema produc tor-consumator�� Problema cititori-scriitori� Deadlock-uri

25.03.2009 4

Comunicarea între procese (IPC)

� Colaborare� �schimb de informa ie� �partajarea informa iei

� � �Concuren /competi ie�� acces exclusiv (regiuni critice)

� rezultate predictibile� �accesul concurent poate produce inconsisten e� serializarea accesului

� Coordonare� � � �ordonarea ac iunilor unui proces în func ie de ac iunile altui proces� sincronizare

25.03.2009 5

�Acces exclusiv i sincronizare

� �Un proces (P1) folose te cu resursa R� Un alt proces (P2) solicit resursa R prelucrat de P1� �� �P2 trebuie s a tepte (� acces exclusiv) eliberarea resursei R

� � �P1 folose te R1 i produce R2� P2 solicit R2�� �P2 trebuie s a tepte ca P1 s produc R2 (� � � sincronizare)

� Mecanisme de tip eveniment� signal/notify � � notific producerea evenimentului/ac iunii�� wait � � a teapt producerea evenimentului pentru sincronizare�

25.03.2009 6

Acces concurent

� �Resurs comun � fi ier, zon de memorie� � �

� �Situa iea = 0 /* initializare */

� � �dou instan e de execu ie ruleaz� �if (a == 0)

a++;

� �Ce valoare va avea a dup execu ie?�

25.03.2009 7

�Condi ii de curs (race conditions)�

if (a == 0)

a++;

if (a == 0)a++;

a = 0

a = 1

a = 2

proces 1 proces 2

25.03.2009 8

�Opera ii atomice

� � �Opera ii care se execut într-un singur ciclu de instruc iune�� În câte cicluri se execut a++?�� �Secven posibil :� �

thread1 thread2 a reg1 reg2

load a, reg1 0 0 0

inc reg1 0 1 0

load a, reg2 0 1 1

inc reg2 0 1 1

store reg2, a 1 1 1

store reg1, a 1 1 1

25.03.2009 9

Regiuni critice

� Critical sections� �P r i din program care acceseaz resurse partajate� �� � �Pot fi executate în paralel de mai multe instan e de execu ie� Exemple

� a++� �parcurgerea/ad ugarea/ tergerea unor elemente dintr-o list� �

� �Se pot genera condi ii de curs�� �solu ie: protejare prin excludere mutual�

� � �o singur instan de execu ie are acces la regiunea critic� � �� serializarea accesului

25.03.2009 10

Regiuni critice (2)

25.03.2009 11

Excludere mutual�

� Implementare busy-waiting� � �procesul care a teapt s intre în regiunea critic folose te procesorul� � �� testare în bucl a valorii unei variabile�

� Implementare blocant�� �procesul care a teapt s intre în regiunea critic este trecut în starea � � �

BLOCKED� când regiunea critic este liber , procesul este trecut în starea � �

READY/RUNNING

25.03.2009 12

Dezactivarea întreruperilor

� �Asigur protec ie doar pe sisteme uniprocesor�� �pe un sistem uniprocesor o schimbare de context este ini iat �

numai prin intermediul unei întreruperi� dezactivare întreruperi = nu mai exist schimb ri de context� �

� Avantaje/dezavantaje� simplitate� relativ lent�� �func ioneaz doar pe sisteme uniprocesor�� poate fi folosit doar din cod kernel�

25.03.2009 13

Kernel preemptiv/non-preemptiv

� Codul kernel este cod executat de toate procesele� �structurile de date ale kernel-ului sunt susceptibile la condi ii de curs�

� Kernel preemptiv� un proces poate fi preemptat în timp ce ruleaz cod kernel�� mai complex de implementat� timp bun de r spuns�

� Kernel non-preemptiv� �procesul care ruleaz cod kernel nu poate fi preemptat decât la ie irea din �

kernel� mai simplu de implementat� �laten mai mare�� pot ap rea probleme de sincronizare pe sisteme SMP�

25.03.2009 14

Lock-uri

� La intrarea în regiunea critic se apeleaz LOCK� �� �La ie irea din regiunea critic se apeleaz UNLOCK� �� Este implementarea corect ?�

void LOCK(void){

while (lock > 0)continue;

lock++;}

void UNLOCK(void){

lock--;}

25.03.2009 15

Alternare strict�

� �Procesul mai lent îl ine pe loc pe cel lalt�

while (TRUE) {while (turn != 0)

continue;critical_region();turn = 1;noncritical_region();

}

while (TRUE) {while (turn != 1)

continue;critical_region();turn = 0;noncritical_region();

}

25.03.2009 16

Algoritmul lui Peterson

int turn;

int interested[2];

void enter_region(int process)

{

int other = 1 – process;

interested[process] = 1;

turn = process;

while (turn == process && interested[other] == 1)

continue;}

void leave_region(int process)

{

interested[process] = FALSE;

}

25.03.2009 17

Hardware de sincronizare

� TestAndSet/TSL (Test and Set Lock)� TSL RX, LOCK

� �se cite te variabila LOCK în registrul RX� se pune valoarea TRUE (activat) în LOCK� �opera ia se execut atomic�

� Echivalent cuboolean TestAndSet(boolean *target)

{

boolean rv = *target;

*target = TRUE;

return rv;

}

25.03.2009 18

Hardware de sincronizare (2)

� Exemplu de utilizare TestAndSet

do {

while (TestAndSetLock(&lock))

Continue;

/* regiune critica */

lock = FALSE;

/* regiune non-critica */

} while (TRUE);

25.03.2009 19

Spinlock-uri

� Necesit suport hardware�� �Pe sistemele multiprocesor se folosesc în combina ie

cu acces exclusiv la magistral�� �Solu ie independent de num rul de procesoare� �

enter_region:TSL RX, LOCKCMP RX, 0JNE enter_region

exit_region:MOV LOCK, 0

25.03.2009 20

Excludere mutual prin blocare�

� De ce nu busy-waiting?� irosire timp procesor

� Când este util busy-waiting?� �când timpul de a teptare este mic

� Excludere mutual prin blocare�� sleep() -> trece procesul în starea BLOCKED

� wakeup() -> trece procesul în starea READY� necesit suportul scheduler-ului�

25.03.2009 21

Problema produc tor-consumator�

� Dou tipuri de procese�� procese produc tor�� procese consumator

� Un buffer comun de elemente

� Un produc tor nu poate produce dac bufferul este plin� �� Un consumator nu poate consuma dac bufferul este gol�

25.03.2009 22

Problema produc tor-consumator (sleep & wakeup)�

void producer(void)

{

int item;

while (TRUE) {

item = produce();

if (count == N)

Sleep();

insert_item(item);

count++;

if (count == 1)

wake_up(consumer);

}

}

void consumer(void)

{

int item;

while (TRUE) {

if (count == 0)

sleep();

item = remove_item(item);

count--;

if (count == N-1)

wake_up(producer);

consume_item(item);

}

}

�condi ie de curs :�se pierde wake-up-ul

25.03.2009 23

Semafoare

� �Rezolvarea problemelor cu sleep i wakeup� Dijkstra 1965

� Semaforul are asociat un contor� �Opera ii pe semafor - atomice

� P (proberen = to test) (down/get/acquire)� contorul este decrementat dac este strict pozitiv�� altfel, procesul este trecut în starea BLOCKED

� V (verhogen = to increment) (up/post/release)� contorul este incrementat� dac exist procese blocate la semafor sunt trezite� �

25.03.2009 24

Problema produc tor-consumator (semafoare)�

void consumer(void)

{

int item;

while(TRUE) {

P(to_empty);

item = remove_item();

V(to_full);

consume_item();

}

}

void producer(void)

{

int item;

while (TRUE) {

item = produce_item();

P(to_full);

insert_item(item);

V(to_empty);

}

}

semaphore to_full = N;semaphore to_empty = 0;

25.03.2009 25

Mutex-uri

� Semafoare binare� Dou st ri:� �

� locked� unlocked

� Asem n tor unui spinlock f r busy-waiting� � � �

P(mutex);

/* regiune critica */

V(mutex)

25.03.2009 26

�P-C (semafoare i mutex-uri)

void producer(void)

{

int item;

while(TRUE) {

P(to_empty);P(mutex);item = remove_item();V(mutex);V(to_full);consume_item();

}

}

void producer(void)

{

int item;

while (TRUE) {

item = produce_item();P(to_full);P(mutex);insert_item(item);V(mutex);V(to_empty);

}

}

semaphore to_full = N;semaphore to_empty = 0;semaphore mutex = 1;

Asigurarea excluderii mutuale la lucrul cu bufferul

25.03.2009 27

Implementare posibil mutex �

� Similar cu implementarea spinlock-urilor (non-busy waiting)�� �Simpl i eficient (nu necesit trap în kernel dac regiunea � � � �

critic este liber )� �

mutex_lock:TSL RX, MUTEXCMP RX, 0JZE okCALL sched_yieldJMP mutex_lock

ok:

mutex_unlock:MOV MUTEX, 0...

25.03.2009 28

Implementare semafor

typedef struct {

int value;

struct process *list;

}

void down(semaphore *s)

{

s->value--;

if (s->value < 0) {

add(s->list, current_process);sleep();

}

}

void up(semaphore *s)

{

if (s->value < 0) {

process = remove_process(s->list);wakeup(process);

}

s->value++;

}

25.03.2009 29

Probleme de sincronizare

� Deadlock� � �dou procese a teapt la un semafor de inut de cel lalt proces� � �� P0: down(&sem_a); down(&sem_b); ...� P1: down(&sem_b); down(&sem_a); ...� �P0 este planificat înainte de ob inerea lui sem_b

� Starvation� ad ugarea/eliminarea proceselor din lista de procese a unui �

semafor se face în ordinea LIFO� �a teptare nedefinit�� �priorit i statice�

25.03.2009 30

Bariere

� Sincronizarea unui grup de procese

� �Utile pentru rezolvarea de probleme inginere ti� � � �o matrice con ine valori ini iale i mai multe prelucr ri succesive care �

trebuie aplicate� �pentru ca un proces s înceap itera ia n, trebuie ca toate procesele s � � �

�încheie itera ia n+1

� �Punctul de întâlnire a proceselor/thread-urilor se nume te rendezvous

25.03.2009 31

Bariere (2)

25.03.2009 32

Barier (3)�

#define N_PROCS 10

size_t count = 0;

semaphore mutex = 1;

semaphore barr_sem = 0;

void barrier(void)

{

down(&mutex);

count++;

if (count == N_PROCS)

up(&barr_sem, N_PROCS);

up(&mutex);

down(&barr_sem);

}

/* UNIX semaphore Z-operation */

#define N_PROCS 10

semaphore barr_sem = N_PROCS;

void barrier(void)

{

down(&barr_sem);

wait_for_zero(&barr_sem);

}

25.03.2009 33

Barier reentrant� �

#define N_PROCS 10

size_t count = 0;

semaphore mutex = 1;

semaphore barr_sem = 0;

void rbarrier(void)

{

down(&mutex);

count++;

if (count == N_PROCS) {

up(&barr_sem, N_PROCS);count = 0;

}

up(&mutex);

down(&barr_sem);

}

� Care este problema?� Procesul care d drumul �

barierei este preemptat dup up(&mutex)�

� Primul proces din noua rund trece de barier� �

25.03.2009 34

Barier reentrant (2)� �

#define N_PROCS 10

size_t count = 0;

semaphore mutex = 1;

semaphore barr_sem_p1 = 0;

semaphore barr_sem_p2 = 0;

void rbarrier_phase1(void)

{

down(&mutex);

count++;

if (count == N_PROCS)

up(&barr_sem_p1, N_PROCS);up(&mutex);

down(&barr_sem_p1);

}

void rbarrier_phase2(void)

{

down(&mutex);

count--;

if (count == 0)

up(&barr_sem_p2, N_PROCS);up(&mutex);

down(&barr_sem_p2);

}

/* usage skeleton */

for(...) {

/* rendezvous */

rbarrier_phase1();

/* critical section */

rbarrier_phase2();

}

25.03.2009 35

Problema cititori-scriitori

� � � �Situa ia în care diverse instan e de execu ie solicit ��acces la o resurs (fi ier/memorie/baz de date)� �

� Acces de citire sau de scriere� Constrângerile de sincronizare

� �oricâ i cititori pot fi în regiunea critic la un moment dat�� scriitorii trebuie s aib acces exclusiv la regiunea critic� � �

� � �Util în aplica iile cu mul i cititori�

25.03.2009 36

Problema cititori-scriitori (2)

do {

down(&excl);

...

/* do writing */

...

up(&excl);

} while (TRUE);

do {

down(&mutex);

read_count++;

if (read_count == 1)

down(&excl);

up(&mutex);

...

/* do reading */

...

down(&mutex)

read_count--;

if (read_count == 0)

up(&excl);

up(&mutex);

} while (TRUE);

25.03.2009 37

Problema cititori-scriitori (3)

� �Problem la solu ia precedent� �� posibil starvation de scriitori� dac exist un flux constant de cititori, scriitorii nu mai intr în � � �

regiunea critic�

� �Încerca i� �implementarea unei solu ii care s evite starvation�� �implementarea unei solu ii cu prioritate pe scriitori� � �încerca i, în prim faz , s nu folosi i �Little Book of � � �

Semaphores�

25.03.2009 38

P-C (transfer de mesaje)

void consumer(void)

{

int item, i;

message m;

while(TRUE) {

receive(producer, &m);

item = extract_item(m);

consume_item();

}

}

void producer(void)

{

int item, i;

message m;

while (TRUE) {

item = producer_item();

build_msg(&m, item);

send(consumer, &m);

}

}

25.03.2009 39

Deadlock - modelare

� Num r finit de resurse (memorie, I/O, CPU)�� �pot exista instan e de resurse (2 CPU, 5 imprimante etc.)

� Set de procese care solicit concurent accesul la resurse�� cerere (request) de folosire a resursei

� �poate fi furnizat imediat sau trebuie s a tepte eliberarea resursei de alt proces� �� malloc/open

� folosire (use)� eliberare (release)

� free/close

25.03.2009 40

�Deadlock � condi ii necesare

� Excludere mutual�� �o resurs este de inut în mod non-partajat� �

� � � �De ine i a teapt (hold & wait)�� � � � � �un proces de ine o resurs i a teapt ob inerea altor resurse de inute de � �

alte procese

� F r preemptare� �� resursele nu pot fi preemptate � un proces elibereaz o resurs � � doar

voluntar

� �A teptare circular (circular wait)�� �exist o mul ime {P0, P1, ..., Pn} de procese�

� � �P0 a teapt o resurs de inut de P1� � �� � �P1 a teapt o resurs de inut de P2� � �� � �... Pn a teapt o resurs de inut de P0� � �

25.03.2009 41

Graful de alocare a resurselor

� Nodurile reprezint�� resurse � p trate�� procese � cercuri

� Arcele reprezint�� �resurs de inut � arc de la resurs la proces� � �� resurs dorit � arc de la proces la resurs� � �

� Se poate demonstra c�� dac � nu exist ciclu în graf, atunci � nu exist deadlock�� dac exist ciclu în graf, este � � posibil s existe deadlock�

25.03.2009 42

Graful de alocare a resurselor (2)

�(a) procesul A de ine resursa R(b) procesul B solicit resursa S�(c) deadlock

25.03.2009 43

Detectare deadlock

� Se analizeaz graful de alocare a resurselor�� Se descoper ciclurile din graf�� Este posibil s existe ciclu dar nu deadlock�� Exist algoritmi formali care pot detecta deadlock-urile din sistem�� �Algoritmul stru ului (UNIX, Windows)

� �nu-mi pas � (laissez-faire)�

25.03.2009 44

Evitare deadlock

� �Se cunoa te ordinea în care un proces solicit resursele�� � �Pe baza acestor cuno tin e se poate planifica accesul la resurse� �Secven sigur� �

� �o secven de proces <P1, P2, ..., Pn>�� solicit rile lui Pi pot fi satisf cute cu resursele actuale libere sau cele � �

�de inute de Pj (j < i)

� Stare sigur (safe state) a sistemului�� �exist o secven sigur pentru procesele sistemului� � �

� Stare nesigur - deadlock�

25.03.2009 45

Prevenire deadlock

� � �Una din cele 4 condi ii necesare pentru existen a unui deadlock nu este satisf cut� �

� Excludere mutual�� greu de eliminat� o bun parte din resurse sunt intrinsec non-partajabile�

� Hold and wait� se cer toate resursele de la început

25.03.2009 46

Prevenire deadlock (2)

� No preemption� dac un proces solicit resurse ocupate, elibereaz resursele � � �

proprii

� �A teptare circular�� ordonare a resurselor (R1 < R2 < ... < Rn)� �dac un proces solicit Ri trebuie s solicite i Rj (j < i)� � �� dac un proces elibereaz Rj trebuie s elibereze Ri (j < i)� � �

25.03.2009 47

Recuperare din deadlock

� Terminarea procesului� toate procesele care �particip � la deadlock�� �câte un proces pân la dispari ia deadlock-ului�

� Preemptarea resurselor� preemptare resurse de la anumite procese� se ofer resursele altor procese�

25.03.2009 48

Cuvinte cheie

� �condi ie de curs�� acces exclusiv� sincronizare� regiune critic�� TSL� spinlock� semafor� mutex

� barier�� barier reentrant� �� produc tor-consumator�� cititori-scriitori� deadlock� graf de alocare a

resurselor� prevenire/evitare

deadlock

25.03.2009 49

�Exerci iu 1

� � �Descrie i o situa ie în care un proces poate fi planificat într-un kernel non-preemptiv în momentul în care execut cod kernel.�

� �De ce folosirea de priorit i statice poate conduce la starvation?�

25.03.2009 50

�Exerci iu 2

� �Care din urm toarele opera ii apeleaz planificatorul de � �procese/thread-uri?� �citirea dintr-un fi ier� �deschiderea unui fi ier� �opera ia P pe un semafor� �opera ia V pe un semafor�

25.03.2009 51

Întreb ri�

?