This shows you the differences between two versions of the page.
so:laboratoare:laborator-05 [2019/03/17 01:00] ioana_elena.ciornei [Exercițiul 6 - Stack overflow] |
so:laboratoare:laborator-05 [2022/03/02 09:32] (current) teodor_stefan.dutu [Exercițiul 0 - GSOC] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laborator 05 - Gestiunea memoriei ====== | ====== Laborator 05 - Gestiunea memoriei ====== | ||
- | ===== Materiale ajutătoare ===== | ||
- | *[[http://elf.cs.pub.ro/so/res/laboratoare/lab05-slides.pdf | lab05-slides.pdf]] | ||
- | *[[http://elf.cs.pub.ro/so/res/laboratoare/lab05-refcard.pdf | lab05-refcard.pdf]] | ||
==== Nice to read ==== | ==== Nice to read ==== | ||
* TLPI - Chapter 7, ''Memory Allocation'' | * TLPI - Chapter 7, ''Memory Allocation'' | ||
+ | |||
+ | ===== Link-uri către secțiuni utile ===== | ||
+ | |||
+ | * [[#Gestiunea memoriei]] | ||
+ | * [[#Spațiul de adresă al unui proces]] | ||
+ | * [[#Alocarea/Dealocarea memoriei]] | ||
+ | * [[#Lucru cu memoria - Probleme]] | ||
+ | * [[#GDB - Detectarea zonei de acces nevalid de tip page fault]] | ||
+ | * [[#mcheck - verificarea consistenței heap-ului]] | ||
+ | * [[#Leak-uri de memorie]] | ||
+ | * [[#Valgrind]] | ||
+ | * [[#mtrace]] | ||
+ | * [[#Dublă dealocare]] | ||
+ | | ||
===== Gestiunea memoriei ===== | ===== Gestiunea memoriei ===== | ||
Line 23: | Line 34: | ||
Este, în consecință, fundamentală cunoașterea contextului în care acționează subsistemul de gestiune a memoriei și înțelegerea interfeței puse la dispoziție programatorului de către sistemul de operare. | Este, în consecință, fundamentală cunoașterea contextului în care acționează subsistemul de gestiune a memoriei și înțelegerea interfeței puse la dispoziție programatorului de către sistemul de operare. | ||
+ | |||
===== Spațiul de adresă al unui proces ===== | ===== Spațiul de adresă al unui proces ===== | ||
Line 317: | Line 329: | ||
DIE (mat == NULL, "HeapAlloc"); | DIE (mat == NULL, "HeapAlloc"); | ||
- | for (i = 0; i < n; i++) { | + | for (i = 0; i < m; i++) { |
mat[i] = HeapAlloc(processHeap, 0, n * sizeof(**mat)); | mat[i] = HeapAlloc(processHeap, 0, n * sizeof(**mat)); | ||
if (mat[i] == NULL) { | if (mat[i] == NULL) { | ||
Line 842: | Line 854: | ||
====== Exerciții ====== | ====== Exerciții ====== | ||
- | ===== Exercițiul 0 - Joc interactiv ===== | + | <note important> |
+ | În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://github.com/systems-cs-pub-ro/so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''git clone https://github.com/systems-cs-pub-ro/so''. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''git clone https://github.com/systems-cs-pub-ro/so ${target}''. | ||
- | * Detalii desfășurare [[http://ocw.cs.pub.ro/courses/so/meta/notare#joc_interactiv|joc]]. | + | Pentru a actualiza repository-ul, folosiți comanda ''git pull origin master'' din interiorul directorului în care se află repository-ul. Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. În cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările: |
+ | <code> | ||
+ | git stash | ||
+ | git pull origin master | ||
+ | git stash pop | ||
+ | </code> | ||
+ | Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://gitimmersion.com. | ||
+ | </note> | ||
+ | <note tip>Pentru a vă ajuta la implementarea exercițiilor din laborator, în directorul ''utils'' din arhivă există un fișier ''utils.h'' cu funcții utile. | ||
+ | </note> | ||
+ | ==== Exercițiul 0 - GSOC ==== | ||
- | ===== Linux ===== | + | Google Summer of Code este un program de vară în care studenții |
+ | (indiferent de anul de studiu) sunt implicați în proiecte Open Source | ||
+ | pentru a își dezvolta skill-urile de programare, fiind răsplătiți cu o | ||
+ | bursă a cărei valoare [[https://developers.google.com/open-source/gsoc/help/student-stipends|depinde de țară]] | ||
+ | ([[https://developers.google.com/open-source/gsoc|pagină principală GSOC]]). | ||
- | <note important>În rezolvarea laboratorului folosiți arhiva de sarcini [[http://elf.cs.pub.ro/so/res/laboratoare/lab05-tasks.zip | lab05-tasks.zip]]</note> | + | UPB se află în top ca număr de studenți acceptați; în fiecare an fiind |
+ | undeva la aprox. 30-40 de studenți acceptați. | ||
+ | Vă încurajăm să aplicați! | ||
+ | |||
+ | ===== Linux ===== | ||
- | <note tip>Pentru a vă ajuta la implementarea exercițiilor din laborator, în directorul ''utils'' din arhivă există un fișier ''utils.h'' cu funcții utile. | ||
- | </note> | ||
==== Exercițiul 1 - Zone de stocare a variabilelor ==== | ==== Exercițiul 1 - Zone de stocare a variabilelor ==== | ||
Intrați în directorul ''1-counter'' și implementați funcția ''inc()'' care întoarce de fiecare dată un întreg reprezentând numărul de apeluri până în momentul respectiv al funcției ''inc'' (**nu** aveți voie să folosiți variabile globale). | Intrați în directorul ''1-counter'' și implementați funcția ''inc()'' care întoarce de fiecare dată un întreg reprezentând numărul de apeluri până în momentul respectiv al funcției ''inc'' (**nu** aveți voie să folosiți variabile globale). | ||
- | |||
==== Exercițiul 2 - Spațiul de adresă al unui proces ==== | ==== Exercițiul 2 - Spațiul de adresă al unui proces ==== | ||
Line 949: | Line 977: | ||
* în funcția ''take_snapshot'' salvați în structura de date ce reține imaginea stivei câmpurile adresă și valoare. | * în funcția ''take_snapshot'' salvați în structura de date ce reține imaginea stivei câmpurile adresă și valoare. | ||
- | Ce reține structura ''stack_elements''? | + | Ce reține structura ''stack_element''? |
Funcția ''f2'' pune pe stivă un vector de 3 întregi. În ce ordine sunt puse elementele vectorului pe stivă? | Funcția ''f2'' pune pe stivă un vector de 3 întregi. În ce ordine sunt puse elementele vectorului pe stivă? | ||
Line 991: | Line 1019: | ||
- | ==== Exercițiul 9 - Lucrul cu stiva ==== | + | <hidden>==== Exercițiul 9 - Lucrul cu stiva ==== |
Intrați în directorul ''9-bad_stack'' și analizați fișierul ''bad_stack.c''. Compilați și rulați programul. | Intrați în directorul ''9-bad_stack'' și analizați fișierul ''bad_stack.c''. Compilați și rulați programul. | ||
Line 1002: | Line 1030: | ||
<note tip>Indicație: Mutați variabila ''lab_so'' din funcția ''my_fun()'' într-o altă zonă de memorie.</note> | <note tip>Indicație: Mutați variabila ''lab_so'' din funcția ''my_fun()'' într-o altă zonă de memorie.</note> | ||
- | + | </hidden> | |
- | ===== Exerciții BONUS (3 SO Karma) ===== | + | ===== Exerciții BONUS ===== |
==== BONUS Windows ==== | ==== BONUS Windows ==== | ||
Line 1033: | Line 1061: | ||
<note tip>Pentru rularea programului de test, nu uitați să exportați ''LD_LIBRARY_PATH'' (revedeți secțiunea de [[so:laboratoare-2013:laborator-01#biblioteci in linux | biblioteci partajate din laboratorul 1]])</note> | <note tip>Pentru rularea programului de test, nu uitați să exportați ''LD_LIBRARY_PATH'' (revedeți secțiunea de [[so:laboratoare-2013:laborator-01#biblioteci in linux | biblioteci partajate din laboratorul 1]])</note> | ||
- | ===== Soluții ===== | ||
- | |||
- | [[http://elf.cs.pub.ro/so/res/laboratoare/lab05-sol.zip | lab05-sol.zip]] | ||
===== Resurse utile ===== | ===== Resurse utile ===== |