This is an old revision of the document!


Curs 03 - Procese

  • Suport curs
    • Operating System Concepts Essentials
      • Capitolul 3 - Processes
    • Modern Operating Systems
      • Capitolul 2 - Processes and Threads - Secțiunea 1
    • Linux System Programming
      • Capitolul 5 - Process Management
      • Capitolul 6 - Advanced Process Management
      • Capitolul 9 - Signals
    • Windows System Programming
      • Capitolul 6 - Process Management
      • Capitolul 11 - Interprocess Communication

Demo-uri

Pentru parcurgerea demo-urilor, folosiți arhiva aferentă.

  1. Folosiți comenzile de mai jos pentru a afișa informații despre procesul shell curent:
    ps -f $$
    ps -F $$
    lsof -p $$
    pmap $$
    ls /proc/$$/
    cat /proc/$$/status
  2. Determinați informații complete despre un proces creat (find), prin rularea comenzii de mai jos:
    /usr/bin/time -v find /usr/share > /dev/null
    • Parcurgeți câmpurile și determinați semnificația lor.
    • User time este timpul petrecut de proces în user space; System time este timpul petrecut de proces în kernel space; Elapsed (wall clock) time este timpul trecut pe ceas. Procesul rulează pe procesor timp de User time + System time. De ce este acest timp mai mic (cu mult) decât Elapsed (wall clock) time.
  3. Afișați ierarhia curentă de procese a sistemului folosind comenzile de mai jos:
    pstree
    ps -H
  4. Vrem să vizualizăm evoluția arborelui de procese. Vom vizualiza subarborele unui proces shell.
    • Pentru început, aflați PID-ul procesului shell curent:
      echo $$
    • Fie $PID valorea afișată de comanda de mai sus.
    • Deschideți un shell nou și rulați comanda:
      watch -n 1 pstree -a -p $PID
      • Comanda de mai sus vă afișează, cu refresh de o secundă, ierarhia de procese începând cu shell-ul inițial.
    • Pentru a altera ierarhia, rulați comenzile de mai jos. Observați evoluția ierarhiei în al doilea shell:
      sleep 20 &
      bash
      sleep 30       # asteptati terminarea comenzii
      exit
      • Cum explicați alterarea ierahiei, apariția și dispariția anumitor procese și poziționarea lor în ierarhie.
  5. Pentru a urmări numărul de schimbări de context ale unui proces, consultați fișierul /proc/$PID/status, și anume câmpurile voluntary_ctxt_switches și nonvoluntary_ctxt_switches. Urmăriți aceste valori pentru shell-ul curent:
    cat /proc/$$/status
    • Ce semnifică fiecare dintre cele două câmpuri de mai sus?
    • Rulați de mai multe ori comanda de mai sus și observați alterarea celor două câmpuri. De ce se alterează proponderent câmpul voluntary_ctxt_switches?
  6. Intrați în directorul ctxt-switch/ din arhiva cu demo-uri a cursului.
    • Parcurgeți fișierele cpu.c și io.c.
    • Compilați cele două programe folosind comanda:
      make
      • Veți obține executabilele cpu și io.
    • Rulați executabilul cpu:
      ./cpu
      • Într-o altă consolă urmăriți numărul de context switch-uri realizate de procesul nou creat:
        cat /proc/$(pidof cpu)/status
      • Observați că se modifică preponderent valoarea câmpului nonvoluntary_ctxt_switches. Cum explicați?
    • Rulați executabilul io:
      ./io
      • Într-o altă consolă urmăriți numărul de context switch-uri realizate de procesul nou creat:
        cat /proc/$(pidof io)/status
      • Observați că se modifică preponderent valoarea câmpului voluntary_ctxt_switches. Cum explicați?
      • De ce în modificarea câmpului voluntary_ctxt_switches se face doar în cazul apelului sleep(), nu și în cazul apelului write() (apel de I/O)?
  7. Intrați în directorul fork-file-pointer/ din arhiva cu demo-uri a cursului.
    • Parcurgeți fișierele fork-file-pointer.c.
    • Compilați cele două programe folosind comanda:
      make
      • Veți obține executabilele fork-file-pointer.
    • Rulați executabilul fork-file-pointer:
      ./fork-file-pointer
      • Într-o altă consolă urmăriți evoluția cursorului de fișier pentru procesul creat (procesul părinte) folosind comanda:
        lsof -a -o -d 0-1023 -p $(pidof fork-file-pointer | cut -d ' ' -f 1)
        • Cursorul de fișier este indicat de coloana OFFSET.
      • Vizualizați conținutul fișierului f.txt după rularea programului:
        cat f.txt
    • Se observă că, în urma fork(), se partajează cursorul de fișier al fișierelor deschise înainte de fork().
  8. Intrați în directorul orphan-zombie/ din arhiva cu demo-uri a cursului.
    • Parcurgeți fișierele orphan.c și zombie.c.
    • Compilați cele două programe folosind comanda:
      make
      • Veți obține executabilele orphan și zombie.
    • Rulați executabilul orphan:
      ./orphan
      • Într-o altă consolă urmăriți PID-urile și PPID-urile celor două procese (părinte și copil):
        watch -n 1 ps -f -C orphan
      • Urmăriți mesajele afișate de procesul copil. Mesajele vor fi afișate și după terminarea procesului părinte.
      • Observați actualizarea PID-ului procesului părinte (PPID) pentru procesul copil. Observați înfierea acestuia de procesul init.
    • Rulați executabilul zombie:
      ./zombie
      • Într-o altă consolă urmăriți cele două procese (părinte și copil):
        watch -n 1 ps -f -C zombie
      • Observați trecerea procesului copil în starea zombie; în ieșirea comenzii ps apare șirul <defunct>.
      • Observați eliminarea procesului zombie după așteptarea sa de procesul părinte.
so/cursuri/curs-03.1363080617.txt.gz · Last modified: 2013/03/12 11:30 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