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-06-demo.zip
și apoi decomprimăm arhiva
unzip curs-06-demo.zip
și accesăm directorul rezultat în urma decomprimării
cd curs-06-demo/
Acum putem parcurge secțiunile cu demo-uri de mai jos.
Dorim să investigăm modul în care se alocă variabilele într-un executabil. Pentru aceasta accesăm subdirectorul exec-vars/; urmărim conținutul fișierului exec-vars.c. În acest fișier definim/alocăm variabile în diverse forme: dinamic, static, global. Vrem să vedem cum sunt acestea alocate în executabil și în proces.
Compilăm programul folosind make.
Investigăm zonele de memorie din executabil în care sunt salvate variabilele, folosind comanda
objdump -t addr-space | grep var
De ce apar doar unele variabile?
Ce semnfică l și g în output-ul obținut?
Pentru a afișa conținutul zonei .rodata folosind comanda
readelf -x .rodata addr-space
Secțiunea .rodata conține variabile read-only, în cazul de față literalul rulz. Literalii și constantele se stocează în secțiunea .rodata a unui executabil.
Vrem să vizualizăm spațiul virtual de adrese al unui proces. Pentru aceasta, accesăm subdirectorul pmap; urmărim conținutul fișierului pmap.c; facem mapări (folosind apelul mmap) folosind diverse flag-uri.
Compilăm programul folosind make și apoi îl rulăm:
./pmap
Într-o altă consolă urmărim schimbările din spațiul virtual de adrese al procesului creat folosind comanda
watch -d pmap $(pidof pmap)
Comanda de mai sus urmărește spațiul virtual de adrese. Ca să generăm schimbări în spațiul virtual de adrese, apăsăm ENTER în consola în care rulează programul pentru a continua pașii din cod.
Urmărim modificările care apar în urma diferitelor tipuri de mapare din cod. Observăm că se mapează câte o singură pagină; la fiecare operație de mapare spațiul total crește cu 4K, iar la fiecare operație de demapare spațiul total scade cu 4K. Observăm că în cazul mapării partajate permisiunile sunt rw-s; s înseamnă shared. Tot în cazul memoriei partajate apare mapat dispozitivul /dev/zero, unul dintre modurile uzuale de a face mapare partajată.
De ce unele biblioteci sunt mapate cu permisiuni de scriere?
3-allocation/.allocation.c.make../allocation
watch -n 1 ps -o pid,rss,vsz,cmd -p $(pidof allocation)
malloc și doar a spațiului virtual folosind mmap.strace:strace ./allocation
malloc?mmap?malloc sunt mai puține apeluri de sistem?malloc să aloce, la fel ca și mmap calupuri de 1MB de memorie.make.strace.malloc?malloc cu apelul de sistem și argumentele acestuia invocate de mmap.4-demand-paging/.demand-paging.c.make../demand-paging
watch -n 1 ps -o pid,rss,vsz,cmd -p $(pidof demand-paging)
./demand-paging
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)
5-fork-faults/.fork-faults.c.fork-faults.ENTER pentru a continua programul, dar după rularea pidstat (vedeți mai jos).pidstat din pachetul sysstat care permite monitorizarea page fault-urilor unui proces (prin intermediul argumentului -r).pidstat trebuie să instalați pachetul sysstat folosind comanda:apt-get install sysstat
pidstat -r -T ALL -p $(pidof fork-faults) 5 100
pentru a urmări page fault-urile.
ENTER cu afișajul comenzii pidstat.