Sunteți pe pagina 1din 15

Thread safety

Alexandru Constantin (IA - 7212) April 12, 2014

Cuprins
1 Introducere 2 Procese i thread-uri 2.1 Funcionarea thread-urilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 2.1.2 3 Tipuri 3.1 3.2 Thread-uri la nivel de aplicaie . . . . . . . . . . . . . . . . . . . . . . . . . Strile unui r de execuie . . . . . . . . . . . . . . . . . . . . . . . . Schimbarea unei stri . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 6 6 6 7 8 8 11 12 13 14

Threaduri la nivel de kernel . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Metode de implementare 4.1 Enumerare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 Nivele de thread-safety 5.1 Terminologii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Capitolul 1 Introducere

Thread safety este un concept de programare aplicabil n contextul programelor multi-thread. O bucat de cod este thread-safe dac manipuleaza structurile de date comune ntr-o manier care garanteaz execuia sigur a mai multor thread-uri n acelai timp. O provocare n programarea multi-threading, thread safery nu a fost un motiv de ngrijorare pentru programatori pn n anii 1990 cnd sistemele de operare au nceput s foloseasc thread-uri multiple pentru execuia codului. Astzi, un program poate executa o poriune de cod pe mai multe thread-uri simultan. Conceptul de thread (r de execuie) denete cea mai mic unitate de procesare ce poate programat spre execuie de ctre sistemul de operare. Este folosit n programare pentru a ecientiza execuia programelor, executnd poriuni distincte de cod n paralel n interiorul aceluiai proces. Cteodata ns, aceste portiuni de cod care constituie corpul threadurilor, nu sunt complet independente i n anumite momente ale execuiei, se poate ntampla ca un thread s trebuiasc s atepte execuia unor instructiuni din alt thread, pentru a putea continua execuia propriilor instruciuni. Aceast tehnic prin care un thread asteapt execuia altor threaduri nainte de a continua propria execuie, se numete sincronizarea threadurilor.

Capitolul 2 Procese i thread-uri

2.1

Funcionarea thread-urilor

Threadurile sunt diferite fa de clasicele procese gestionte de sistemele de operare ce suport multitasking, n principal prin faptul c, spre deosebire de procese, toate threadurile asociate unui proces folosesc acelai spaiu de adresare. Procesele sunt n general independente, n timp ce mai multe threaduri pot asociate unui unic proces. Procesele stocheaz un numr semnicativ de informaii de stare, n timp ce threadurile dintr-un proces impart aceeai stare, memorie sau alte resurse. Procesele pot interaciona numai prin mecanisme de comunicare interproces speciale oferite de sistemul de operare (semnale, semafoare, cozi de mesaje i altele asemenea). Cum mpart acelai spaiu de adresare, threadurile pot comunica prin modicarea unor variabile asociate procesului i se pot sincroniza prin mecanismele proprii. n general este mult mai simplu i rapid schimbul de informaii intre threaduri dect ntre procese.

2.1.1

Strile unui r de execuie

Principalele stri ale unui r de execuie sunt: Activ, Pregtit i Blocat. Comparativ cu acestea, procesele au i starea specic Repaus (Sleep). Daca un proces este eliminat din memoria RAM, toate rele de execuie ale acestuia vor oprite, deoarece se aau n aceli spaiu de memorie ca i procesul respectiv.

2.1.2

Schimbarea unei stri

Crearea: Atunci cnd un proces este pornit, se creeaz un thread pentru acel proces. Apoi, acel thread poate crea i gestiona mai multe threaduri, ecare avnd pointeri ctre instruciunile specice lui. Blocarea: Atunci cnd un thread trebuie s atepte altul, acesta este blocat - ind salvat n stiv pointerul la acesta. Funcia de blocare se poate apela att din interiorul ct i din exteriorul threadului. Deblocarea: Un thread blocat poate deblocat n urma unei comenzi externe. La alegere, n locul blocrii/deblocrii threadurilor, acestea pot primi prioriti de execuie, ns aceast metod este mai inecient, deoarece procesorul tot va comuta de la un thread la altul, operaie ce va ocupa cicli de procesor. Cu varianta din urma nsa, se vor evita mai uor erori de programare prin care doua sau mai threaduri se vor atepta ntre ele, blocnd un proces ntreg (deadlock). Finalizarea: Atunci cnd un thread este nalizat, se va elibera memoria alocat acestuia.

Capitolul 3 Tipuri

Exist dou tipuri principale de threaduri: la nivel de utilizator i la nivel de kernel. O abordare combinat a celor dou se numete proces de categorie uoar (Lightweight Processes), n care threadurile nucleului sistemului de operare sunt date spre procesare i care, la randul lor, gestioneaz rele de execuile ale altor aplicaii.

3.1

Thread-uri la nivel de aplicaie

Se mai numesc i bre n sistemele de operare din familia Windows. Acestea sunt gestionate de codul aplicaiei i trecerea de la un thread la altul nu necesita apeluri la sistemul de operare sau ntreruperi ale kernelului. Defapt, kernelul gestioneaz aceste threaduri ca procese diferite cu un singur r de execuie. Avantaje: Pot implementate i n sisteme de operare care nu suport aplicaii multithreaded. Reprezentare i gestionare usoar. Trecerea de la un thread la altul se face printr-un simplu apel al unei proceduri. Dezavantaje: Lipsa unei coordonrii ntre kernel i threaduri, deci nu poate controlat prioaritatea de procesare a acestora. Blocarea unui thread ce apeleaz o funcie a kernelului poate duce la blocarea sistemului, chiar dac n kernel exist i alte procese ce pot rulate.

3.2

Threaduri la nivel de kernel

n acest caz, nucleul sistemului de operare gestioneaz funcionarea relor de executie i, n locul unui tabel cu rele de execuie pentru ecare proces n parte, sistemul deine un tabel ce pastreaz toate threadurile din sistem. Avantaje: Datorit faptului c sistemul cunoate toate threadurile, se va optimiza gestionarea acestora, priorietiznd acele procese ce au mai multe threaduri. Threadurile la nivel de kernel sunt recomandate pentru acele aplicaii ce se blocheaza des. Dezavantaje:

Sunt ineciente i se proceseaz greoi - spre exemplu, operaiile ce in de gestionarea threadurilor sunt de o suta de ori mai ncete dect cele ale brelor. Datorit faptului ca nucleul trebuie s gestioneze i procesele i threadurile, complexitatea kernelului va crete semnicativ.

Capitolul 4 Metode de implementare

11

Sunt diferite metode de implementare pentru obinerea unui program sigur din punct de vedere thread-safe.

4.1

Enumerare

Re-entrancy: Scrierea codului n aa manier nct s poat executat parial de un thread, reexecutat de acelai thread sau executat simultan de un altul i totui execuia original s se termine cu succes. Aceast metod necesit salvarea strii variabilelor, de obicei ntr-o stiva. Thread-local storage: Presupune ca ecare thread s aiba o copie proprie a variabilelor. Aceste variabile ii rein valoarea pe parcursul mai multor subrutine. Mutual exclusion: Accesul la informaii partajate de mai multe thread-uri este serializat folosind mecanisme care asigura faptul c numai un thread citete sau scrie informaiile partajate la un anumit moment. Aceast metod trebuie sa e atent analizat nct poate forma deadlock-uri, livelock-uri sau epuizarea resurselor. Atomic operations: Informaiile partajate sunt accesate folosind operaii atomice care nu pot ntrerupte de alte thread-uri. Immutable objects: Starea unui obiect nu poate schimbat dup ce a fost iniializat. Aceasta implic att

Capitolul 5 Nivele de thread-safety

13

Librriile software pot oferi anumite garanii n privina aceasta. De exemplu, citirile concomitente ar putea garantate ca ind thread-safe, ns scrierile concurente nu.

5.1

Terminologii

Terminologii acceptate n privina thread-safety: Thread safe Conditionally safe Not thread safe Garaniile thread safety includ de obicei nite pai pentru a preveni diferitele forme de deadlock. Totui, garanii prea mari n privin a deadlock-ului nu pot date.

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