Alokacja pamięci: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
Kaczus2B (dyskusja | edycje)
m Dodałem informację, że automatycvzne zwalnianie pamięci dotyczy tylko niektórych systemów operacyjnych - są ciągle systemy, które tego nie robią. Są niszowe, ale zastany opis był błędny
m literówki
Linia 7: Linia 7:
Dla przykładu w języku [[c (język programowania)|C]], do ręcznej dynamicznej alokacji i dealokacji pamięci służą [[podprogram|funkcje]] [[Biblioteka standardowa języka C|biblioteki standardowej]]: <code>[[malloc]]</code> (alokacja) i <code>[[free (libc)|free]]</code> (dealokacja); w języku [[C++]] służą do tego specjalne słowa kluczowe ([[operator (programowanie)|operatory]]): <code>[[New (programowanie obiektowe)|new]]</code> oraz <code>[[delete]]</code>.
Dla przykładu w języku [[c (język programowania)|C]], do ręcznej dynamicznej alokacji i dealokacji pamięci służą [[podprogram|funkcje]] [[Biblioteka standardowa języka C|biblioteki standardowej]]: <code>[[malloc]]</code> (alokacja) i <code>[[free (libc)|free]]</code> (dealokacja); w języku [[C++]] służą do tego specjalne słowa kluczowe ([[operator (programowanie)|operatory]]): <code>[[New (programowanie obiektowe)|new]]</code> oraz <code>[[delete]]</code>.


Najpopularniejsze obecnie systemy operacyjne automatycznie zwalniają pamięć przydzieloną procesom, gdy te zakończą działanie bez uprzedniej dealokacji otrzymanej pamięci. Na poziomie aplikacji pominięcie dealokacji doprowadza do [[wyciek pamięci|wycieku pamięci]], co w przypadku aplikacji działających przez długi czas (np. serwery, lub inne aplikacje wykonujące dużo dynamicznej alokacji i dealokacji pamięci), jest uważane za poważny błąd, jako, iż z biegiem czasu proces taki będzie potrzebował coraz więcej pamięci, co może doprowadzić nawet do jego zawieszenie, unicestwienia, znacznego spowolnienia działania całego systemu lub tez jego zawieszenia.
Najpopularniejsze obecnie systemy operacyjne automatycznie zwalniają pamięć przydzieloną procesom, gdy te zakończą działanie bez uprzedniej dealokacji otrzymanej pamięci. Na poziomie aplikacji pominięcie dealokacji doprowadza do [[wyciek pamięci|wycieku pamięci]], co w przypadku aplikacji działających przez długi czas (np. serwery, lub inne aplikacje wykonujące dużo dynamicznej alokacji i dealokacji pamięci), jest uważane za poważny błąd, jako, iż z biegiem czasu proces taki będzie potrzebował coraz więcej pamięci, co może doprowadzić nawet do jego zawieszenia, unicestwienia, znacznego spowolnienia działania całego systemu lub też jego zawieszenia.


Alokacja pamięci nie powiedzie się, gdy nie istnieje wolny '''ciągły''' obszar pamięci o wymaganym rozmiarze (patrz [[Fragmentacja pamięci|fragmentacja zewnętrzna]]).
Alokacja pamięci nie powiedzie się, gdy nie istnieje wolny '''ciągły''' obszar pamięci o wymaganym rozmiarze (patrz [[Fragmentacja pamięci|fragmentacja zewnętrzna]]).

Wersja z 13:52, 9 cze 2016

Alokacja pamięci oraz dealokacja pamięci – odpowiednio przydział i zwolnienie ciągłego obszaru pamięci. Po uruchomieniu, proces (program) otrzymuje od systemu operacyjnego jedno lub więcej pól dostępnej pamięci, możliwej do dowolnego wykorzystania. W zależności od przyjętej konstrukcji i zastosowania obszar nazywany jest stertą (ang. heap) lub stosem. W trakcie działania program może zażądać od systemu operacyjnego większej ilości pamięci (alokacja) lub też zwolnić niepotrzebny obszar (dealokacja).

Wewnętrznie programy samodzielnie zarządzają przydzieloną im pamięcią - niskopoziomowe języki programowania dostarczają interfejs programistyczny do zarządzania stertą, który oferuje wyłącznie możliwość zarezerwowania pewnego obszaru (alokacja) i późniejszego jego zwalniania (dealokacja). Wiele wysokopoziomowych języków programowania automatycznie przeprowadza procedurę dealokacji, bez udziału programisty.

Dla przykładu w języku C, do ręcznej dynamicznej alokacji i dealokacji pamięci służą funkcje biblioteki standardowej: malloc (alokacja) i free (dealokacja); w języku C++ służą do tego specjalne słowa kluczowe (operatory): new oraz delete.

Najpopularniejsze obecnie systemy operacyjne automatycznie zwalniają pamięć przydzieloną procesom, gdy te zakończą działanie bez uprzedniej dealokacji otrzymanej pamięci. Na poziomie aplikacji pominięcie dealokacji doprowadza do wycieku pamięci, co w przypadku aplikacji działających przez długi czas (np. serwery, lub inne aplikacje wykonujące dużo dynamicznej alokacji i dealokacji pamięci), jest uważane za poważny błąd, jako, iż z biegiem czasu proces taki będzie potrzebował coraz więcej pamięci, co może doprowadzić nawet do jego zawieszenia, unicestwienia, znacznego spowolnienia działania całego systemu lub też jego zawieszenia.

Alokacja pamięci nie powiedzie się, gdy nie istnieje wolny ciągły obszar pamięci o wymaganym rozmiarze (patrz fragmentacja zewnętrzna).

Zarządca pamięci

Część systemu operacyjnego bądź aplikacji użytkowej odpowiedzialna za przydział i zwalnianie pamięci nazywa się zarządcą pamięci. Zarządca pamięci posiada listę obszarów wolnych i przydzielonych, charakteryzowanych adresem obszaru i jego rozmiarem. Często rozmiar jest wielokrotnością pewnej liczby bajtów, bądź też nie jest możliwe przydzielenie mniejszej liczby bajtów niż określona wartość graniczna - co w obu przypadkach 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 - wyszukiwany jest wolny obszar, którego wielkość jest najbliższa żądanej;
  • najgorzej pasujący - wyszukiwany jest największy wolny obszar.

Istnieje specjalny rodzaj zarządców pamięci, tzw. pule pamięci (ang. memory pool), które operują na obszarach pamięci o określonym z góry rozmiarze. W takich przypadkach problem fragmentacji zewnętrznej jest całkowicie eliminowany, gdy dodatkowo rozmiar ten ściśle odpowiada potrzebom aplikacji znika również problem fragmentacji wewnętrznej.

Zobacz też