This is an old revision of the document!
Curs 06 - Memoria virtuală
Demo-uri
Pentru parcurgerea demo-urilor, folosiți arhiva aferentă.
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
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?
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
.
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ă.
Rulați executabilul nou prin strace
.
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.
Î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.
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.
Urmăriți evoluția numărului de page fault-uri pentru cele două procese: părinte și copil.