This is an old revision of the document!
Laboratorul constă în subiecte în stilul celor de la examen, însoțite de mici bucăți de cod complete sau aproape complete pe care le puteți rula pentru a vă convinge. Discuția pe marginea subiectelor cu asistentul sau cu colegii este încurajată. Subiectele sunt suficient de multe încât nu pot fi acoperite într-un singur laborator.
Utilizați arhiva recap.tar.gz recap.tar.gz aferentă laboratorului.
01-cow-dp
. make && make run
fault/fault
și fault2/fault
.fault/fault
) nu se mai face Demand-paging?02-io
şi inspectaţi fişierul splice.c
. splice
?run.sh
: sudo ./run.sh
Command terminated by signal 13
03-threads-counter
.În ce director din /proc/$PID/
se află informațiile despre thread-urile procesului? De ce acestea au asignat un pid?04-functions-hijacking
, compilați (make
) și rulați (./test
și LD_PRELOAD=./libnative.so ./test
. Cum explicați output-ul diferit?05-init
. Compilați programul initializari
. De ce durează mai mult prima inițializare? De asemenea, încercați să explicați dimensiunea mare a executabilului.06-addrspc
și inspectați fișierul addrspc.c
. Ce se întâmplă cu spațiul de adresă al procesului în momentul schimbării de context?/proc/$PID/maps
07-reentr/reentr.c
ca fiind reentrante / thread-safe. Puteți modifica programul încât să puneți în evidență aceste aspecte.08-stack-growth
.for (i = 0; i < 10; i++) { getpid(); write(1, "A", 1); }
09-syscall
.pid_test.c
.strace
. strace ./pid_test
fork_test.c
.SYS_TYPE
pe rând valorile SYS_NATIVE
şi SYS_GLIBC
. *Explicaţi rezultatul obţinut. Citiţi secţiunea NOTES
din getpid(2)
.fork.c
din directorul 10-fork
./* de completat */ ... fputs("alfa", stderr); fputs("beta", stdout);
12-file
, si rulati comanda ./file >out 2>err
13-access
. Rulați cele 2 programe atât cu macro-ul TEST_ACCESS definit cât și fără acesta. Măsurați timpii de rulare folosind time și încercați să explicați diferența.int page_size = getpagesize(); for (i = 0; i < 1000; i++) ptr[i] = malloc(page_size);
se obține un număr redus de apeluri de sistem, de ordinul zecilor (apelul de sistem folosit de malloc este brk
). Cum explicați?
14-malloc-syscalls
.malloc-syscalls.c
.make
).strace -e brk ./malloc-syscall 2>&1 > /dev/null | wc -l
.ltrace -e malloc ./malloc-syscall 2>&1 > /dev/null | wc -l
.DO_FREE
la valoarea 1.brk
au loc? Cum explicați? Ce rol are apelul de sistem brk
?char *p; int status; size_t i; int page_size = getpagesize(); char value; p = mmap(NULL, NUM_PAGES * page_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (p == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } for (i = 0; i < NUM_PAGES; i++) p[i*page_size] = i; switch (fork()) { case -1: /* handle error */ perror("fork"); exit(EXIT_FAILURE); case 0: /* child process */ for (i = 0; i < NUM_PAGES / 2; i++) value = p[i*page_size]; for (i = NUM_PAGES; i < NUM_PAGES; i++) p[i*page_size] = page_size-i; exit(EXIT_SUCCESS); break; default: break; } wait(&status); for (i = 0; i < NUM_PAGES; i++) p[i*page_size] = i;
15-faults
.fork-faults.c
.make
).sysstat
. Pachetul conține utilitarul pidstat
care permite monitorizarea page fault-urilor unui proces (prin intermediul argumentului -r
).fork-faults
. Folosiți ENTER
pentru a continua programul.pidstat -r -T ALL -p $PID
pentru a urmări page fault-urile. Rulați comanda pentru fiecare secvență de program.$PID
reprezintă pid-ul unui proces. Puteți afla atât pid-ul procesului părinte cât și pe cel al procesului copil cu o comandă de forma ps -ef | grep fork-faults
.