# SO Lista 8
###### tags: `so`
## Zadanie 1

`sbrk` umożliwia zwiększanie lub zmniejszanie rozmiaru sterty.
Sbrk umożliwia zwiększenie lub zmniejszenie rozmiaru sterty, ale nie umożliwia jej dzielenia na mniejsze fragmenty ani przenoszenia jej do innej lokalizacji w pamięci.
Poprawę wydajności i efektywności zarządzania pamięcią można osiągnąć przy pomocy mmap i munmap. mmap umożliwia tworzenie mapowania pamięci wirtualnej, co pozwala na wydzielanie fragmentów pamięci i przenoszenie ich do innej lokalizacji w pamięci. munmap umożliwia usuwanie mapowania pamięci, co pozwala na zwolnienie niepotrzebnej pamięci i poprawę wydajności.
Problem pojawią się wtedy gdy za pomocą sbrk wydłuzymy sobie stertę i zalokujemy dużo pamięci po czym zwolnimy tą co była na początku. Wtedy nie możemy zmniejszyć sterty gdyż wtedy pozbylibyśmy się tych najwyżej zapisanych danych.
https://man7.org/linux/man-pages/man3/mallopt.3.html


## Zadanie 2

**fragmentacja wewnętrzna** - zachodzi gdy marnowana pamięć znajduje się *wewnątrz* zajętego bloku (zajęty blok jest większy niż żądało tego wywołanie `malloc`) i jest mocno związana z implementacją alokatora. Zalicza się do niej:

* pamięć potrzebną do trzymania metadanych dangeo bloku (np. jego rozmiar)
* nadmiarową pamięć w bloku (np. wymaganie wyrównania albo polityka podziału wolnych bloków)
**fragmentacja zewnętrzna** - zachodzi gdy jest wystarczająco dużo miejsca dla alokacji nowego obiektu, ale to miejsce jest podzielone na zbyt małe bloki

**kompaktowanie** - rodzaj kompresji gdzie niweluje się puste przestrzenie - nie można tego zrobić w przypadku `malloc`, bo to by wymagało przesunięcia danych a tym samym zmiany adresu gdzie się zaczynają
Główne przyczyny fragmentacji zewnętrznej:
1. Bloki które są zwalniane pomiędzy zajętymi blokami - tworzy się krótki fragment wolnej pamięci, potencjalnie za mały na nowy obiekt.
2. Zmieniające się w czasie zachowanie programu - to w jaki sposób program alokuje nowe obiekty wpływa na stan fragmentacji (np alokowanie małych bloków, zwalanie niektórych z nich i alokowanie dużych).
## Zadanie 3

**ramps** - stopniowy przyrost pamięci
**peaks** - nagły wzrost pamięci po którym następuje jej zwolnienie
**plateaus** (płaskowyże) - szybki wzrost pamięci która długo nie jest zwalniana



1. Obiekty alokowane w podobnym czasie często są zwalniane w podobnym czasie
2. Obiekty różnych typów często będą służyć różnym celom, dlatego będą zwalniane w różnym czasie. Problem jest taki że `malloc` nie zna typu, ale sam rozmiar obiektu jest często powiązany z typem i przeznaczeniem obiektu.
**first-fit** - wybierz pierwszy wolny blok od początku listy który może pomieścić allokowany obiekt
+ działa stosunkowo szybko
- z czasem może tworzyć dużo wolnych bloków małego rozmiaru na początku listy, co wydłuża czas działania
**next-fit** - wybierz pierwszy wolny blok, ale poszukiwania zacznij tam gdzie ostatnio skończyłeś
+ dziła stosunkowo szybko, jednocześnie rozrzucając fragmentację na całą stertę, a nie tylko na jej początek
- obiekty tworzone w różnych momentach działania programu będą się ze sobą przeplatać, co prowadzi do fragmentacji
- w praktyce powoduje największą fragmentację w porównaniu do **first fit** i **best fit**
**best-fit** - wybierz najmniejszy możliwy blok który będzie mógł pomieścić allokowany obiekt
+ tworzy mało nieużytków
- działa wolno (jeśli nie znajdzie idealnego dopasowania idzie przez całą stertę)