Как переслать указатели из реестра в копирующий сборщик мусора? - PullRequest
2 голосов
/ 01 марта 2020

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

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

  • Регистр, который нам нужно переслать, не будет содержать адрес объекта, который должен быть переслан.
  • Регистр будет восстановлен при возврате из функция сборки мусора, поэтому мы все равно не можем переслать ее на этом этапе.

Так как же я могу выполнить переадресацию указателя для объекта, указатель которого хранится в указателе? Мы можем предположить, что сборщик мусора записан в C, а не в сборке (что облегчает не перезаписывать регистры).

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

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

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

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

1 голос
/ 01 марта 2020

Так, как я могу сделать переадресацию указателя для объекта, указатель которого хранится в указателе

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

Это делается по-разному в разных ГХ. Обычно GC используют барьеры для такой цели, некоторый код, который выполняется в момент, когда G C работает (как перехватчик для ваших объектов).

Так что, когда какой-то поток пытается выделить память / изменить какой-либо объект, пока работает G C, он не изменит указатель / объект напрямую - но go через некоторый код, который это сделает. Обновление указателя пересылки обычно выполняется один раз CAS, чтобы повторно отобразить этот указатель пересылки, сделав его видимым для всех потоков.

Я объяснил, как это делается здесь , это java специфицируется c до Shenandoah GC, но теория все та же.

...