Обнаружение записи страницы памяти в Windows и Linux - PullRequest
3 голосов
/ 11 октября 2011

В настоящее время я работаю над сборщиком мусора поколений.Это означает, что только самые последние объекты проходят, выжившие объекты (= достижимые из известных корней) продвигаются к старшему поколению.Это работает нормально, когда объекты указывают на другие объекты того же или более старшего поколения.Однако, когда более старые объекты указывают на более новые, и поскольку только более новые объекты пересекаются, указанные объекты будут неправильно собраны.Чтобы избежать этого, такие объекты помечаются и просматриваются явно во время каждой фазы GC.

Очевидно, что такие «родительские» объекты являются изменяемыми, поскольку по конструкции неизменяемые объекты всегда указывают на существующие объекты.Таким образом, чтобы стать «родителем», объект должен быть изменен после повышения, чтобы он указывал на более новый объект.

Чтобы узнать, какие объекты более старых поколений указывают на более молодые поколения, я ищуспособ контролировать изменения памяти прозрачно.Для этого я использую защиту памяти и обработку сигналов / исключений.Страницы памяти устанавливаются только для чтения, что приводит к возникновению сигнала / исключения каждый раз, когда они записываются, и в этом случае я возвращаю защиту памяти для чтения-записи и записываю адрес где-то для дальнейшей обработки, а по возвращении ответственного кодаза исключением возобновляется нормально.Таким образом, когда GC срабатывает, я знаю, где искать потенциальных родителей для прохождения.

В Linux я использую комбинацию обработки сигналов mprotect / SIGSEGV.В Windows я намерен использовать VirtualProtect, но не нашел эквивалента обработки SIGSEGV.Итак, мои вопросы:

  1. Как бы вы сделали это в Windows?API обработки исключений кажется довольно запутанным.

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

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

Заранее спасибо, Фред

1 Ответ

3 голосов
/ 11 октября 2011

GetWriteWatch идеально подходит для этого. Документация здесь

...