Sunteți pe pagina 1din 3

Managementul threadurilor

Nanu Alexandru Anul II, Informatica Grupa 2 Subgrupa 2

Ce este un thread?
Un fir de executie (un thread) exista in cadrul unui proces si reprezinta o unitate de executie mai fina decat acesta. Ca si procesele, threadurile reprezinta un mecanism prin care un calculator poate sa ruleze mai multe lucruri simultan. In momentul in care un proces este creat, in cadrul lui exista un singur fir de executie. Aceste fire vor rula portiuni ale codului binar asociat cu procesul current, posibil aceleasi cu firul initial. Intre firele de executie si procese exista urmatoarele diferente: - Firele de executie partajeaza majoritatea resurselor unui process pe cand procesele nu partajeaza resursele intre ele; - Fiecare fir de executie are un context propriu de executie format dintr-o stiva si un set de registrii; Deoarece firele de executie ale aceluiasi process folosesc tot spatiul de adrese al procesului de care apartin, folosirea lor are anumite avantaje: - Crearea/ distrugerea unui fir de executie dureaza mai putin decat cea a unui process; - Timpul context switchului intre firele de executie ale aceluiasi process este foarte mic deoarece nu trebuie sa se comute si spatiul de adrese; - Comunicarea intre fire de executie are un overhead minim; Firele de executie simplifica structura unui program, astfel utilizand un numar mai scazut de resurse pentru acesta. Exista trei tipuri de fire de executie: Kernel Level Threads (KLT) Managementul firelor de executie este facut de kernel, iar programele user-space pot creea sau distruge fire de executie printr-o serie de apeluri de sistem; acesta mentine informatii de context pentru procese dar si pentru firele de executie din cadrul acestora, planificarea executiei facandu-se la nivel de fir de executie. User Level Threads (ULT) Kernelul nu cunoaste existenta firelor de executie, managementul acestora facanduse de catre procesul in care exista, folosindu-se cate o biblioteca. De aceea, schimbarea contextului nu necesita intervenirea kernelului, algoritmul de planificare depinzand de aplicatie. Threaduri hibride Acestea incearca sa combine avantajele firelor de executie la nivel de utilizator cu cele ale firelor de executie la nivel de kernel. O modalitate ar fi sa se utilizeze fire de nivel kernel pe care sa fie multiplexate fire de nivel utilizator. Firele de executie la nivel kernel sunt unitati elementare ce pot fi distribuite pe procesoare. De obicei, creearea, planificarea si sincrinizarea firelor de executie se

face in user space. Kernelul stie doar de firele de executie de nivel kernel pe care sunt multiplexate firele de executie de nivel utilizator, planificandu-le doar pe acestea. Programatorul poate sa schimbe numarul de fire de executie la nivel kernel allocate unui process.

Partajarea resurselor intre threaduri


Fiecare fir de executie are propria stiva si propria copie a registrilor procesorului. Celelalte resurse, cum ar fi fisierele, unitatile, datele statice si memoria sunt impartite de toate firele de executie in process. Firele de executie ce folosesc aceste resurse commune trebuie sa isi coordoneze lucrul. Exista mai multe cai de a sincroniza resursele: Sectiunea critica un cod care acceseaza o resursa ce nu se imparte in mod normal; ele sunt folosite de obicei pentru a restriction accesul la un cod sau o data care poate fi folosita doar de un fir de executie, o singura data in cadrul unui process. Mutex (excluderea reciproca a obiectelor) un mechanism care permite unui singur fir de executie, la un moment dat sa acceseze o resursa; ele sunt folosite de obicei pentru a restrictiona accesul catre o resursa a sistemului care poate fi folosita doar de un fir de executie la un moment dat. Semafoare un counter care tine evidenta numarului de fire de executie care pot folosi o resursa; ele sunt folosite de obicei pentru a controla accesul catre un numar anume de resurse identice. Eveniment un obiect eveniment notifica atunci cand un eveniment a avut loc asupra unuia sau mai multor fire de executie. Starea fiecaruia dintre aceste obiecte este fie semnalizata, fie nesemnalizata. O stare semnalizata indica faptul ca o resursa este disponibila pentru ca un process sau fir de executie sa o foloseasca. O stare nesemnalizata indica atunci cand o resursa este folosita.

Operatii de intrare/iesire
Cu toate ca fisierele si unitatile sunt partajate intre firele de executie, nu este neaparat necesar sa coordonam folosirea acestor resurse partajate intre firele de executie. Fortran, de exemplu, trateaza fiecare declaratie de intrare/iesire ca o operatie atomica. Daca doua fire de executie separate incearca sa scrie aceleiasi unitati si o operatie de iesire a unui fir de executie a inceput, aceasta va termina inainte ca operatia de iesire a celuilalt fir de executie sa poata incepe. Sistemul de operare nu impune o ordonare a accesului firelor de executie catre unitati sau file. De exemplu, natura non-determinata a aplicatiilor multithread poate cauza ca inregistrari intr-o fila secventiala sa fie scrise intr-o ordine diferita cu fiecare executie a aplicatiei in timp ce fiecare fir de executie scrie in fisier. Fisierele cu acces direct pot fi o alegere mai buna decat fsierele secventiale intr-un caz ca acesta. Daca nu se pot folosi fisiere cu acces direct, se pot folosi mutex-uri pentru a impune o constrangere a ordonarii la intrarea sau iesirea fisierului secvential. Anumite restrictii se aplica pentru a boca functii pentru procedure de intrare in programele QuickWin. Aplicatiile grafice Fortran QuickWin sunt aplicatii ce folosesc multithread

si sunt mult mai versatile decat aplicatiile grafice standard deoarece poti deschide mai multe ferestre in timp ce proiectul tau ruleaza.

Multithread
Multithread-ul, un model de executie si programare foarte raspandit, permite mai multor fire de executie sa existe in contextual unui singur process. Aceste fire de executie impart resursele procesului dar sunt capabile de a executa actiuni in mod independent. Cel mai interesant mod al alplicarii acestei tehnologii este atunci cand ea este aplicata unui singur process pentru a da posibilitatea executarii paralele pe un sistem multiprocessor. Acest avantaj al unui program multithread permite rularea mai rapida pe sistemele care au mai multe procesoare, sau procesoare multicore, deoarece firele de executie ale unui program tind in mod natural catre executare concurenta in adevaratul sens al cuvantului. Alta folosinta a multithreading-ului aplicabila chiar si pentru sistemele single-CPU, este abilitatea unei aplicatii de a ramane raspunzatoare intrarilor. Intrun program singlethread daca firul de executie principal blocheaza un task, intreaga aplicatie poate parea blocata. Mutand taskuri catre un fir de executie care lucreaza concurrent cu firul de executie principal este posibil ca aplicatia sa raspunda in continuare utilizatorului in timp ce executa alte sarcini in fundal. Pe de alta parte, in cele mai multe cazuri, multithreading-ul nu este singura metoda de a tine un program activ, putandu-se folosi deasemenea si intrari/iesiri asincrone sau semnale unix pentru a obtine rezultate asemanatoare.

Bibliografie: www.brown.edu www.cursuri.cs.pub.ro www.software.intel.com/sites/products/documentation Programare concurenta. Mecanisme support orientate timp real prof.dr.ing.
Nicolae Robu Timisoara : Editura Politehnica 2002 isbn 973-625-047-4

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