Подтвердить что ты не робот

Напишите свой собственный менеджер памяти

Я бы хотел написать собственный менеджер памяти. Целевой язык - это С++, и цель менеджера памяти заключается в основном в отладке. Он должен обнаруживать двойные разряды, перезапись памяти и т.д. И, конечно же, я хотел бы узнать об управлении памятью.

Может ли кто-нибудь дать мне подсказку, так что ресурсы, где я могу научиться писать такой менеджер памяти?

Благодарим вас за помощь.

4b9b3361

Ответ 1

Я думаю, что это очень интересный проект, от которого вы могли бы многое узнать. Здесь немного материала для чтения по теме управления памятью. Он затрагивает некоторые основы управления памятью, ведет к простой реализации malloc, а затем затрагивает несколько более сложных тем.

Управление внутренней памятью

Кроме того, поскольку вы упоминаете, что хотите создать диспетчер памяти, который полезен для отладки, вам может потребоваться прочитать эту статью разработчики Memcheck/Valgrind (замечательный отладчик памяти для Linux). В нем подробно описывается, как они отслеживают все метаданные (независимо от того, определен ли конкретный байт, проинтегрирован и т.д.) В memchck. Он немного подробный, но он хорошо читает о том, как сделать масштабируемую и эффективную динамическую проверку памяти.

Как тень каждого байта памяти, используемого программой

Ответ 2

Dave Hanson C Интерфейсы и реализации представляет сначала стандартный диспетчер памяти, а затем менеджер памяти с несколькими функциями отладки. Это было бы хорошей отправной точкой для изучения и расширения.

Конечно, если вы действительно хотите диагностировать проблемы с памятью в запущенной программе C или С++, вы должны использовать valgrind.

Ответ 3

Я видел, что некоторые образцы используют макрос C-препроцессора для malloc. Это умная идея. Я уверен, что вы могли бы написать что-то подобное.

Вот выглядит хорошая отправная точка.

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

Ответ 4

Существует большой менеджер памяти с открытым исходным кодом, написанный на Delphi: fastMM4. Было бы полезно взглянуть на него. Он поддерживает многие функции, которые вы хотите реализовать, и, следовательно, может быть отличной витриной.

Ответ 5

Как сказал @Spence, это уже сделано много раз. Но ради изучения это довольно интересно.

Могу я предложить вам взглянуть на ld -wrap Здесь, поскольку это полезно

Ответ 6

Вы можете реализовать большую часть его в терминах malloc и free - фактически реализовано множество менеджеров памяти С++, даже если они не обязательно.

Вы можете начать с простой реализации, которая поддерживает журнал всех распределений и освобождений, но перенаправляет регулярные распределения/освобождения в malloc и бесплатно. Очевидно, что простая реализация не должна использовать new/delete либо...

Итак, чтобы начать, вы можете

  • придумать структуру данных, которая регистрирует распределения и освобождения от ответственности
  • Реализуйте в основном "C-стиль", хотя вы можете использовать новое размещение, чтобы гарантировать, что конструкторы называются
  • Внедрить глобальные новые и удалить в качестве обертки, которые сначала регистрируют доступ в вышеуказанной структуре данных, а затем перенаправляют вызов в malloc или бесплатно

Ответ 7

Я думаю, вы могли бы начать с реализации интеллектуального указателя, который использует базовый подсчет ссылок в фоновом режиме. Это основа управления памятью, и ваши ноги будут влажными. Оттуда вы можете использовать свои реализации для создания более продвинутого менеджера памяти.

Ответ 8

"Электрический забор" является базовой отправной точкой, которая может быть полезна. По сути, он имеет пользовательские реализации malloc и free, которые обеспечивают отладку.

Тем не менее, AFAIK, он не интегрируется в операторы С++ new/delete, хотя он не будет слишком большим, чтобы предоставлять настраиваемые глобальные новые/удаленные реализации, которые откладываются на подпрограммы электрических заграждений.

Ответ 9

Какая у вас платформа? Просто подумайте, сможет ли valgrind или lint помочь вам до того, как вы пойдете и попытаетесь переопределить кухонную раковину?