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