2010-07-28 14 views
12

Chcę zaimplementować własny system zarządzania pamięcią dynamiczną, aby dodać nowe funkcje, które pomagają zarządzać pamięcią w C++.W jaki sposób są realizowane malloc i free?

Używam Windows (XP) i Linux (Ubuntu). Co jest potrzebne do zaimplementowania funkcji takich jak "malloc" i "free"? Myślę, że muszę używać wywołań systemowych najniższego poziomu.

Dla systemu Windows znalazłem funkcje: GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy i HeapFree.

Dla systemu Linux, nie znalazłem żadnych wywołań systemowych dla zarządzania stosem. W systemie Linux malloc i free są wywołaniami systemowymi, nieprawdaż?

Dzięki

Edit:
C++ nie zapewnia śmieciarza i śmieciarza jest powolny. Niektóre alokacje są łatwe do uwolnienia, ale są alokacje, które wymagają odśmiecacza.

Chcę zaimplementować te funkcje i dodać nowe funkcje:
* Za każdym razem, gdy wywoływana jest funkcja free(), sprawdź, czy wskaźnik należy do sterty.
* Pomoc w usuwaniu śmieci. Muszę przechowywać pewne informacje o przydzielonym bloku.
* Użyj wielu stert (HeapCreate/HeapDestroy w systemie Windows). Mogę szybko usunąć całą stertę z przydzielonymi blokami.

+1

Powinieneś popatrzeć na podzielniki puli boost: http://www.boost.org/doc/libs/1_43_0/libs/pool/doc/index.html –

+2

Czy jesteś pewien, że HeapAlloc to wywołanie systemowe (jądro)? Mogą one być zaimplementowane po stronie użytkownika i uruchamiać niektóre ukryte prywatne funkcje po stronie jądra, gdy proces wymaga więcej pamięci. – doron

+0

Szkwał - brzmi to dziwnie jak pytanie domowe z tego tekstu. tak? Nie? –

Odpowiedz

14

Na Linux-ie, malloc i za darmo nie są wywołania systemowe. malloc/free uzyskuje pamięć z jądra poprzez rozszerzanie i zmniejszanie (jeśli to możliwe) segmentu danych za pomocą wywołań systemowych brk, jak również uzyskanie anonimowej pamięci z mmap - a malloc zarządza pamięcią w tych regionach. Kilka podstawowych informacji, wiele wspaniałych odniesień, można znaleźć: here

+0

W rzeczywistości 'sbrk' nie jest wywołanie systemowe, ale raczej funkcja biblioteczna. – Borealid

3

brk to wywołanie systemowe używane w systemie Linux do implementacji malloc i free. Wypróbuj stronę man, aby uzyskać informacje.

Masz już system Windows.

Widząc inne odpowiedzi tutaj, chciałbym zauważyć, że prawdopodobnie wymyśliłeś nowe koło; istnieje już wiele dobrych implementacji malloc. Ale programowanie malloc jest dobrym ćwiczeniem myślowym - spójrz na here, aby wykonać przyjemne zadanie domowe (pierwotnie kod CMU), realizując to samo. Ich powłoka daje ci trochę więcej niż system operacyjny Linux, ale :-).

4

Jeśli po prostu pakujesz wywołania systemowe, prawdopodobnie nie zyskujesz nic na standardowym malloc - to wszystko, co robią.

Częściej zdarza się, że malloc (lub HeapAlloc() itd.) Jest pojedynczym blokiem pamięci na początku programu i zarządza alokacją do tego samego, może to być bardziej wydajne, jeśli wiesz, że będziesz tworzyć/często odrzucając dużo małych bloków pamięci.

4

W * nix, obiekt malloc() jest zaimplementowany na poziomie biblioteki C. Używa on brk()/sbrk() do powiększania/pomniejszania segmentu danych, a mmap/munmap do żądania/zwalniania odwzorowań pamięci. Zobacz this page, aby uzyskać opis implementacji malloc używanej w glibc i uClibc.

+0

Jest to przydatne. Dziękuję Ci. – Squall

0

garbage collector jest powolny

Jest to całkowicie bezsensowne stwierdzenie. W wielu praktycznych sytuacjach programy mogą uzyskać znaczny wzrost wydajności dzięki wykorzystaniu Garbage Collectora, szczególnie w scenariuszach wielowątkowych. W wielu innych sytuacjach Garbage Collectors ponoszą karę wykonania.

+0

Co powiesz na śmieciarza * ogólnie * wolno – Chani

0

Wypróbuj http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html dla wskaźników.

To jest krótkie porównanie wyników ze wskazówkami dla ośmiu różnych implementacji malloc/free. Dobry punkt wyjścia, ponieważ kilka dobrych statystyk odniesienia pomoże ci ustalić, czy ulepszyłeś dostępne implementacje - czy też nie.

Powiązane problemy