Alokacja pamięci

Alokacja i dealokacja pamięci

Alokacja pamięci oraz dealokacja pamięci odnoszą się do przydzielania i zwalniania ciągłych obszarów pamięci. Po uruchomieniu, proces (program) uzyskuje od systemu operacyjnego jedno lub więcej obszarów dostępnej pamięci, które może wykorzystać w dowolny sposób. W zależności od zastosowanej struktury, obszar ten nazywany jest stertą (ang. heap) lub stos. W trakcie działania programu może on zażądać większej ilości pamięci (alokacja) lub zwolnić niepotrzebny obszar (dealokacja).

Programy zarządzają przydzieloną im pamięcią wewnętrznie – niskopoziomowe języki programowania oferują interfejs umożliwiający zarządzanie stertą, który pozwala jedynie na rezerwację pewnego obszaru (alokację) oraz jego późniejsze zwolnienie (dealokację). Wiele wysokopoziomowych języków programowania automatycznie obsługuje proces dealokacji, eliminując konieczność interwencji programisty.

Na przykład w języku C do ręcznej alokacji i dealokacji pamięci służą funkcje z biblioteki standardowej: malloc (alokacja) oraz free (dealokacja); natomiast w języku C++ wykorzystuje się specjalne słowa kluczowe, czyli operatory: new oraz delete.

Współczesne systemy operacyjne automatycznie zwalniają pamięć przydzieloną procesom w momencie ich zakończenia, nawet jeśli nie została wcześniej dokonana dealokacja. Na poziomie aplikacji, pominięcie procesu zwalniania pamięci prowadzi do wycieku pamięci, co w przypadku aplikacji działających przez dłuższy czas (np. serwery czy inne programy intensywnie alokujące i dealokujące pamięć) może być poważnym błędem. Z biegiem czasu proces taki wymaga coraz większej ilości pamięci, co może skutkować jego zawieszeniem, unicestwieniem lub znacznym spowolnieniem działania całego systemu.

Alokacja pamięci nie powiedzie się, gdy nie ma dostępnego ciągłego obszaru pamięci o wymaganym rozmiarze (zjawisko to nazywa się fragmentacją zewnętrzną).

Zarządca pamięci

Element systemu operacyjnego lub aplikacji odpowiedzialny za przydział i zwalnianie pamięci określa się mianem zarządcy pamięci. Posiada on listę obszarów wolnych i przydzielonych, z informacjami o adresie obszaru oraz jego rozmiarze. Często rozmiar ten jest wielokrotnością określonej liczby bajtów, a także może występować minimalna wartość graniczna dla przydzielanych bajtów, co prowadzi do fragmentacji wewnętrznej.

Wyróżnia się trzy strategie przydziału pamięci:

  • pierwszy pasujący – na liście wolnych obszarów wyszukiwany jest pierwszy, którego rozmiar jest większy lub równy żądanemu;
  • najlepiej pasujący – szuka się wolnego obszaru, którego rozmiar jest najbliższy żądanej wielkości;
  • najgorzej pasujący – identyfikuje się największy wolny obszar.

Istnieje także specjalny typ zarządców pamięci, zwany pule pamięci (ang. memory pool), które operują na obszarach pamięci o z góry określonym rozmiarze. W takich przypadkach problem fragmentacji zewnętrznej jest całkowicie eliminowany, a jeśli rozmiar ten jest ściśle dopasowany do potrzeb aplikacji, to znika również problem fragmentacji wewnętrznej.

Zobacz też

Przypisy

Przeczytaj u przyjaciół: