This is an old revision of the document!


Curs 08 - Fire de execuție

  • Suport curs
    • Operating Systems Concepts
      • Capitolul 4 - Threads
    • Modern Operating Systems
      • Capitolul 2 - Processes and Threads
        • Secțiunea 2.2 - Threads
    • Beginning Linux Programming
      • Capitolul 12 - POSIX Threads
    • Windows System Programming
      • Capitolul 7 - Threads and Scheduling
      • Capitolul 8 - Thread Synchronization

Demo-uri

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.

Timp de creare procese și thread-uri

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.

Creare de thread-uri și spațiu de adresă

TODO

Partajare informație între procese și thread-uri

  • Deschideți directorul 1-process_thread/.
  • Consultați fișierele process.c și thread.c.
  • Se incrementează o variabilă globală dintr-un thread nou (thread.c) sau dintr-un proces nou (process.c).
  • Folosiți comanda make pentru a obține executabilele thread și process.
  • Rulați cele două executabile:
    ./thread
    ./process
    • Observați valoarea variabilei data_var, afișată prin rularea celor două executabile.
    • Observați că thread-urile partajează secțiunea de date a procesului, în vreme ce procesele au o zonă de date proprie.

Stiva unui thread în spațiul de adresă

TODO

Utilitate apeluri reentrante

TODO

so/cursuri/curs-08.1396901484.txt.gz · Last modified: 2014/04/07 23:11 by razvan.deaconescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0