zarządzanie pamięcią

zarządzanie pamięcią
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
0

Cześć :)
1.Jak sprawdzić, jak duży jest zaalokowany obszar pamięci dla danego wskaźnika?
Chodzi o to, że przy użyciu np. malloc()'a jako parametr podajemy mu ilosć pamięci. Chciałbym przekonać się, na ile malloc() nas "słucha". Tzn. ile w rzeczywistości przydziela.

Bo na pewno musi przydzialać jakieś "okrągłe" kawałki.

  1. Z jakiego względu tak jest?
    Tłumaczę to sobie 'page-aligment', ale może jakieś inne przyczyna?
  2. Czy rzeczywiście jest tak, że można minimalnie zaalokować czterey kilobajty?

Czytam trochę o systemach operacyjnych i wg autora najczęściej w architekturach x86 strona w pamięci wirtualnej ma rozmiar 4KB.
pozdrawiam :)

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
  1. Nie ma takiej możliwości. Ale niektóre implementacje udostępniają odpowiednie narzędzia.
  2. Te kawałki musi umieszczać w drzewie lub na liście, więc minimalnym ograniczeniem jest oczywiście rozmiar takiego elementu.
  3. Może w jakichś dziwnych implementacjach.

Na temat x86 nie zrozumiałeś, chodziło o przydzielenie obszaru systemowego dla całego programu, mylisz z przydzielaniem w C/C++

RE
  • Rejestracja: dni
  • Ostatnio: dni
2

To o wiele bardziej skomplikowana kwestia. Od stron w pamięci wirtualnej do pamięci zwróconej przez malloc jest długa droga. Na Windows pomiędzy jednym i drugim stoi menedżer sterty, który ma dwa poziomy, front-end i back-end. Obecnie Windows posiada dwie implementacje front-endu, LAL i LFH (Vista+). LAL to dość prosty mechanizm, przechowuje 128 list bloków o stałych rozmiarach (od 8 do 1024 bajtów). Jeżeli nie ma wolnego bloku to przechodzimy do back-endu, który bloki jako listy liniowo umieszcza w większych segmentach. Segmenty są już alokowane w wirtualnej pamięci przez menedżer pamięci.

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
0
  1. Może w jakichś dziwnych implementacjach.

A ile można minimalnie FAKTYCZNIE zaalokować pamięci przy użyciu malloc?.

RE
  • Rejestracja: dni
  • Ostatnio: dni
2

Jeden bajt. Malloc-a to, co dzieje się pod maską systemu operacyjnego nic więcej nie obchodzi (np. fakt, że pod Windows zawsze dostaniesz minimum 8 bajtów).

Jeżeli jesteś zainteresowany co stanie się np. w Windows 7 to obejrzyj sobie tę prezentację:

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
0

prezentację obejrzę, dzięki :)
No właśnie, dlaczego malloc przydzieli 8 bajtów?
Chyba, że odpowiedź jest zbyt długa i lepiej oglądnąć prezentację :)

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

8 bajtów - długość fragmentu + adres następnego

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 199
0

a po co pamiętać adres następnego? Przecież alokujemy tak niewielki kawałek, że powinien się mieścić niepofragmentowany.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
mielony napisał(a):

a po co pamiętać adres następnego? Przecież alokujemy tak niewielki kawałek, że powinien się mieścić niepofragmentowany.

_13th_Dragon napisał(a):
  1. Te kawałki musi umieszczać w drzewie lub na liście, więc minimalnym ograniczeniem jest oczywiście rozmiar takiego elementu.

Przecież te kawałki będą też zwalniane i trzeba ich przyjąć z powrotem, scalać z poprzednim/następnym itp.

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

8 bajtów - długość fragmentu + adres następnego

Tak, 8 bajtów to również długość headera, ale długość samego bloku to również minimum 8 bajtów user-space'u (czyli w sumie 16). A dlaczego 8 bajtów to minimum? Pewnie z kilku powodów. Jednym z nich będzie taki, żeby każdy blok był przynajmniej word-aligned (a to chociażby ze względu na wydajność).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.