This is an old revision of the document!
Pentru parcurgerea demo-urilor, folosim arhiva aferentă. Demo-urile rulează pe Linux. Descărcăm arhiva folosind comanda
wget http://elf.cs.pub.ro/so/res/cursuri/curs-08-demo.zip
și apoi decomprimăm arhiva
unzip curs-08-demo.zip
și accesăm directorul rezultat în urma decomprimării
cd curs-08-demo/
Acum putem parcurge secțiunile cu demo-uri de mai jos.
Dorim să investigăm timpul de creare a proceselor și thread-urilor; timpul de creare al proceselor va fi mai mare, ne interesează cu cât. Pentru aceasta accesăm subdirectorul creation-time/
; urmărim conținutul fișierelor process-overhead.c
și thread-overhead.c
. În aceste fișiere se creează, în 100 de runde, câte 100 de procese, respectiv thread-uri. Vor fi create, respectiv, 100 de procese și 100 de thread-uri.
Compilăm cele două programe folosind make
. Rezultă două fișiere în format executabil: process-overhead
și thread-overhead
.
Pentru a măsura timpul de creare vom rula cele două executabile sub comanda /usr/bin/time
:
/usr/bin/time -v ./process-overhead > /dev/null /usr/bin/time -v ./thread-overhead > /dev/null
Acum urmărim diferențele dintre output-ul celor două comenzi.
Observăm că timpul de creare al proceselor este 2 până la 3 ori mai mare decât în cazul thread-urilor. Și este încă foarte mic ținând cont de faptul că am creat 10000 de procese: 100 runde a câte 100 de procese. Deși timpul de creare a thread-urilor este mai mic, în termeni absoluți ambii timpi sunt neglijabili. Desigur, contează faptul că se realizează doar fork
, fără exec
. Mecanismul de copy-on-write aferent fork
reduce semnificativ timpul de creare.
Observăm, de asemenea, că dimensiunea maximă a spațiului de memorie alocată (Maximum resident set size) este mai mare în cazul thread-urilor. Un thread nou creat ocupă spațiu suplimentar în memorie. Un proces nou creat va avea spațiul virtual creat propriu, dar, pentru început, va folosi spațiul de memorie fizică al primului proces, prin intermediul copy-on-write.
Diferențe sesizabile se observă în cazul numărului de page fault-uri și al schimbărilor de context involuntare. Schimbările de context involuntare (la schimbarea cuantei) sunt mai numeroase în cadrul proceselor întrucât se schimbă contextul procesului curent cu procesele pe care le creează. În cazul thread-urilor nu există schimbări de context între thread-uri, deoarece aparțin aceluiași proces. Numărul de page fault-uri în cadrul proceselor este cauzat de accesele de scriere proceselor noi peste zonele marcate copy-on-write. Sunt relativ puține accese, dar se resimt la nivelul numărului de page fault-uri.
TODO
1-process_thread/
.process.c
și thread.c
.thread.c
) sau dintr-un proces nou (process.c
).make
pentru a obține executabilele thread
și process
../thread ./process
data_var
, afișată prin rularea celor două executabile.TODO
TODO