Sunteți pe pagina 1din 12

L2b: Noţiunea de multithreading şi performanţele sale

1. Obiectivul lucrării

Această lucrare îşi propune studiul unor mecanisme software de prelucrare


paralelă, având la bază conceptul de multithreading, care este prezentat atât prin
simulare, cât şi prin implementarea efectivă de funcţii multithreading în mediul de
programare .NET.

2. Introducere teoretică

Structura de bază a unui calculator secvenţial cu program memorat, stabilită de


von Neumann în 1945, este reprezentată în figura 1 şi cuprinde 5 unităţi funcţionale:
 unitatea de intrare (UI);
 unitatea de memorare (M);
 unitatea de ieşire (UE);
 unitatea aritmetico-logică (ALU);
 unitatea de comandă şi control (UCC).

Fig. 1. Arhitectura maşinii von Neumann.

Linia continuă din schemă reprezintă fluxul de date şi instrucţiuni, iar linia
întreruptă, fluxul de comenzi şi stări.
Unitatea de comandă şi control (UCC) urmăreşte ordinea de execuţie a
instrucţiunilor unui program şi controlează întreaga activitate a unităţii centrale, astfel:
 interpretează instrucţiunile programului din memoria internă şi comandă
circuitele să execute instrucţiunile;
 comandă şi controlează transferul de date dintre memoria internă şi
dispozitivele periferice.
Unitatea aritmetică şi logică (ALU) realizează prelucrarea informaţiei preluate
din memorie, producând rezultate care se depun din nou în memorie sau sunt furnizate
în exterior. ALU realizează două categorii de operaţii:
 aritmetice: adunare, scădere, înmulţire, împărţire;
 logice: ŞI (AND), SAU (OR), NEGAŢIE (NOT), SAU-EXCLUSIV (XOR).
42 Arhitectura sistemelor de calcul – lucrări practice

Memoria este alcătuită din registre interne (RI), care pot fi:
 de uz general;
 cu destinaţie specifică.
Registrele de uz general sunt acele registre interne care stochează valorile
intermediare ale calculelor.
Registrele cu destinaţie specifică – contorul de program (PC) indică adresa
noii instrucţiuni care urmează a fi executată precum şi adresa instrucţiunii curente
care se execută.
Datele care trebuie prelucrate sunt aduse din registrele interne în registrele de
intrare ale ALU, unde rămân în timpul în care ALU face operaţiile de calcul aritmetic şi
logic. Rezultatul calculului preluat de registrele de ieşire ale ALU este stocat într-unul
din registrele de uz general. Există trei tipuri de instrucţiuni, conform figurii 2:

Fig. 2. Schema unităţii centrale și un exemplu de operație.

 instrucţiuni registre-memorie: se încarcă date din memorie în registre şi


viceversa. Datele pot fi folosite mai departe de alte instrucţiuni sau chiar de
instrucţiunile respective. În acest ultim caz, rezultatul este depus în registre;
 instrucţiuni registre-registre: mută operanzii din registrul de la intrarea
ALU, execută asupra lor o anumită operaţie şi depun din nou operanzii în
registru;
 instrucţiuni memorie-memorie: preiau operanzii din memorie, îi plasează
în registrul de intrare ALU, se execută o anumită operaţie şi apoi stochează
rezultatul în memorie.
Caracterul secvenţial al calculatorului rezultă din modul de execuţie al
instrucţiunilor programului. Sunt necesare următoarele etape sau faze majore,
reprezentate în figura 3:
 încărcarea instrucţiunii, IF (Instruction Fetch);
 decodificarea instrucţiunii, ID (Instruction Decoding);
 încărcarea (din memorie) a operanzilor, OF (Operand Fetch);
 execuţia operaţiilor impuse de instrucţiune, EX (EXecution).
L2b: Noţiunea de multithreading şi performanţele sale 43

Fig. 3. Etapele execuţiei secvenţiale a unei instrucţiuni.

După terminarea unei instrucţiuni, se trece la următoarea instrucţiune. Astfel,


programul este executat secvenţial, instrucţiune cu instrucţiune. De remarcat faptul că
pot exista instrucţiuni care să nu prezinte etapa a treia (OF), cum sunt, de exemplu,
instrucţiunile de salt.
Unitatea de comandă şi control (UCC), unitatea aritmetică şi logică (ALU),
împreună cu memoria (registrele interne), formează unitatea centrală (UC) sau
unitatea centrală de prelucrare (CPU) a calculatorului (vezi figura 1).
Datele şi programele sunt introduse în calculator prin intermediul unităţii de
intrare, fiind apoi depuse în memorie.

2.1. Tehnica pipe-line

Execuţia unei instrucţiuni este privită ca fiind alcătuită din mai multe faze care
se succed una după alta şi care pot fi tratate de unităţi specializate într-un mod
asemănător cu o linie de asamblare (de exemplu, o linie de asamblare dintr-o fabrică
de automobile).
Exemplu. Fie un şir de procese care are loc la execuţia unei instrucţiuni,
conform schemei reprezentate în figura 4.

Fig. 4. Exemplu de şir de procese la execuţia unei instrucţiuni.

Se presupune că de fiecare etapă din aceste procese se ocupă o unitate


specializată. Desfăşurarea celor 5 procese în timp este reprezentată în figura 5.
Se poate observa cum maximum 5 procese care pornesc succesiv (P1P5) se
pot afla simultan în execuţie, cu condiţia ca fiecare să se afle într-o etapă (fază)
diferită. Când se atinge al cincilea impuls de ceas, la toate cele cinci procese se
lucrează în paralel; astfel, se măreşte de cinci ori viteza de execuţie. De exemplu, în
faza încadrată, instrucţiunea 5 este în etapa de încărcare, instrucţiunea 4 – în etapa de
decodare etc.
44 Arhitectura sistemelor de calcul – lucrări practice

Fig. 5. Desfăşurarea proceselor în timp în cazul aplicării tehnicii pipe-line.

Problema este că în faza P5 poate să apară fenomenul de strangulare, pentru


că una sau mai multe instrucţiuni aflate între P1 şi P5 pot să nu fie instrucţiuni utile,
cu acces la memorie (de ex.: salt), ceea ce creează o aglomerare. Deşi există un
paralelism în execuţia instrucţiunilor, aceasta este o maşină pipe-line de tip SISD
(Single Instruction Stream, Single Data Stream).

2.2. Prelucrarea pe loturi

Prelucrarea pe loturi se mai numeşte batch processing. Aceasta presupune


formarea unui fişier cu extensia .bat şi lansarea lui. Procesele au loc succesiv, iar
unitatea centrală de prelucrare (CPU), care execută operaţiile de calcul, nu este
folosită în mod eficient, aşa cum rezultă din reprezentarea grafică din figura 6a.

Fig. 6. Prelucrarea pe loturi (a) şi multiprogramarea (b).

Exemplu. Fie 3 procese paralele P1, P2 şi P3, fiecare proces fiind văzut în
timp ca o succesiune de trei etape: intrare (i), calcul (c) şi ieşire (o).
L2b: Noţiunea de multithreading şi performanţele sale 45

2.3. Multiprogramarea

În acelaşi interval de timp, pot exista mai multe programe (procese) active în
sistemul de calcul, concurând pentru memorie, dispozitivele I/O şi CPU. Totuşi, unele
programe sunt orientate către calcule (utilizând intens CPU), în timp ce altele sunt
orientate către citirea/scrierea dispozitivelor I/O. Se pot astfel organiza (intercala) cele
două clase de programe pentru a obţine un timp de prelucrare global cât mai bun. În
figura 6b, câştigul de timp este notat cu Δ. Intercalarea programelor permite utilizarea
mai eficientă a resurselor calculatorului prin suprapunerea operaţiilor I/O cu operaţiile
CPU. Acest mod de organizare este gestionat de sistemul de operare (programul de
supervizare). Astfel, multiprogramarea se poate defini ca intercalarea operaţiilor CPU
cu operaţii I/O pentru mai multe programe.
Observaţie. Procesele P1÷P3 pot aparţine aceluiaşi program sau unor programe
diferite. În cadrul multiprogramării, se poate întâmpla ca un proces cu prioritate mare să
ocupe CPU un timp îndelungat şi în acest fel se împiedică execuţia altor procese. Acest
neajuns se poate înlătura folosind un sistem de operare cu divizare în timp.

2.4. Noţiunea de multithreading

Termenul multithreading reprezintă un aspect important al proiectării


software, care necesită atenţie specială în construcţia sistemelor mari şi, în deosebi,
atunci când se pune problema eficienţei (exprimate în termeni de viteză a sistemului)
şi a performanţei (exprimate în termeni de corectitudine în funcţionare a sistemului).
Folosind adecvat instrucţiunile de multithreading, se pot realiza aplicaţii optimizate.
Fiecare aplicaţie sau program care rulează pe sistemul de operare este un
proces. Fiecare proces este alcătuit din unul sau mai multe thread-uri. Un thread este
un set de instrucţiuni sau o parte anume a aplicaţiei, care se execută independent în
cadrul programului sau sistemului. Thread-urile sunt entităţi responsabile cu
multitasking-ul în cadrul unei singure aplicaţii. De obicei, sistemul de operare (SO) se
ocupă cu programarea şi executarea thread-urilor.
Multithreading-ul presupune execuţia în paralel a mai multor procese, pentru a
îmbunătăţi eficienţa sistemului. Thread-urile sunt implementate în situaţiile în care
trebuie îndeplinite mai multe sarcini simultan.
Avantajele threading-ului sunt următoarele:
 sarcinile care necesită mai mult timp de execuţie pot fi rulate în background;
 interfaţa aplicaţiei poate fi realizată mai atrăgător şi mai simplu de utilizat
(de exemplu, după apăsarea unui buton, se afişează o bară de progresie);
 viteza aplicaţiei poate creşte;
 thread-urile pot fi folositoare în situaţiile în care există decalaje între
anumite evenimente, putându-se astfel elibera anumite resurse care nu sunt
necesare la un moment dat.
Modelele de threading suportate de sistemele win32 sunt:
1. Modelul thread-ului unic (Single Thread Model). Acest tip de thread
presupune rularea unui singur thread la un moment dat. Restul thread-
urilor trebuie să aştepte. Principalul dezavantaj al acestui tip de thread îl
reprezintă timpii lungi de execuţie ai sarcinilor mici. Corespunde, din
punct de vedere conceptual, prelucrării pe loturi (batch processing).
2. Modelul Apartment Thread (Single Thread Apartment Model – STA). În
acest model, pot exista mai multe thread-uri care se execută în cadrul
aplicaţiei. În STA, fiecare thread este izolat într-un „apartament” separat
46 Arhitectura sistemelor de calcul – lucrări practice

în cadrul procesului. Fiecare proces poate avea mai multe apartamente,


care pot partaja date între ele. În acest caz, aplicaţia este răspunzătoare
pentru stabilirea duratei fiecărui thread din cadrul fiecărui apartament.
Toate cererile sunt ordonate folosind Windows Message Queue, astfel încât
doar un apartament poate fi accesat la un moment dat. Avantajul acestui
model fată de modelul thread-ului unic este că se pot procesa simultan mai
multe cereri ale utilizatorului. Totuşi, nu este atinsă încă eficienţa maximă,
deoarece sarcinile se vor executa una după alta. Corespunde, din punct de
vedere conceptual, multiprogramării.
3. Modelul Multithread Apartment (Free Thread Apartment Model – FTA).
Modelul Multithread Apartment (MTA) presupune existenţa unui singur
apartament. Nu este nevoie de ordonare, deoarece toate thread-urile
aparţin aceluiaşi apartament şi pot partaje resursele. Aceste aplicaţii se
execută mai repede decât cele care implementează modelul unic sau STA,
deoarece sistemul este mai puţin solicitat şi poate fi optimizat să elimine
timpii morţi. Corespunde, din punct de vedere conceptual, diviziunii în
timp (time sharing). Aceste tipuri de aplicaţii sunt foarte complexe,
deoarece trebuie să se asigure că thread-urile nu accesează simultan
aceleaşi resurse (principiul pipe-line). Este astfel absolut necesar să se
furnizeze un sistem de blocare a resurselor. Acesta trebuie implementat cu
atenţie, deoarece poate conduce la blocarea totală a sistemului.
Prin natura şi arhitectura sa, mediul de programare Microsoft .NET
Framework este un mediu de tip multithreading.

2.5. Evaluarea performanţelor

Utilizând de n ori mai multe resurse în paralel, un algoritm nu va rula de n ori


mai repede, datorită fenomenului de timp suplimentar (overhead), indus prin
aplicarea paralelismului. Acest timp suplimentar apare din următoarele cauze:
 interacţiunea între procese (transmiterea rezultatelor intermediare sau
parţiale) şi sincronizarea proceselor;
 inactivitatea temporară (idling), care înseamnă că există procesoare inactive pe
anumite perioade de timp, datorită încărcării inegale şi a aşteptării sincronizării;
 calculele suplimentare, care nu apar în formularea serială a algoritmului.
Parametrii de intrare care contribuie la calculul performanţelor sunt:
 timpul de execuţie secvenţial sau serial TS (timpul măsurat de la începutul
şi până la sfârşitul execuţiei algoritmului pe un calculator secvenţial);
 timpul de execuţie paralel TP (timpul măsurat de la începutul execuţiei şi
până la terminarea ultimului subtask paralel);
 numărul de procesoare p.
Cu ajutorul acestora, se pot calcula următorii parametri de ieşire:
 suprasarcina TO (Total Parallel Overhead) = diferenţa dintre timpul total
de lucru însumat al tuturor procesoarelor şi timpul necesar celui mai rapid
algoritm secvenţial (cu toate procesoarele identice): TO = p  TP – TS;
 accelerarea S (Speedup) = raportul dintre timpul necesar rezolvării unei
probleme pe un procesor şi timpul necesar rezolvării aceleiaşi probleme în
paralel pe p procesoare identice: S = TS / TP;
 eficienţa utilizării calculatorului paralel: E = S / p;
 costul C = TP  p, care reflectă timpul total de lucru însumat al procesoarelor.
L2b: Noţiunea de multithreading şi performanţele sale 47

3. Descrierea aplicaţiei

Aplicaţia are o parte de simulare a proceselor de tip multithreading (primele


trei opţiuni din meniul principal) şi o parte de implementare efectivă de funcţii
multithreading (ultimele trei opţiuni din meniu).
1. Prelucrarea pe loturi / multiprogramarea / diviziunea în timp (vezi
figura 8). Utilizatorul introduce ca parametri de intrare numărul de procese (între 1 şi
50) şi durata unei etape, în milisecunde. Programul afişează diagrama proceselor şi
timpii comparativi prin cele două/trei procedee, evidenţiind diferenţa dintre prelucrarea
pe loturi (PPL) şi multiprogramare (MP)/diviziune în timp (DT) (= DIF).

Fig. 8. Prelucrarea pe loturi şi multiprogramarea/diviziunea în timp.

2. Simulare pipe-line (vezi figura 9). Utilizatorul alege tipul operaţiilor


(adunare, scădere, înmulţire, împărţire), numărul ciclurilor de execuţie (între 1 şi 20),
registrele sursă şi destinaţie (între F1 şi F16). Există un buton de adăugare a
instrucţiunilor (Adaugă instrucțiune) şi un buton de reiniţializare (Reset). Programul
afişează diagrama execuţiei instrucţiunilor pe cicluri, punând în evidenţă etapele
acestora (încărcare, decodificare, calcul, încărcare date, execuţie şi suspendare
thread). Prin butoane dedicate, utilizatorul poate vizualiza ciclurile pas cu pas (înainte
şi înapoi), poate executa toate instrucţiunile simultan sau poate reveni la pasul 1. Pasul
curent este marcat în colţul din dreapta sus.
3. Evaluarea performanţelor (vezi figura 10). Utilizatorul introduce ca date
de intrare timpul de execuţie secvenţial sau serial, TS, timpul de execuţie paralel, TP,
(ambii exprimaţi în milisecunde) şi numărul de procesoare, p. Programul calculează
ca date de ieşire suprasarcina, TO, accelerarea, S, eficienţa utilizării calculatorului
paralel, E, şi costul, C. De asemenea, sunt reprezentaţi grafic printr-o diagramă timpii
TS, TP şi TO.
48 Arhitectura sistemelor de calcul – lucrări practice

Fig. 9. Simularea pipe-line.

Fig. 10. Evaluarea performanţelor.

4. Încărcare dintr-o bază de date (vezi figura 11). Această opţiune


realizează încărcarea unui combo-box cu numere de la 1 la 100.000 şi încărcarea unei
liste multi-coloană cu valori dintr-o bază de date (.mdb), atât în varianta fără
multithreading, cât şi în varianta cu multithreading. Utilizatorul dispune de
posibilitatea de a încărca valorile (în combo-box şi în listă) sau de a reiniţializa
valorile cu ajutorul unor butoane dedicate.
5. Priorităţi multithreading (vezi figura 12). Utilizatorul are la dispoziţie 3
thread-uri, care reproduc o cursă auto şi care pot fi executate atât în varianta fără
multithreading, cât şi în varianta cu multithreading. În cel de-al doilea caz, se pot seta
priorităţile thread-urilor în cinci trepte (minimă, mică, normală, mare şi maximă),
precum şi o întârziere a fiecărui thread între 0 şi 10 ms. Procesele demarează la
apăsarea butonului Start, iar reluarea rulării se poate face cu ajutorul butonului Reset.
L2b: Noţiunea de multithreading şi performanţele sale 49

Fig. 11. Încărcarea dintr-o bază de date.

Fig. 12. Priorităţi multithreading.

6. Algoritmi de sortare (vezi figura 13). Utilizatorul are la dispoziţie trei


algoritmi de sortare: Bubble Sort, Selection Sort, și Insertion Sort). Înainte de rularea
algoritmilor, se aleg numerele întregi care vor fi sortate (între 5 şi 50 de numere), şi
întârzierea corespunzătoare (între 0 şi 500 ms). Numerele sunt generate şi afişate la
apăsarea unui buton. Sortarea se poate face fie succesiv, apelând secvenţial la fiecare
algoritm în parte (folosind butonul Start corespunzător fiecărei metode), fie simultan
(folosind butonul de Start Multithreading din partea de sus). În ambele situaţii, fiecare
50 Arhitectura sistemelor de calcul – lucrări practice

Fig. 13. Algoritmi de sortare.

algoritm în parte va afişa rezultatul sortării, timpul de start, timpul de sfârşit şi timpul
total (diferenţa). Modul de evoluţie al fiecărei operaţii de sortare poate fi urmărit în
fereastra din stânga jos. La încheierea proceselor, pot fi vizualizate în partea de jos
diagramele pentru timpii rezultaţi în funcţie de metoda de sortare (stânga, Grafic timpi
metode de sortare), precum şi pentru timpii rezultaţi în cazurile cu şi fără
multithreading (dreapta, Grafic comparație între metode). În partea din dreapta sus
există un buton care realizează ștergerea câmpurilor şi a rezultatelor (Clear).

4. Desfăşurarea lucrării
1. Se lansează aplicaţia L2B.
2. Se parcurg noţiunile introductive ale fiecărei opţiuni din meniu.
3. Se execută, pe rând, părţile aplicative ale celor 6 opţiuni din meniu.
3.1. Prelucrarea pe loturi / multiprogramarea / diviziunea în timp. Se
aleg diferite valori pentru numărul de procese şi durata unei etape. Se
vizualizează şi se desenează (pentru două cazuri reprezentative) diagrama
proceselor şi timpii comparativi prin cele două/trei procedee.
3.2. Simularea pipe-line. Se aleg diferite valori şi combinaţii pentru tipul
operaţiilor, numărul ciclurilor de execuţie şi registrele sursă/destinaţie. Se
vizualizează şi se desenează (pentru două cazuri reprezentative) diagrama
execuţiei instrucţiunilor pe cicluri, evidenţiindu-se semnificaţia fiecărei
etape. Se notează durata totală de lucru şi se compară situaţiile studiate.
L2b: Noţiunea de multithreading şi performanţele sale 51

3.3. Evaluarea performanţelor. Se aleg diferite valori pentru parametrii


de intrare TS, TP şi p. Se notează în fiecare situaţie valorile obţinute pentru
parametrii de ieșire TO, S, E şi C, comparându-se rezultatele (pentru două
cazuri reprezentative). Se desenează în ambele cazuri diagrama timpilor
TS, TP şi TO.
3.4. Încărcarea dintr-o bază de date. Se realizează încărcarea în combo-
box şi în listă a valorilor numerice, respectiv, din baza de date, cu şi fără
multithreading. Atenţie! Există un timp de aşteptare considerabil pentru
realizarea încărcării în combo-box, în special în cazul numerelor mari din
varianta fără multithreading. Acest timp de aşteptare trebuie respectat
pentru a se evita blocarea programului. La încărcarea fără a folosi
multithreading, se observă cum programul practic îngheaţă pentru o
perioadă de timp şi nu se pot acţiona alte controale până nu se realizează
încărcarea. La încărcarea folosind multithreading, se poate observa în timp
real cum se încarcă elementele în combo-box şi în listă, putându-se chiar
interacţiona cu acestea. Cele două încărcări pot fi realizate atât succesiv,
cât şi simultan. Se notează observațiile experimentale la nivel calitativ
pentru două cazuri reprezentative.
3.5. Priorităţi multithreading. Se aleg diferite valori şi combinaţii pentru
vitezele (cu și fără multithreading) şi priorităţile thread-urilor (minimă,
mică, normală, mare, maximă), după care se lansează procesele în
execuţie. Programul apelează trei funcţii, care animează cele trei steaguri
(flag-uri). La rularea fără a folosi multithreading, se poate observa cum
animaţiile sunt executate secvenţial (pe rând). La rularea folosind
multithreading, se poate observa o animaţie concomitentă a celor trei
steaguri, deoarece funcţiile sunt apelate prin thread-uri separate. Aplicaţia
se poate rula cu şi fără lansarea simultană în execuţie a altor aplicaţii
Windows, pentru a se compara comportamentul proceselor, cu şi fără
multithreading. Se notează (pentru două cazuri reprezentative), în fiecare
situație, datele de intrare, condiţiile de lucru şi ordinea de finalizare a
proceselor.
3.6. Algoritmi de sortare.
 Alegeţi câte numere doriţi să fie generate (între 5 și 50), întârzierile
dorite (între 0 și 500 ms) şi executaţi clic pe butonul de generare a
numerelor.
 Executaţi succesiv clic pe cele 3 butoane de start pentru cei trei
algoritmi de sortare: metoda bulelor, sortarea prin selecţie şi
sortarea prin inserţie. Se notează valorile de timp obţinute şi se
desenează graficul cu timpii pentru cele trei metode, fără a folosi
multithreading.
 Executaţi clic pe butonul de start multithreading. Se observă cum
sortările se execută concomitent. La sfârşitul execuţiei, se afişează
valorile de timp, atât pentru cazul cu multithreading, cât şi fără
multithreading (se poate comuta uşor între cele două variante),
precum şi graficul comparativ între cazurile cu şi fără
multithreading. Se notează valorile de timp obţinute şi se
desenează graficele rezultate.
 Reluaţi rulările pentru alte seturi de numere generate şi comparaţi
rezultatele obţinute. Rețineți rezultatele pentru două cazuri
reprezentative.
52 Arhitectura sistemelor de calcul – lucrări practice

5. Întrebări

1. Care este condiţia de aplicare a tehnicii pipe-line? În ce situaţii se obţin


rezultate eficiente?
2. De ce multiprogramarea este mai eficientă decât prelucrarea pe loturi?
3. Care este avantajul folosirii diviziunii în timp faţă de celelalte metode?
4. Cum se poate adapta tehnica diviziunii în timp pentru a face ca toate
procesele implicate în execuţie să se încheie (aproximativ) în acelaşi timp?
5. Care este diferența între timpii totali de execuție prin multiprogramare și
diviziune în timp, în cazul aceluiași set de date (număr de procese și durate ale
etapelor de intrare, calcul și ieșire)? Cum se explică acest rezultat?
6. Explicaţi care este diferenţa între noţiunile de thread şi cea de multithread.
7. Care sunt avantajele procedeului de threading?
8. Care sunt modelele de threading suportate de sistemele win32? Realizaţi o
analiză comparativă a acestora.
9. Cum se explică faptul că utilizând de n ori mai multe resurse în paralel, un
algoritm nu va rula de n ori mai repede?
10. Cum influenţează durata etapelor de intrare şi ieşire asupra diferenţei ()
între timpii totali obţinuţi prin prelucrare pe loturi şi multiprogramare?
11. Daţi exemple de instrucţiuni pipe-line care nu parcurg toate cele 5 etape
de bază ale execuţiei unei instrucţiuni, altele decât instrucțiunile de salt.
12. În cazul simulării pipe-line, identificaţi după schema arhitecturii von
Neumann ce resurse hardware anume sunt implicate în fiecare din etapele (fazele) de
execuţie ale unei instrucţiuni.
13. Care este parametrul esenţial în aprecierea eficienţei unui sistem paralel?
14. Cum se manifestă avantajele multithreading în lucrul cu o bază de date?
15. Cum poate fi pusă în evidenţă prezenţa unui proces dominant în aplicaţia
referitoare la priorităţile multithreading?
16. Cum evoluează timpii de lucru (cu şi fără multithreading) în cazul sortării
unui set din ce în ce mai mare de numere? Trasaţi graficele pentru cei trei algoritmi.

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