Определить границы стека текущего потока - PullRequest
2 голосов
/ 25 января 2010

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

Мне нужно это такЯ могу просканировать стек на наличие корней (указателей), и мой текущий подход заключается в том, чтобы сохранить указатель стека при входе в новый поток и при входе в main (), а затем снова сохранить его для каждого потока при запуске сборки мусора, используяглобальная блокировка.

(я знаю, что этот подход не идеален в долгосрочной перспективе, так как он вызывает ненужную блокировку, но сейчас он приемлем, пока не исчерпаны основы)очень хотелось бы иметь более «безопасный» способ определения границ, потому что корням очень легко «избежать» этого механизма (в зависимости от реализации потока - управление pthreads легко, но не так с OpenMP или Grand CentralОтправка).

Было бы еще лучше, если бы был портативный способ сделать это, но я не ожидаю, что это будетон случай.В настоящее время я работаю на Mac OS X 10.6, но ответы для любой платформы приветствуются.

1 Ответ

1 голос
/ 28 января 2010

Вы можете использовать механизм VM для защиты конца стека от записи и расширить ловушку записи VM. Тогда вы будете знать границу стека на странице стека.

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

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

...