Skip to content

Latest commit

 

History

History
61 lines (59 loc) · 3.46 KB

README.md

File metadata and controls

61 lines (59 loc) · 3.46 KB

Memory-Allocator

A simple memory allocator in C. The allocation principle is based on an ’arena’ and it simulates mechanisms such as malloc, free or hexdump.

Pentru gestionarea arenei am folosit 2 pointeri globali de tip char, unul pentru a pastra adresa de inceput a arenei, iar celalalt pentru a pastra adresa de inceput al primului bloc alocat in arena. De asemenea dimensiunea arenei este tot o variabila globala.

In implementarea temei am folosit urmatoarele functii:
	- init		  - primeste ca parametru dimensiunea arenei
				      - aloca memoria pentru arena si o initializeaza pe 0
	- finalize	- elibereaza memoria folosita pentru arena
				      - seteaza pointerii de arena si al primului bloc pe NULL
	- dump		  - afiseaza continutul arenei in formatul cerut
				      - la fiecare iteratie se afiseaza un rand (16 octeti sau
					      dimensiunea ramasa, daca aceasta este mai mica)
	- alloc		  - primeste ca parametru dimensiunea blocului ce se doreste
					      a fi alocat
				      - algoritmul implementat este urmatorul:
					1) se verifica daca nu este alocat nici un bloc in arena,
						daca nu este si de asemenea arena are spatiu suficient
						se va aloca blocul la inceputul arenei
					2) altfel se verifica daca exista spatiu intre inceputul
						arenei si primul bloc alocat, daca da se va aloca
						noul bloc incepand cu pozitia 0
					3) altfel se parcurg blocurile si se cauta un spatiu
						suficient intre 2 blocuri consecutive, daca este
						gasit, blocul nou se va aloca intre cele 2 blocuri
						intre care exista spatiu
					4) altfel se verifica daca exista spatiu dupa ultimul bloc,
						in caz afirmatic aici se va aloca noul bloc
	- Free		  - primeste ca parametru indexul de la care incepe zona de
					      date, a blocului ce se doreste a fi sters
				      - se cauta blocul precedent si urmator ale blocului de sters
				      - daca exista si precedent si urmator, se va reface legatura
					      intre ele
				      - daca exista doar blocul precedent, acesta se va marca ca
					      neavand bloc urmator
				      - daca exista doar bloc urmator, acesta se va marca ca neavand
					      predecesor
				      - daca blocul de sters este primul din arena, pointerul ce
					      indica primul bloc din arena va fi actualizat sa indice
					      blocul urmator
				      - se itereaza pe zona blocului si se seteaza pe 0
	- fill		  - primeste ca parametrii indexul la care incepe zona de date
					      a blocului pe care se doreste fill, numarul de octeti si
					      valoarea cu care se face fill
				      - se seteaza un numar de octeti (minimul dintre dimensiunea de date
					      a blocului si dimensiunea de octeti dorita pentru fill)
				      - daca dimensiunea dorita este mai mare decat cea a blocului
					      si exista un bloc urmator, se va apela functia recursiv
					      cu indexul zonei de date al blocului urmator
	- myrealloc	- primeste ca parametrii indexul zonei de date al blocului
					      ce se doreste a fi realocat si noua dimensiune a acestuia
				      - se copiaza zona de date a blocului (numarul minim de octeti
					      dintre dimensiunea deja existenta si noua dimensiune)
					      intr-o zona temporala
				      - se elibereaza blocul, folosind functia myfree
				      - se incearca alocarea unui nou bloc de dimensiunea primita,
					      folosind functia alloc, iar daca alocarea a avut succes
					      se copiaza datele din zona temporala in blocul nou alocat