Documente Academic
Documente Profesional
Documente Cultură
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();
$ Mesaj 1 Task 1
$ Mesaj 1 Task 2
$ Mesaj 2 Task 1
31
Sincronizarea taskurilor:
11-Mar-16
32
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
33
A1
A2
A2
A3
A4
A4
A5
A5
A3
A6
A6
A7
A1
A7
Task 1
A2
A3
A4
Task 2
A5
A6
Task 3
11-Mar-16
A7
34
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
35
Task 1
Task 2
Task 3
A1
A2
A3
A5
A4
A6
A7
11-Mar-16
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
37
un semafor s poate fi considerat a fi o variabila de tip intreg asupra careia se executa cele
doua primitive, P si V, astfel:
initializare
primitiva P, P(s)
primitiva V, V(s)
11-Mar-16
38
primitiva P
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
39
observatie:
11-Mar-16
40
Semafoare binare:
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
41
11-Mar-16
42
Observatii:
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
43
Exemplu:
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
11-Mar-16
44
11-Mar-16
45
initial S1 = 0, S2 = 0
Task 1
....
PS1: V(S2)
P(S1)
...
11-Mar-16
Task 2
....
PS2: P(S2)
V(S1)
...
46
11-Mar-16
47
11-Mar-16
48
11-Mar-16
49
#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
50
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
51
11-Mar-16
52
11-Mar-16
53
pot fi utilizate pentru a proteja mai multe resurse sau pentru a tine evidenta mai multor
resurse
semaforul generalizat
este initializat cu o valoare intreaga > 0
11-Mar-16
54
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
55
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
56
11-Mar-16
57
11-Mar-16
58
11-Mar-16
59
11-Mar-16
60
11-Mar-16
61
administrare
#include <semaphore.h>
unnamed semaphores
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
named semaphores
62
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:
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
11-Mar-16
63
11-Mar-16
64
11-Mar-16
65
11-Mar-16
66
11-Mar-16
67
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
68