Fragmentacja pamięci

Z Wikipedii, wolnej encyklopedii
(Przekierowano z Fragmentacja wewnętrzna)
Zera i jedynki pokazujące defragmentację pamięci

Fragmentacja pamięci – niekorzystne zjawisko pojawiające się podczas zarządzania pamięcią operacyjną bądź dyskową.

Fragmentacja wewnętrzna[edytuj | edytuj kod]

Wynika z natury zarządców pamięci, które albo z przyczyn technicznych, albo wydajnościowych, nie operują na obszarach o dowolnym rozmiarze, lecz blokach danych będących wielokrotnością określonej liczby bajtów. Np. na dyskach twardych jednostką jest sektor (mający zwykle pół kilobajta), systemy plików operują na klastrach składających się z kilku-kilkunastu sektorów dyskowych, systemy operacyjne przydzielają aplikacjom strony (np. w procesorach x86 strona ma najczęściej rozmiar 4 kB), zaś wewnętrznie aplikacje zwykle alokują pamięć w jednostkach kilku, kilkunastu bajtów (np. w bibliotece GNU libc to 8 lub 16 bajtów). Ponieważ przydzielana jest pamięć o rozmiarze zaokrąglonym w górę do wielokrotności rozmiaru bloku, toteż nadwyżka, po pierwsze, nie jest używana przez aplikację, po drugie zaś zarządca pamięci nie może jej oddać innej aplikacji. Pamięć taka jest marnowana - np. plik o rozmiarze 1 bajta w istocie zajmie cały klaster, czyli kilka kB - i te kilka kB minus 1 bajt pozostanie niewykorzystane, podobnie jeśli program zażąda od systemu operacyjnego przydzielenia 1 bajta, otrzyma całą stronę.

Fragmentacja wewnętrzna jest czasami rozwiązywana na poziomie aplikacji poprzez zastosowanie specjalizowanych zarządców pamięci. Częstym rozwiązaniem są tzw. pule pamięci (ang. memory pool), które operują na blokach o rozmiarze ściśle wymaganym przez aplikację, co praktycznie eliminuje ten rodzaj fragmentacji.

Fragmentacja zewnętrzna[edytuj | edytuj kod]

Fragmentacja zewnętrzna pojawia się w trakcie działania aplikacji, gdy dochodzi do szeregu operacji przydzielania i zwalniania bloków pamięci o różnej wielkości, skutkiem czego po pewnym czasie bloki wolne i zajęte są przemieszane. Niesie to za sobą dwa problemy:

  • Współczesne dyski jak i mikroprocesory potrafią niwelować opóźnienia odczytu i zapisu (m.in. dzięki pamięciom podręcznym, odczycie z wyprzedzeniem, grupowaniu zapisów), jednak te działania są skuteczne tylko w przypadku odwoływania się do bliskich sobie bloków pamięci (najlepiej kolejno występujących po sobie).
  • W zarządzaniu pamięcią operacyjną przydziela się jeden ciągły blok, może jednak wystąpić sytuacja, w której sumaryczna wielkość wolnych bloków będzie satysfakcjonująca, lecz nie będzie istniał jeden ciągły obszar o wymaganej wielkości - toteż taki przydział się nie powiedzie.

Fragmentacja zewnętrzna w systemach plików jest rozwiązywana przez defragmentację specjalizowanymi narzędziami.

Fragmentacja zewnętrzna w zarządzaniu pamięcią operacyjną może być wyeliminowana przez kompaktowanie pamięci, tj. przesuwanie zajętych bloków tak, żeby możliwie jak najwięcej wolnych bloków połączyło się w ciągłe obszary. Kompaktowanie jest możliwe tylko wtedy, gdy zarządca ma pełne informacje o pamięci i jej wykorzystaniu przez program - zwykle możliwe do zrealizowania w aplikacjach używających odśmiecania.

Zobacz też[edytuj | edytuj kod]

Bibliografia[edytuj | edytuj kod]