Управление массивом памяти - PullRequest
1 голос
/ 25 февраля 2012

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

Итак, представьте, что я использую структуры в своей программе. И то, как работает моя программа, требует динамического выделения памяти. Но это очень дорого в оборудовании, которое мы используем. Поэтому наилучшим решением было бы выделить большой пул памяти в начале, а при необходимости выделять память из этого пула.

Я предполагаю, что это сработает, я выделю битовый массив этих структур и напишу свой собственный модуль управления памятью, который выделяет и освобождает память из этого пула. Но я хочу знать самый идеальный способ написания этих модулей. Существуют ли какие-либо библиотеки, которые могут помочь мне в управлении памятью, или есть какой-то способ их записи?

РЕДАКТИРОВАТЬ: Вот платформа, которую я использую: система AMD Opteron, которая работает на Ubuntu. Оптероны имеют архитектуру NUMA, и я хочу использовать это при распределении памяти. Следовательно, вместо использования malloc, я использую numa_alloc_onnode , который выделяет память на одном конкретном узле. Я хочу выделить большой кусок памяти, используя это, а затем использовать менеджер памяти для управления этой памятью.

1 Ответ

4 голосов
/ 25 февраля 2012

Есть тонна менеджеров пула памяти, некоторые коммерческие и некоторые с открытым исходным кодом. Посмотрите на них и не стесняйтесь задавать более конкретные вопросы здесь после того, как у вас есть обзор.

Некоторые результаты Google (c открытым диспетчером памяти):

http://256stuff.com/sources/mpool/

http://www.ravenbrook.com/project/mps/

Вот хорошая статья от IBM на эту тему:

http://www.ibm.com/developerworks/linux/library/l-memory/

И поскольку вы упоминаете многопроцессорную среду (хотя она не имеет прямого отношения к управлению памятью), это также стоит прочитать:

http://drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206

UPDATE

Существуют разные подходы в зависимости от желаемой переносимости библиотеки. Если важна переносимость, библиотека представляет оболочку вокруг malloc (или calloc), чтобы захватывать куски памяти и затем применять более эффективную реализацию (по сравнению с конкретными целями, которые библиотека хочет достичь). Библиотека, ориентированная на конкретную ОС, обычно использует вызовы собственной операционной системы, что повышает производительность и позволяет использовать особенности этой операционной системы за счет переносимости.

Конкретные цели, к которым стремятся библиотеки управления памятью, различны. Вот некоторые цели, которые я видел за эти годы:

  • Отдельные стратегии управления для больших и малых объектов
  • Отдельные стратегии управления вещами, которые будут жить долго, и вещами, которые будут быстро удалены
  • Отладка для проблем управления памятью (например, записать конкретный шаблон в выделенную память и выделить дополнительное заполнение в конце, чтобы функция отладки могла видеть, была ли перезапись перезаписана из-за доступа к указателю вне границ)
  • Ускоренный доступ к памяти с учетом ограничений конкретной платформы (например, некоторые выделения могут быть дорогими, другие относительно дешевыми).
  • Поддержка дефрагментации памяти (например, путем реального выделения указателя на указатель со специальной семантикой для доступа к памяти).

ОБНОВЛЕНИЕ 2

На основании вашего обновления ... применяется мой четвертый пункт. Вот хорошее прочтение по созданию менеджера кучи для архитектуры NUMA (исходный код в конце статьи):

http://ebookbrowse.com/numa-aware-heap-memory-manager-article-final-pdf-d12526838

...