C ++ архитектура распределителя памяти - PullRequest
4 голосов
/ 16 марта 2012

Мне нужно написать Hoard allocator для C ++ под Linux. Хотя алгоритм довольно прост, я не понимаю, где (и как) хранить данные распределителя (кучи, например)

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

  1. Что происходит, когда приложение запускается?
  2. А как allocator обнаруживает, что кучи уже созданы?
  3. Как allocator создает, хранит и уничтожает (при закрытии приложения) кучи?
  4. Когда вызывается функция, как узнать, в каком потоке (или на каком процессоре) она работает?

Ответы [ 3 ]

2 голосов
/ 16 марта 2012
  1. Вероятно, мало что происходит во время запуска приложения, если только распределитель не спроектирован и не подключен к коду запуска приложения для упреждающего запроса некоторой памяти из операционной системы.
  2. Кучи на самом деле не созданы. Система выделения отключается и запрашивает у операционной системы некоторое количество памяти, когда ей это необходимо, - либо для начальной настройки, либо позже, когда ей требуется дополнительная для выполнения запрошенного выделения. В Unix-подобных системах часто используемый системный вызов называется sbrk. (Строго говоря, в linux sbrk - это оболочка библиотечной функции для системного вызова brk - это может или не может быть важным отличием для вас.)
  3. Распределитель получает память из операционной системы с помощью вызова sbrk, упомянутого выше. После этого самостоятельно управлять этой памятью. Когда приложение закрывается, операционная система освобождает память - она ​​знает, что было разослано с помощью вызовов sbrk, и поэтому она знает, какую память ей необходимо вернуть.
  4. Почти никогда не имеет значения, на каком потоке или процессоре выполняется данный фрагмент кода - если вы объясните контекст того, о чем вы спрашиваете, я попытаюсь ответить.
1 голос
/ 15 сентября 2012

Что происходит, когда приложение запускается?

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

А как allocator обнаруживает, что кучи уже созданы?

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

Как allocator создает, хранит и уничтожает (при закрытии приложения) кучи?

Как правило, у вас есть низкоуровневый и высокоуровневый распределитель. Низкоуровневый распределитель просто получает необработанные фрагменты памяти от операционной системы. Точный механизм зависит от платформы. Распределитель верхнего уровня управляет кучами, и он получает память для хранения структур кучи от распределителя низкого уровня.

Когда вызывается функция, как узнать, в каком потоке (или на каком процессоре) она работает?

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

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

1 голос
/ 16 марта 2012

Что вы имеете в виду "написать Hoard Allocator"?Кто-то уже написал этот распределитель.Вы пытаетесь использовать это из C ++?Внутренняя работа Эмери Бергера Hoard подробно описана в официальном документе Hoard: масштабируемый распределитель памяти для многопоточных приложений Что бы это не отвечало, всегда можно решить, прочитав источник или связавшись с автором.Я был бы удивлен, если бы не было списка рассылки.

...