2009-07-28 21 views
22

Chciałbym napisać własnego menedżera pamięci. Językiem docelowym jest C++, a celem menedżera pamięci jest głównie wspomaganie debugowania. Powinien wykryć podwójne zwolnienia, nadpisanie pamięci i tak dalej. I oczywiście - chciałbym się dowiedzieć o zarządzaniu pamięcią.Napisz własnego menedżera pamięci

Czy ktoś może dać mi wskazówkę, więc zasoby, gdzie mogę się nauczyć pisać takie menedżer pamięci?

Dziękuję za pomoc.

Odpowiedz

30

Myślę, że to bardzo ciekawy projekt, który może się wiele nauczyć od. Oto trochę lektury na temat zarządzania pamięcią. Omawia niektóre z podstaw zarządzania pamięcią, prowadzi do prostej implementacji malloc, a następnie porusza kilka bardziej zaawansowanych tematów.

Inside memory management

Ponadto, skoro wspomnieć, że chcesz, aby menedżer pamięci, które są przydatne do debugowania, można rozważyć czytania tego papieru przez twórców Memcheck/Valgrind (A cudowny debugger pamięci dla systemu Linux). Opisuje, w jaki sposób śledzą one wszystkie metadane (niezależnie od tego, czy dany bajt jest zdefiniowany, intializowany itp.) W memchck.Jest to trochę szczegółowe, ale dobrze jest przeczytać, jak stworzyć skalowalny i wydajny dynamiczny moduł do sprawdzania pamięci.

How to Shadow Every Byte of Memory Used by a Program

2

Widziałem niektóre próbki używać makra preprocesora C dla malloc. To sprytny pomysł. Jestem pewien, że mógłbyś napisać coś takiego.

Oto wygląda na dobry punkt wyjścia.

http://stevehanov.ca/blog/index.php?id=10

-2

Whats your platforma? Zastanawiasz się, czy valgrind lub lint może ci pomóc, zanim podejmiesz próbę ponownego zastosowania zlewu kuchennego?

+2

Oczywiście - ale niczego się nie nauczę. –

+0

Nie nauczysz się niczego w zakresie techniki kodowania za pomocą Valgrind, aby wykryć swoje wycieki? Z pewnością, jeśli używasz wadliwego sposobu niszczenia obiektów (lub uwalniania w zależności od platformy), to szybko się dowiesz. Widzę wartość w realizacji sterty itp., Aby zobaczyć, jak to się robi, ale jest to bardzo dużo wysiłku, aby zrobić to dobrze, i pozostawia ci więcej rzeczy do debugowania, gdy masz problem. – Spence

+0

Gdybym zrobił to dla pracy - masz absolutną rację. Nie ma powodu do ponownego włączenia koła. Ale dla zabawy i nauki, używanie valgrind nie daje wglądu i zabawy. Ale doceniam twój sposób myślenia Spence'a. Pierwszą rzeczą, którą powinieneś zrobić, jeśli zaczniesz programowanie, jest sprawdzenie, czy ktoś już wykonał twoją pracę. Przez większość czasu robili to lepiej, niż mogłeś. –

1

Istnieje wielki menedżer pamięci open source napisany w Delphi: fastMM4. Może warto mieć na to rzut oka. Obsługuje wiele funkcji, które chcesz zaimplementować i dlatego może być świetną wizytówką.

0

Większość z nich można zaimplementować w kategoriach malloc i free - w rzeczywistości zaimplementowano wiele menedżerów pamięci C++, nawet jeśli nie muszą.

Można rozpocząć od prostej implementacji, która utrzymuje dziennik wszystkich alokacji i zwolnień, ale przekazuje regularne alokacje/deallocations do malloc i free. Oczywiście prosta implementacja nie powinna używać new/delete albo ...

Tak, aby rozpocząć można

  • wymyślić struktury danych, który rejestruje alokacje i deallocations
  • wdrożyć go głównie „C -Style”, choć można użyć, aby zapewnić umieszczenie nowego konstruktorów nazywa
  • Wdrożenie globalny nowe i usuwać jako obwolut, że najpierw rejestrować dostęp w powyższej struktury danych, a następnie przesyła wezwanie do malloc lub wolne
1

Jak powiedział @Spence, już zostało to zrobione wiele razy. Ale ze względu na naukę jest całkiem interesująca.

Może Proponuję przyjrzeć LD za --wrap Here gdyż jest przydatna

+0

To jest bardzo dobry pierwszy krok do przechwytywania nowych() i usuwania() połączeń. Zobacz post Falaina na temat złożoności wykrywania przekroczenia macierzy - innej bestii – Matt

0

Myślę, że można zacząć od wdrożenia inteligentnego wskaźnika, który wykorzystuje podstawowe liczenia odniesienia w tle. Są to podstawy zarządzania pamięcią i sprawią, że stopy staną się mokre. Stamtąd możesz użyć swoich implementacji, aby uczynić bardziej zaawansowanym menedżera pamięci.

0

"Ogrodzenie elektryczne" to podstawowy punkt wyjścia, który może być pomocny. Zasadniczo ma niestandardowe implementacje malloc i free, które zapewniają debugowanie.

Jednak, AFAIK, nie integruje się z nowymi/usuwanymi operatorami C++, chociaż nie byłby zbyt duży, aby zapewnić niestandardowe implementacje globalne/usuwanie, które opóźniają działanie elektrycznych ogrodzeń.

4

Dave Hansona C Interfaces and Implementations prezentuje pierwszy standardowego menedżera pamięci, a następnie menedżera pamięci z kilku funkcji debugowania. Byłby to świetny punkt wyjścia do uczenia się i rozszerzania.

Oczywiście, jeśli rzeczywiście chcesz zdiagnozować problemy z pamięcią w uruchomionym programie C lub C++, powinieneś użyć valgrind.