This is an old revision of the document!


Curs 06 - Memoria virtuală

  • Suport curs
    • Operating Systems Concepts Essentials
      • Capitolul 8 - Virtual Memory
    • Modern Operating Systems
      • Capitolul 4 - Memory Management
        • Secțiunile 4.4, 4.5

Demo-uri

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

  1. Spațiul de adresă al unui proces
    • Intrați în directorul 1-addr-space și deschideți sursa addr-space.c.
    • În alt terminal compilați și rulați programul.
    • Observați zonele de memorie din executabil în care sunt salvate variabilele, folosind comanda:
      objdump -t addr-space | grep var
    • Explicați de ce apar doar unele variabile.
    • Ce semnfică l și g din output-ul obținut?
    • Afișați conținutul zonei .rodata folosind comanda
      readelf -x .rodata addr-space
  2. Investigarea mapării folosind pmap
    • Intrați în directorul 2-intro și compilați sursa intro.c.
    • Rulați programul intro. Folosiți ENTER pentru a continua programul.
    • Folosiți comanda
      watch -d pmap $(pidof intro)

      pentru a urmări modificările asupra memoriei procesului.

    • Urmăriți modificările care apar în urma diferitelor tipuri de mapare din cod.
    • De ce unele biblioteci sunt mapate cu drept de scriere?
  3. Alocarea de memorie virtuală
    • Intrați în directorul 3-allocation/.
    • Consultați fișierul allocation.c.
    • Compilați sursele folosind comanda make.
    • Deschideți o consolă nouă.
    • Într-o consolă rulați executabilul aferent:
      ./allocation
    • Într-o altă consolă vizualizați dimensiunea spațiului fizic ocupat și a a spatiului virtual ocupat, folosind comanda:
      watch -n 1 ps -o pid,rss,vsz,cmd -p $(pidof allocation)
    • Observați cum crește dimensiunea spațiului fizic și a spatiului virtual în cazul folosirii malloc și doar a spațiului virtual folosind mmap.
      • Cum explicați acest comportament?
    • Rulați executabilul prin strace:
      strace ./allocation
      • Ce apel de sistem invocă funcția malloc?
      • Dar funcția mmap?
      • De ce, la 1024 de apeluri ale funcției malloc sunt mai puține apeluri de sistem?
    • Actualizați codul astfel încât malloc să aloce, la fel ca și mmap calupuri de 1MB de memorie.
    • Compilați noua sursă folosind comanda make.
    • Rulați executabilul într-o consolă și comanda de vizualizare în altă consolă.
      • Ce observați?
      • Cum vă explicați acest comportament?
    • Rulați executabilul nou prin strace.
      • Ce apel de sistem invocă acum funcția malloc?
      • Comparați apelul de sistem (și argumentele acestuia) invocat acum de malloc cu apelul de sistem și argumentele acestuia invocate de mmap.
  4. Paginare la cerere (demand paging)
    • Intrați în directorul 4-demand-paging/.
    • Consultați fișierul demand-paging.c.
    • Compilați sursele folosind comanda make.
    • Deschideți o consolă nouă.
    • Într-o consolă rulați executabilul aferent:
      ./demand-paging
    • Într-o altă consolă vizualizați dimensiunea spațiului fizic ocupat și a a spatiului virtual ocupat, folosind comanda:
      watch -n 1 ps -o pid,rss,vsz,cmd -p $(pidof demand-paging)
    • Observați cum crește dimensiunea spațiului spatiului virtual fără a crește dimensiunea spațiului fizic în prima parte.
      • Observați cum crește dimensiunea spațiului fizic în a doua parte (fără a crește dimensiunea spațiului virtual).
    • Într-o consolă rulați executabilul aferent:
      ./demand-paging
    • Într-o altă consolă vizualizați numărul de page fault-uri generate de program (min_flt este coloana de interes, maj_flt este pentru interacțiuni cu discul – swapping):
      watch -n 1 ps -o pid,min_flt,maj_flt,cmd -p $(pidof demand-paging)
    • Observați cum nu există page fault-uri în prima pare a rulării programului.
      • Observați cum există page fault-uri în a doua parte a rulării programului.
      • Câte page fault-uri sunt generate la o “trecere prin chunk”? De ce?
  5. Page-Faulturi
    • Intrați în directorul 5-fork-faults/.
    • Consultați fișierului fork-faults.c.
    • Câte page-fault-uri credeți că se realizează la rulare?
    • Compilați fișierul.
    • Rulați programul fork-faults.
    • Folosiți ENTER pentru a continua programul, dar după rularea pidstat (vedeți mai jos).
    • Pe un alt terminal sau tab de terminal folosiți utilitarul pidstat din pachetul sysstat care permite monitorizarea page fault-urilor unui proces (prin intermediul argumentului -r).
      • Dacă nu merge comanda pidstat trebuie să instalați pachetul sysstat folosind comanda:
        apt-get install sysstat
    • Folosiți comanda
      pidstat -r -T ALL -p $(pidof fork-faults) 5 100

      pentru a urmări page fault-urile.

      • Comanda de mai sus vă afișează câte un mesaj la fiecare 5 secunde. Sincronizați apăsarea tastei ENTER cu afișajul comenzii pidstat.
    • Urmăriți evoluția numărului de page fault-uri pentru cele două procese: părinte și copil.
      • Page fault-urile care apar în cazul unui copy-on-write în procesul copil vor fi vizibile ulterior și în procesul părinte.
so/cursuri/curs-06.1395383431.txt.gz · Last modified: 2014/03/21 08: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