Adam Klobukowski napisał/a:UPX jak każdy paker exe, najpierw alokuje pamięć na rozpakowanie, rozpakowuje, a potem ewentualnie zwalnia miejsce spakowanych danych. To zwiększa fragmentację.
Czyli tak jak inny program alokujący dealokujący pamięć. Więc z tego można wywnioskować jedynie, że każdy program użytkownika robiąc alokację/dealokację zwiększa fragmentację pamięci. I tak jest to prawda :), no chyba, że robi alokacje dobrze i korzysta z własnego managera. Ale to nie oznacza, że upx czy inny paker jest zły, bo robi te same rzeczy co inne programy. Pozatym skąd wiesz, może ma jakiś własny manager pamięci, który minimalizuje fragmentację?
Adam Klobukowski napisał/a: Managery pamięci bez pamięci wirtualnej nie mają większego sensu.
Jeśli nie masz pamięci wirtualnej, to alokując 'nadmiarowe' fragmenty pamięci, powodujesz że staje się ona niedostępna, mimo że wcale nie musisz jej wykorzystać.
Racja, ale po to to właśnie jest. Robisz alokację raz, albo w większych/równych blokach (w jednostkach kilku, kilkunastu bajtów w wielokrotności minimalnych minimalnych bloków w jakich pamięć jest przydzielana). Jak Ci się pamięć kończy to alokuje się następne bloki lub zwalnia. W razie potrzeby sam sobie tymi blokami wachlujesz, żeby zminimalizować dziury pomiędzy nimi (jak np. zwolnisz jeden blok w środku, to tak przykładowo piszę w dużym uproszczeniu).
Pozwolę sobie przytoczyć taką Wikipedię i cytat dotyczący fragmentacji zewnętrznej/wewnętrzej, który popiera moje twierdzenie (patrz zapis dot. memory poll):
Wikipedia napisał/a:Fragmentacja zewnętrzna pojawia w trakcie działania aplikacji, gdy dochodzi do szeregu przydzielania i zwalniania bloków pamięci o różnej wielkości, skutkiem czego po pewnym czasie bloki wolne i zajęte są przemieszane.
.... ciach
systemy operacyjne przydzielają aplikacjom strony (np. w procesorach x86 strona ma rozmiar 4kB), 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 zewnętrzna pojawia w trakcie działania aplikacji, gdy dochodzi do szeregu przydzielania i zwalniania bloków pamięci o różnej wielkości, skutkiem czego po pewnym czasie bloki wolne i zajęte są przemieszane.
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 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.
Adam Klobukowski napisał/a:Jeśli masz pamięć wirtualną to możesz sobie alokować niemal do woli, bo i tak naprawdę w tym wypadku decyduje dopiero sam faktyczny akt dostępu do pamięci, a pofragmentowac możesz co najwyżej swoją przestrzeń adresową, a nie całego systemu.
Ale to wcale nie potwierdza tego, że menedżery są niepotrzebne do pamięci innej niż wirtualna. Przy zwykłej pamięci też mogę sobie alokować do woli, aż mi się nie skończy albo jak już będzie tak pofragmentowana, że nie będzie się dało nic zrobić. Czym się różni pofragmentowanie przestrzeni adresowej od zwykłej fragmentacji? Chyba przestrzeń adresowa też może się kiedyś skończyć?
Adam Klobukowski napisał/a:Reset przy braku pamięci też nie jest taka oczywista, o wiele lepszym rozwiązaniem, praktykowanym przez wiele systemów jest OOM killer.
Przez wiele systemów masz na myśli linuxa? ;)
Niestety to jest oczywiste. Zdziwiłbyś się w ilu książkach o deweloperce na systemy o zamkniętej architekturze, reset urządzenia jest proponowany do usuwania tego typu problemów. Przy wczytywaniu leveli ci mogą robić soft reset 'z partyzanta', a użytkownik nawet tego nie wie. A dlaczego? Żeby sobie zaoszczędzić sobie problemów podczas działania aplikacji i pracować na 'odświeżonym systemie'. A stosowanie ww. memory poll to standard (konsole, PCty, windy, tostery, lodówki ;)).
Adam Klobukowski napisał/a:Btw. Ile ma binarka GrafX2 po zestripowaniu?
Bez stripa 3,2mb, po zestripowaniu 2mb z hakiem, po upxie trochę mniej niż 900kb. Binarka np. Papyrusa ma np o ile dobrze pamiętam 5mb, po rozpakowaniu pewnie z 10mb.
I powiem tak, fragmentacji na MiNCie się nie boję, bo prędzej system mi zejdzie niż wystąpi brak pamięci z powodu fragmentacji ;).