Понимание деталей о цветных битах в алгоритме ZG C - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь понять, как ZG C работает в деталях. Давайте рассмотрим простой Java пример:

var v = new Object[]{ new Object() }; 

Давайте назовем

  • a : объект массива
  • o : объект, на который ссылается v [0]
  • r : ссылка на a
  • s : ссылка на o

На рисунке ниже графически показаны артефакты: enter image description here

Предположим что первый цикл g c начинается и a , o перемещаются. Далее предположим, что приложение не имеет доступа к объектам.

g c цикл 1:

a) Фаза маркировки: в конце фазы маркировки устанавливается бит отмеченный0 r , s .

b) Фаза перемещения: сначала объект root a перемещается, r переназначается в новое местоположение, а переназначается бит r установлен. Затем o перемещается, и новое местоположение o записывается в таблицу пересылки.

Примечание: Ссылки, возникающие в куче, не перераспределяются на этапе перемещения ( 2 в 9:20) - они переопределяются на следующем этапе маркировки ( или через барьер загрузки, если приложение загружает ссылку до следующей фазы маркировки). Следовательно, насколько я понимаю, бит отмеченный 0 все еще установлен в с .

г c цикл 2:

a) Фаза маркировки:

a1) отмечен 1 бит r установлено.

a2) Поскольку переназначенный бит s не задан, g c просматривает таблицу переадресации и видит запись для o , переназначает s в новое местоположение o и удаляет запись из таблицы пересылки.

Вопрос: Какой из цветовых битов s теперь установлен?

Замечание: Поскольку s только что был переназначен, было бы естественно установить бит remapped . Но g c также находится в фазе маркировки, поэтому необходимо установить бит mapped1 .

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

Это (i) нагрузка на производительность и (ii) излишняя, потому что g c знает из этапа переназначения (этап a2) в примере), что ссылка была переназначена. Таким образом, либо алгоритм не является оптимальным, либо биты цвета устанавливаются не так, как описано выше.

...