zarządzanie pamięcią

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 :)

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++

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.

0
  1. Może w jakichś dziwnych implementacjach.

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

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ę:

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ę :)

1

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

0

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

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.

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ść).

1 użytkowników online, w tym zalogowanych: 0, gości: 1