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

[wersja nieprzejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
m szkic
 
m drobne redakcyjne
Linia 1:
'''Fragmentacja pamięci''' - w [[informatyka|informatyce]] niekorzystne zjawiska pojawiające się podczas zarządzania pamięcią operacyjną bądź dyskową. Problemy te wynikają z natury zarządców pamięci, które najczęściej bądź toalbo z przyczyn technicznych, bądźalbo wydajnościowych, nie operują na obszarach o dowolnejdowolnym liczbie bajtówrozmiarze, lecz zarządzają blokami danych będących wielokrotnością określonej wielkości. Np. na [[dysk twardy|dyskach twardych]] jednostką alokacji jest sektor, (mający zwykle pół kilobajta), [[system plików|systemy plików]] operują na klasterach[[klaster dyskowy|klastrach składających]] się z kilku-kilkunastu sektorów dyskowych, [[system operacyjny|systemy operacyjne]] przydzielają aplikacjom strony (np. w procesorach x86 strona ma rozmiar 4kB), zaś aplikacje zwykle również alokują pamięć w jednostkach kilku, kilkunastu bajtów.
 
Fragmentacja pamięci to de facto dwa odrębne problemy:
# '''Fragmentacja wewnętrzna''' - wynika wprost z blokowej natury przydziałuzarządzania pamięcipamięcią: aplikacjaprzydzielana otrzymujejest określonąpamięć liczbęo bloków,rozmiarze zwyklezaokrąglonym więcejw pamięcigórę niżdo potrzebujewielokrotności rozmiaru bloku, niewykorzystanatoteż ewentualna nadwyżka po pierwsze nie jest marnowanawykorzystywana -przez aplikację, po drugie zaś z punktu widzenia zarządcy pamięci ta została już użyta, więc żadna inna aplikacja jej nie otrzyma. 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 zewnętrzna''' - problem dotyczy w głównej mierze zarządzania pamięcią wewnętrzną. Program żądająca przydziału pamięci wewnętrznej, bądź to od systemu operacyjnego, bądź od zarządcy działającego na poziomie aplikacji wymaga, żeby blok pamięci był ciągły, żeby stanowił całość. Jednak w trakcie działania programu, gdyaplikacji dochodzi do szeregu przydzielania i zwalniania bloków pamięci o różnej wielkości, możetoteż wystąpićpo sytuacja,pewnym wczasie którejbloki sumarycznawolne wielkośći wolnychzajęte bloków będzieprzemieszane. satysfakcjonująca,Ma leczto niedwa będzie istniał jeden ciągły obszar o wymaganej wielkości - toteż przydział się nie powiedzie.skutki:
#* Współczesne dyski jak i mikroprocesory potrafią niwelować opóźnienia odczytu i zapisu (m.in. dzięki [[cache|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 kolejnych).
#* 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ż przydział się nie powiedzie.
 
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 poll''), które operują na blokach o rozmiarze ściśle wymaganym przez aplikację, co praktycznie eliminuje ten rodzaj fragmentacji.
 
Fragmentacja zewnętrzna dotyczyw również systemówsystemach plików, leczjest mogąrozwiązywana oneprzez [[defragmentacja|defragmentację]].
funkcjonować [[fragmentacja (system plików)|pofragmentowane]], zwykle jednak rozmieszczenie danych pliku w różnych, niekolejnych klastrach skutkuje spadkiem szybkości operacji plikowych. [[Defragmentacja]] eliminuje fragmentację zewnętrzną.
 
Fragmentacja zewnętrzna w zarządzaniu pamięcią wewnętrznąoperacyjną może być rozwiązywana przez '''kompaktowaniem pamięci''', tj. przesuwaniem zajętych bloków, tak żeby możliwie jak najwięcej wolnych bloków połączyło się w ciągłe obszary. KompaktownieKompaktowanie 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śmiecanie pamięci|odśmiecania]].
 
Zaistnienie fragmentacji zewnętrznej może mieć także negatywne konsekwencje dla szybkości działania aplikacji, jeśli bloki pamięci używanej przez aplikację będą w pamięci umieszczone "losowo" (niekolejno, w różnych odstępach, itp.). Współczesne procesory łatwo niwelują opóźnienia w odczycie kolejnych obszarów pamięci (np. poprzez wczytywanie większych porcji danych do [[cache|pamięci podręcznej]]), co w opisanym przypadku w niczym nie pomoże.