Вопрос

Я проверил Boehm GC. GC для C/C ++.

Я знаю алгоритм Mark и wiep. Что мне любопытно, так это то, как он поднимает только указатели во всей памяти C. Мое понимание памяти C - это просто простой байтовый массив. Можно ли определить значение в памяти - это указатель или нет?

Это было полезно?

Решение

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

Вот описание от Страница Бома:

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

  1. Подготовка Каждый объект имеет связанный бит Марка. Очистите все маркировки, что указывает на то, что все объекты потенциально недоступны.
  2. Марк фаза отмечает все объекты, которые могут быть достигнуты через цепи указателей из переменных. Часто в коллекторе нет реальной информации о местоположении переменных указателей в куче, поэтому он рассматривает все статические области данных, стеки и регистры как потенциально содержащие указатели. Любые битовые шаблоны, которые представляют адреса внутри объектов кучи, управляемых коллекционером, рассматриваются как указатели. Если клиентская программа не предоставила информацию о макете объекта Heap, доступной для коллекционера, любые объекты кучи, обнаруженные, доступные из переменных, снова сканируются аналогичным образом.
  3. Фаза развертки сканирует кучу для недоступной и, следовательно, без опознавательных знаков, объектов и возвращает их в соответствующий бесплатный список для повторного использования. Это не отдельная фаза; Даже в не постепенном режиме эта операция обычно выполняется по требованию во время распределения, который обнаруживает пустой свободный список. Таким образом, фаза развертки вряд ли коснется страницы, которая в любом случае не будет коснуться в любом случае.
  4. Фаза завершения недоступных объектов, которые были зарегистрированы для завершения завершения, предназначены для завершения за пределами коллекционера.

Вы также должны знать, что GC Boehm необходимо предоставить набор «корней», которые являются отправными точками для алгоритма марки и випа. Стек и регистры автоматически корни. Вам нужно явно добавить глобальные указатели в качестве корней.


РЕДАКТИРОВАТЬ: В комментариях были указаны некоторые опасения в отношении консервативных коллекционеров в целом. Это правда, что целые числа, которые выглядят как указатели кучи к коллекционеру, могут привести к тому, что память не будет выпущена. Это не такая большая проблема, как вы думаете. Большинство скалярных целых чисел в программе используются для подсчетов и размеров и довольно малы (поэтому они не будут выглядеть как указатели кучи). В основном вы столкнетесь с проблемами с массивами, содержащими растровые карты, строки, данные с плавающей запятой или чем -то в этом роде. Boehm GC позволяет вам выделить блок с GC_MALLOC_ATOMIC что указывает коллекционеру, что блок не будет содержать никаких указателей. Если вы посмотрите gc_typed.h, вы также найдете способы указать, какие части блока могут содержать указатели.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top