Sunteți pe pagina 1din 16

PROGRAMAREA APLICATIILOR IN TIMP REAL Curs 4 Probleme caracteristice ale proiectarii aplicatiilor software in timp-real - concurenta - continuare -

Probleme caracteristice ale proiectarii aplicatiilor software in timp-real:


sincronizarea taskurilor excluderea mutuala (pentru acces la resurse partajate) comunicarea intre taskuri

aspecte colaterale:

deadlock starvation

Continutul cursului 4:

excludere mutuala definitie excludere mutuala modalitati de implementare mecanisme de implementare a operatiilor de excludere mutuala semafoare binare mutex-uri exemple: problema producator - consumator

Excluderea mutuala - definitie:

Excluderea mutuala = abilitatea mai multor taskuri de a imparti resurse sau date in asa fel incat un singur proces sa aiba acces la o resursa partajata (engl. shared resource) la un moment dat

fiecare din taskurile care acceseaza resursa partajata executa o sectiune (zona) critica (adica o secventa de instructiuni cu care se

acceseaza resursele partajate imprimanta, zone de date comune, etc)

un singur task poate executa sectiunea critica la un moment dat, restul fiind blocate mecanisme pentru implementarea excluderii mutuale semafoare binare, mutex-uri (caz particular de semafor binar) monitoare transmitere de mesaje

Excluderea mutuala:

se realizeaza cu semafoare binare este initializat cu valoarea 1 in fiecare task avem o secventa de instructiuni organizate sub forma unei sectiuni (zona) critice se aloca un singur semafor binar pentru toate taskurile (problema este globala si simetrica) o valoare 1 a semaforului binar semnific` faptul c` este permis accesul in zona critic` o valoare 0 a semaforului binar semnific` faptul c` nu este permis accesul n zona critic`
in fiecare task, la intrarea si iesirea din sectiunea ctitica avem o secventa de instructiuni de forma
P(S); sectiune critica; V(S);

Excluderea mutuala - conditii:

solutiile de implementare trebuie sa asigure urmatoarele conditii: sa nu existe situatii de blocare (un task care asteapta sa intre n zona sa critica trebuie sa obtina accesul dupa un timp finit) toate task-urile care asteapta intrarea n zona critica respectiva trebuie sa obtina accesul la un moment dat in consecinta: zonele critice trebuie sa fie ct mai scurte (este de preferat sa nu contina operatii de I/O) zonele critice trebuie sa se execute n timp finit in zona critica a unui task nu se definesc alte zone critice, sincronizari, etc, pentru ca ele pot conduce foarte usor la blocare

Excluderea mutuala exemplu: problema producator consumator:

o aplicatie formata din doua (tipuri de) taskuri task producator: genereaza date (periodic) - produce date task consumator: utilizeaza datele produse de taskul producator consuma date conditii pentru functionare corecta: ordinea n care se consuma datele trebuie sa fie identica cu ordinea n care sunt produse datele un set de date produse nu trebuie consumat de doua ori sa se consume toate seturile de date produse (sa nu se piarda date) presupunem, pentru simplitate, comunicarea prin zona comuna de date, careia i se ataseaza un semafor binar S pentru excludere mutuala, cu valoare initiala 1

Excluderea mutuala exemplu: problema producator consumator - solutie:

solutie de implementare cu doua semafoare binare, cu urmatoarea semnificatie: S1 = "1" : producatorul are un set de date noi

S2 = "1" : consumatorul a preluat un set de date si poate primi un set nou

valorile initiale ale semafoarelor sunt S = 1, S1 = 0, S2 = 1

Excluderea mutuala exemplu: problema producator consumator - solutie:

solutie de implementare cu buffer asociat, de dimensiune finita poate memora N date si poate fi considerat ca o coada circulara asupra lui se executa operatii de citire / scriere de tip modulo(N)

Task produc`tor Task consumator

Blocat Deblocat inserare n buffer plin inserare item scoate din buffer gol scoate item

Resurse utilizate: locale 2 indici de acces la buffer pentru scriere, in pentru citire, out globale - un semafor binar pentru acces la zona comuna de date si doua semafoare generalizate pentru buffer PLIN si buffer GOL

Excluderea mutuala exemplu: problema producator consumator - solutie:

solutia se implementeaza cu semafoare generalizate:

Initializari (global):
const int N; SB = 1; GOL = 0; PLIN = N; in = out = 0; // dimensiune buffer //semaforul binar pentru sectiunea critica //semafor general pentru buffer gol // semafor general pentru buffer plin // indicii de scriere / citire in / din buffer

Excluderea mutuala exemplu: problema producator consumator - solutie:


in taskul producator se produc date in taskul consumator se consuma date


task_producator() { produce_date(); //produce item v si il scrie in //buffer in urmatoarea pozitie libera b[in] = v; in = (in + 1)%n; } task_consumator() { // citeste item-ul w din buffer si actualizeaza // pozitia de citire w = b[out]; out = (out + 1)%n; consuma_date(); }

Bibliografie: Programarea aplicatiilor in timp-real, pag. 114

Excludere mutuala - mutex-uri:

in anumite sisteme, semafoarele binare se folosesc numai pentru excludere mutuala si se numesc "lock". In acest caz primitivele sunt urmatoarele: lock() ... sectiune critica unlock() exemplu: QNX

exista mutex-uri (mutual exclusion locks) pentru realizarea sincronizarii in cazul firelor de executie create in cadrul unui proces semafoarele de folosesc in special pentru procese

Excludere mutuala - mutex-uri:

Mutex-ul (engl. mutual exclusion lock) reprezinta cel mai simplu mecanism de sincronizare. Un mutex este folosit pentru a asigura accesul exclusiv la o zona de date folosita in comun de mai multe fire de executie. Un mutex se poate afla in doua stari: incuiat (engl. locked), prin apelul functiei pthread_mutex_lock (se specifica in acest fel inceputul sectiunii critice); liber (engl. unlocked), prin apelul functiei pthread_mutex_unlock (specificand sfarsitul sectiunii critice).

Un singur fir de executie poate incuia un mutex la un moment dat. Firele de executie care incearca sa incuie un mutex deja incuiat se vor bloca pana cand firul de executie va fi deblocat. Cand firul de executie elibereaza mutexul, se va debloca urmatorul fir de executie (in ordinea prioritatii) care astepta eliberarea lui, va incuia mutexul si va deveni proprietarul acestuia. In acest fel, firele de executie trec prin regiunea critica in ordinea prioritatii

Exemplu de utilizare:

Programarea aplicatiilor in timp-real, sectiunea 3.3, pag. 110

Interfata C / POSIX pentru mutex-uri:

Programarea aplicatiilor in timp-real, tabelul 3.2, pag. 112

Mutex-uri (exemplu):

o aplicatie formata din doua fire de executie care incrementeaza un contor (resursa partajata) exemplu - Programarea aplicatiilor in timp-real, listing 4, pag. 111