---
# System prepended metadata

title: SO Lista 8
tags: [so]

---

# SO Lista 8

###### tags: `so`

## Zadanie 1

![](https://i.imgur.com/1SUyZBU.png)

`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

![](https://i.imgur.com/fbEcIty.png)

![](https://i.imgur.com/dNlrylY.png)


## Zadanie 2

![](https://i.imgur.com/BmxJ3gw.png)

**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:

![](https://i.imgur.com/mkt8xNW.png)


* 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

![](https://i.imgur.com/zR5a7r2.png)


**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

![](https://i.imgur.com/c2Mp2Or.png)

**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

![](https://i.imgur.com/aOCdKoD.png)
![](https://i.imgur.com/1JmKR6I.png)
![](https://i.imgur.com/oYCDaAH.png)

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ę)
