Sunteți pe pagina 1din 38

Sincronizarea taskurilor (procese sau fire de executie):

Exemplu:

Task 1

Task 2

face_ceva_1();
afiseaza(Mesaj1 Task 1);
face_altceva();
afiseaza(Mesaj 2 Task 1);
exit();

face_ceva_2();
afiseaza(Mesaj 1 Task 2);
face_altceva_3();
exit();

dorim ca ordinea de afisare a mesajelor sa fie urmatoarea:

$ Mesaj 1 Task 1
$ Mesaj 1 Task 2
$ Mesaj 2 Task 1

cum facem ? sincronizam activitatile


11-Mar-16

Programarea Aplicatiilor in Timp-Real

31

Sincronizarea taskurilor:

un task contine una sau mai multe activitati


activitatile alocate taskurilor care compun o aplicatie pot fi independente sau dependente de
executia altor activitati
pot fi descrise prin intermediul sistemelor de activitati
o activitate independenta intr-un sistem de activitati reprezinta o secventa de instructiuni in
care nu exista sincronizari (interactiuni cu alte task-uri).
regiunile care nu interactioneaza se grupeaza in blocuri
A11, A21, A12 sunt activitati independente
A22 activitate dependenta
PS punct de sincronizare

11-Mar-16

Programarea Aplicatiilor in Timp-Real

32

Sincronizarea taskurilor - sistem de activitati:

intr-un sistem de activitati se poate introduce o relatie de ordine partiala pe multimea


activitatilor, si anume, scriem

Ai < A j

pentru a specifica faptul ca activitatea Aj poate avea loc numai dupa terminarea activitatii Ai
astfel, o aplicatie in care exista relatii de sincronizare intre activitatile componente se poate
descrie prin intermediul unui un graf de precedenta, in care nodurile reprezinta activitati, iar
arcele reprezinta relatia de precedenta <

11-Mar-16

Programarea Aplicatiilor in Timp-Real

33

Sincronizarea taskurilor - sistem de activitati (exemplu):


A1

A1
A2

A2

A3

A4

A4
A5

A5

A3

A6

A6
A7

A1
A7

Task 1
A2

A3

A4

Task 2

Executia secventiala realizeaza implicit


sincronizari

A5

A6
Task 3

Punem in evidenta sincronizari explicite


care vor fi rezolvate prin intermediul
apelurilor de sistem

11-Mar-16

Programarea Aplicatiilor in Timp-Real

A7

34

Sincronizarea taskurilor - sistem de activitati (exemplu):

Punem in evidenta sincronizari explicite care vor fi rezolvate prin intermediul apelurilor de
sistem

A1
Task 1
A2

A3

A1

A4
Task 1

Task 2

A2
A5

S144

A6

A3
Task 2

Task 3
A5

S13

A4

A6

A7

Task 3

A7

S67
11-Mar-16

Programarea Aplicatiilor in Timp-Real

35

Sincronizarea taskurilor - sistem de activitati (exemplu):

se incearca sa se minimizeze apelurile de sistem (sincronizari explicite)

pentru exemplul anterior definim taskurile si sincronizarile explicite

Task 1

Task 2

Task 3

A1
A2

A3

A5

A4
A6

A7
11-Mar-16

Programarea Aplicatiilor in Timp-Real


36

Mecanisme pentru realizarea sincronizarii - semafoare:

introduse de Dijkstra in 1965

protejeaza accesul la resursele critice (dispozitive periferice, memorie partajata, etc


furnizeaza un mecanism pentru sincronizarea taskurilor (procese si fire de executie)

ideea: doua sau mai multe taskuri pot coopera, receptionand sau transmitand anumite semnale,
in functie de care isi pot coordona activitatile
pentru semnalizare se utilizeaza variabile speciale = semafoare

pentru a transmite un semnal prin intermediul semaforului s, taskul executa o primitiva


signal(s)
pentru a receptiona un semnal prin intermediul semaforului s, taskul executa primitiva
wait(s)
notatii (Dijkstra)

pentru wait se foloseste notatia P

proberen (to test) / passeren (to pass)


pentru signal se foloseste notatia V

verhogen (to increment) / vrygeven (to release)


11-Mar-16

Programarea Aplicatiilor in Timp-Real

37

Mecanisme pentru realizarea sincronizarii - semafoare:

un semafor s poate fi considerat a fi o variabila de tip intreg asupra careia se executa cele
doua primitive, P si V, astfel:

primitiva P (operatia de tip wait) decrementeaza valoarea semaforului. Daca valoarea


semaforului devine < 0, taskul care a executat P(s) se blocheaza
primitiva V (operatia de tip signal) incrementeaza valoarea semaforului. Daca valoarea
este > 0, este deblocat procesul care s-a blocat in P(s)
un semafor poate fi initializat cu o valoare > 0

doar aceste trei operatii pot fi executate pe un semafor, adica:

initializare
primitiva P, P(s)
primitiva V, V(s)

11-Mar-16

Programarea Aplicatiilor in Timp-Real

38

Mecanisme pentru realizarea sincronizarii - semafoare:

primitivele P si V sunt atomice

primitiva P

nu pot si intrerupte, fiecare rutina este tratata ca un pas indivizibil


sunt de tip test-and-set

intr-un singur pas: testeaza, decrementeaza si trece daca valoarea semaforului ramane > 0

primitiva V

intr-un singur pas: incrementeaza si deblocheaza taskul care asteapta pe valoare semafor > 0

11-Mar-16

Programarea Aplicatiilor in Timp-Real

39

Mecanisme pentru realizarea sincronizarii - semafoare:

observatie:

semafor liber daca valoarea > 0


semafor ocupat daca valoare = 0

exista doua tipuri de semafoare


binare (pot lua valoarea 0 sau 1)

liber, daca valoare 1

ocupat, daca valoare 0


generalizate (pot lua orice valoare intreaga pozitiva, > 0)

liber, daca valoare > 0

ocupat, daca valoare 0


se utilizeaza o coada de taskuri (procese) care asteapta pe semaforul respectiv de obicei
ordinea de acces este de tip FIFO

11-Mar-16

Programarea Aplicatiilor in Timp-Real

40

Semafoare binare:

Notam SB = {valB, q}, unde valB= {0,1}

operatia de tip P(SB) are urmatoarele efecte:

daca valoarea SB = 1, atunci task-ul apelant isi continua executia, facand in acelasi timp ca
val(SB) = 0;
daca initial val(SB) = 0, atunci task-ul apelant este trecut n asteptare (este inserat in q(SB)) si se
da controlul planificatorului de task-uri;
operatia de tip V(SB) are urmatoarele efecte:
se face val(SB) = 1. Daca exista task-uri n coada q, unul si numai unul este scos din coada si
este trecut n starea gata de executie (READY). Se da controlul planificatorului de task-uri.

11-Mar-16

Programarea Aplicatiilor in Timp-Real

41

Semafoare binare (cont.):

Operatiile primitive se definesc astfel:

procedura P(var S:boolean)


// initial S este FALSE
{
while(S == TRUE)
// suspenda orice proces care apeleaza
S = TRUE;
// semaforul pana cind S devine FALSE
}

procedura V(var S:boolean)


{
S = FALSE;
//seteaza semaforul S la FALSE
}

11-Mar-16

Programarea Aplicatiilor in Timp-Real

42

Semafoare binare (cont.):

Observatii:

directivele P si V sunt indivizibile (atomice)

la primitiva V se garanteaza faptul ca un singur task este scos (eventual) din coada de
asteptare la semafor
primitiva V aplicata unui semafor binar a carui valoare este 1, nu are nici un efect

11-Mar-16

Programarea Aplicatiilor in Timp-Real

43

Semafoare binare (cont.):

Exemplu:

folosim un semafor binar, SB


cu valoare initiala val(SB) = 0
Task 1
....

PS1:

Task 2

Task 1

Task 2

....

...
V(SB)
...

...
P(SB)
...

PS2:
....

DEVINE
...

garanteaza faptul ca blocul A22 se executa intotdeauna dupa blocurile A11 si A21

ordinea exacta stabilita de planificatorul de taskuri, in functie de prioritatile taskurilor

11-Mar-16

Programarea Aplicatiilor in Timp-Real

44

Semafoare binare - exemplu:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

45

Semafoare binare - exemplu:

sincronizare simetrica (taskurile se asteapta reciproc)

initial S1 = 0, S2 = 0

Task 1
....
PS1: V(S2)
P(S1)
...

11-Mar-16

Task 2
....
PS2: P(S2)
V(S1)
...

atentie: valoarea initiala a semafoarelor (sa nu blocam taskurile reciproc)

Programarea Aplicatiilor in Timp-Real

46

Semafoare binare - exemplu:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

47

Semafoare binare exemplu (cont.)

11-Mar-16

Programarea Aplicatiilor in Timp-Real

48

Semafoare binare - exemplu:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

49

Semafoare binare exemplu program (1):

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
sem_t Sem[6];
int u[] = {3, 7, 4, 2, 1, 5, 6, 2};
int x2, x4;
int a3, b1, d1, c2;
void* calc1(int * );
void* calc2(int * );
void* calc3(int * );
void* calc4(int * );
void* calc5(int * );
void* (*calc[])(int*) = {calc1, calc2, calc3, calc4, calc5};

11-Mar-16

Programarea Aplicatiilor in Timp-Real

50

Semafoare binare exemplu program (2):


int main(void){
pthread_t Task[5];
pthread_attr_t attr;
int i, val = 2;
for(i=0; i<6;i++)
if(!sem_init(Sem+i, 1, 0)){}
else
printf("Eroare la initializarea semaforului numarul %d \n", i+1);

pthread_attr_init(&attr);
for(i = 0; i<5; i++)
if( pthread_create(Task+i, &attr, (void*)(*(calc+i)), (void*)&val) !=0 ){
perror("pthread_create");
return EXIT_FAILURE;
}
for(i=0; i<5; i++)
if(pthread_join(*(Task+i), NULL) != 0){
perror("pthread_join");
return EXIT_FAILURE;
}
printf("\nMain: toate taskurile s-au terminat ... exit ... \n");
printf("Valoarea polinomului in punctul x = %d este %d\n", val, a3);
for(i=0; i<6; i++)
sem_destroy(Sem+i);
exit(0);
}

11-Mar-16

Programarea Aplicatiilor in Timp-Real

51

Semafoare binare exemplu program (3):


void* calc1(int* v){
int valoare = *v;
int a1, a2;
a1 = u[6] + u[7]*valoare;
sem_wait(Sem);
sem_wait(Sem+3);
a2 = b1 + a1*x2;
sem_wait(Sem+4);
sem_wait(Sem+5);
a3 = c2 + a2*x4;
printf("Task1 ... a3 = %d \n", a3);
}
void* calc2(int* v){
int valoare = *v;
b1 = u[4] + u[5]*valoare;
sem_post(Sem);
}
void* calc3(int* v){
int valoare = *v;
int c1 = u[2] + u[3]*valoare;
sem_wait(Sem+2);
sem_wait(Sem+3);
c2 = c1*x2 + d1;
sem_post(Sem+4);
}

11-Mar-16

Programarea Aplicatiilor in Timp-Real

52

Semafoare binare exemplu program (4):

void* calc4(int* v){


int valoare = *v;
d1 = u[0] + u[1]*valoare;
sem_post(Sem+2);
}
void* calc5(int* v){
int valoare = *v;
x2 = valoare*valoare;
sem_post(Sem+3);
sem_post(Sem+3);
x4 = x2*x2;
sem_post(Sem+5);
}

11-Mar-16

Programarea Aplicatiilor in Timp-Real

53

Sincronizarea taskurilor - semafoare generalizate:

pot fi utilizate pentru a proteja mai multe resurse sau pentru a tine evidenta mai multor
resurse

semaforul generalizat este initializat cu numarul total de resurse de acelasi fel


disponibile in sistem

semaforul generalizat
este initializat cu o valoare intreaga > 0

specifica acces liber daca valoarea sa este > 0


specifica interdictia accesului daca valoarea sa este 0

11-Mar-16

Programarea Aplicatiilor in Timp-Real

54

Sincronizarea taskurilor - semafoare generalizate:

notatie
SG = (valSB, qSB)

primitiva P(SG)
decrementeaza valoarea semaforului
valSG <--- valSG - 1
conditia de trecere este valSG > 0

primitiva V(SG)
face valSG <--- valSG + 1
necesitatea: o operatie V asupra unui semafor binar cu valoarea 1 nu are nici un efect

11-Mar-16

Programarea Aplicatiilor in Timp-Real

55

Sincronizarea taskurilor - semafoare generalizate:

observatie: unele sisteme de operare nu dispun de semafoare generalizate


semafoarele generalizate pot fi implementate software cu ajutorul semafoarelor
binare

exemplu:
exista un numar de R resurse identice disponibile
notam MP primitiva de tip P
notam MV primitiva de tip V
accesul la resursele partajate se realizeaza prin intermediul noilor primitive, MP si
MV

11-Mar-16

Programarea Aplicatiilor in Timp-Real

56

Sincronizarea taskurilor - semafoare generalizate:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

57

Sincronizarea taskurilor - semafoare generalizate (exemplu):

11-Mar-16

Programarea Aplicatiilor in Timp-Real

58

Sincronizarea taskurilor - semafoare generalizate (exemplu):

11-Mar-16

Programarea Aplicatiilor in Timp-Real

59

Semafoare sub QNX:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

60

Semafoare sub QNX:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

61

Semafoare sub QNX:

QNX - semafoare pentru controlul accesului la resurse

administrare

#include <semaphore.h>

unnamed semaphores

int sem_init( sem_t * sem, int pshared, unsigned value );


int sem_destroy( sem_t * sem );
sem_t * sem_open( const char * sem_name, int oflags, [int sharing, unsigned int val] );
int sem_close( sem_t * sem );
int sem_unlink( const char * sem_name );

utilizare
#include <semaphore.h>
int sem_post( sem_t * sem );
int sem_trywait( sem_t * sem );
int sem_wait( sem_t * sem );
int sem_getvalue( sem_t * sem, int * value );

11-Mar-16

Programarea Aplicatiilor in Timp-Real

named semaphores

62

Semafoare sub QNX:

QNX Neutrino are semafoare generalizate (counting semaphores)

atunci cand semaforul este creat (cu sem_open() sau sem_init() call) parametrul val specifica
o valoare (count) - 0 inseamna none are available

apelul lui sem_wait() verifica daca valoarea count este > 0, decrementeaza count si returns
success, altfel apelul blocheaza taskulun sem_post() incrementeaza valoarea count, deblocand
taskul care asteapta
Exista doua variante de semafoare:

named semaphores: sunt create cu sem_open(), inchise cu sem_close(), distruse cu


sem_unlink()

unnamed semaphores: create cu sem_init(), si distruse cu sem_destroy()

permit proceselor sa acceseze un semafor comun, cunoscut prin nume; este singura
comunicatie intre procese

sunt utile intre firele unui proces, structura semaforului (de tip sem_t) trebuie sa fie
disponibila in memoria comuna, sau intre procese la care structura semaforului este
mapata intr-un obiect de memorie

indiferent de tipul semaforului, se aplica functiile sem_post(), sem_trywait(), sem_wait(), si


sem_getvalue()

11-Mar-16

Programarea Aplicatiilor in Timp-Real

63

Semafoare sub QNX:

unnamed vs named semaphores

unnamed semaphores sunt mai rapide decat named semaphores, pentru ca

in cazul unnamed, functiile sem_post() si sem_wait() apeleaza direct


nucleul
in cazul named, functiile sem_post() and sem_wait() trimit mesaje la
procesul mqueue, care apeleaza apoi functia de sistem pentru semafor

Daca se utilizeaza semafoare pentru un proces cu


mai multe fire de executie, se recomanda
folosirea semafoarelor unnamed, deoarece
pot fi definite ca o variabila globala

11-Mar-16

Programarea Aplicatiilor in Timp-Real

64

11-Mar-16

Programarea Aplicatiilor in Timp-Real

65

Semafoare sub QNX:

11-Mar-16

Programarea Aplicatiilor in Timp-Real

66

Sincronizare prin intermediul variabilelor de tip


eveniment:

in anumite sisteme (nuclee) de operare in timp-real exista evenimente

un tip special de variabile care pot fi utilizate pentru sincronizare

sunt asemanatoare semafoarelor binare, pot lua doua valori 1 (liber) si 0


(ocupat)

trecerea de punctul de asteptare pe eveniment nu modifica valoarea variabilei de


tip eveniment !

operatiile care se pot executa pe o variabila de tip eveniment nu sunt


atomice

11-Mar-16

nu pot fi folosite pentru excludere mutuala !

Programarea Aplicatiilor in Timp-Real

67

Sincronizare prin intermediul variabilelor de tip eveniment:

executie ciclica si sincronizare pentru doua taskuri


Task 1

Task 2

Initializare

Initializare

actiune_1()

clear_ev(flag)

set_ev(flag)

actiune_2()

actiune_4()

wait_set_ev(flag)

actiune_3()

11-Mar-16

Programarea Aplicatiilor in Timp-Real

68

S-ar putea să vă placă și

  • Curs 1 PATR 15-16
    Curs 1 PATR 15-16
    Document41 pagini
    Curs 1 PATR 15-16
    Andrei Gabriel
    Încă nu există evaluări
  • Lab 5. Bayes Part 4
    Lab 5. Bayes Part 4
    Document16 pagini
    Lab 5. Bayes Part 4
    Andrei Gabriel
    Încă nu există evaluări
  • Curs 2 PATR
    Curs 2 PATR
    Document47 pagini
    Curs 2 PATR
    Andrei Gabriel
    Încă nu există evaluări
  • Test1 1
    Test1 1
    Document1 pagină
    Test1 1
    Andrei Gabriel
    Încă nu există evaluări
  • Probabilitati I
    Probabilitati I
    Document14 pagini
    Probabilitati I
    Andrei Gabriel
    Încă nu există evaluări
  • Bobina Ca
    Bobina Ca
    Document2 pagini
    Bobina Ca
    Andrei Gabriel
    Încă nu există evaluări
  • Elemente de Mecanică Analitică
    Elemente de Mecanică Analitică
    Document14 pagini
    Elemente de Mecanică Analitică
    Andrei Gabriel
    Încă nu există evaluări
  • Arbori Binari
    Arbori Binari
    Document14 pagini
    Arbori Binari
    Catalin Serban
    Încă nu există evaluări
  • Drept Roman
    Drept Roman
    Document435 pagini
    Drept Roman
    Andrei Gabriel
    Încă nu există evaluări
  • Dosar
    Dosar
    Document213 pagini
    Dosar
    Andrei Gabriel
    Încă nu există evaluări
  • Prob
    Prob
    Document1 pagină
    Prob
    Andrei Gabriel
    Încă nu există evaluări
  • As Vrea Sa
    As Vrea Sa
    Document2 pagini
    As Vrea Sa
    Andrei Gabriel
    Încă nu există evaluări
  • Curs 1 PI - AIA
    Curs 1 PI - AIA
    Document6 pagini
    Curs 1 PI - AIA
    Andrei Gabriel
    Încă nu există evaluări
  • Fileshare - Ro PARTIAL ELTHswa
    Fileshare - Ro PARTIAL ELTHswa
    Document20 pagini
    Fileshare - Ro PARTIAL ELTHswa
    Andrei Gabriel
    Încă nu există evaluări
  • Cand Dragostea Vorbeste
    Cand Dragostea Vorbeste
    Document2 pagini
    Cand Dragostea Vorbeste
    Andrei Gabriel
    Încă nu există evaluări
  • Fisa de Lectura
    Fisa de Lectura
    Document1 pagină
    Fisa de Lectura
    Iacovici Diana
    Încă nu există evaluări
  • Decizie Numire Responsabil Psi
    Decizie Numire Responsabil Psi
    Document1 pagină
    Decizie Numire Responsabil Psi
    ionutza2010
    Încă nu există evaluări
  • Comediile Domnului Caragiale
    Comediile Domnului Caragiale
    Document8 pagini
    Comediile Domnului Caragiale
    bubu_bubu
    Încă nu există evaluări