Мой вопрос касается сборщика мусора в виртуальной машине Parrot ( http://www.parrot.org ).
Он многопоточный?
Мой вопрос касается сборщика мусора в виртуальной машине Parrot ( http://www.parrot.org ).
Он многопоточный?
Сам Parrot является многопоточным, он даже линейно масштабируется до доступных физических ядер ЦП, а его сборщик мусора правильно поддерживает несколько потоков, то есть без каких-либо блокировок структур данных (что, кстати, является большим преимуществом по сравнению с бэкэндами MoarVM или JVM). которые используют традиционные блокировки хэшей, PMC и массивов повсюду), но сам сборщик мусора не работает в отдельных потоках. GC работает только в главном потоке и представляет собой простой трехцветный генерационный GC Mark&Sweep (т. е. "остановить мир").
Обзор структуры потоков GC описан здесь: http://perl6advent.wordpress.com/2012/12/11/day-11-parrot-threads/ и подробно разработчиком здесь: http://niner.name/Hybrid_Threads_for_the_Parrot_VM.pdf
Но обратите внимание, что parrot поддерживает только потоки (т.е. задачи), создаваемые главным интерпретатором, а не другими задачами (потоками), пул потоков предварительно инициализируется при запуске и управляется автоматически. Только владелец может записывать данные с помощью назначенных по расписанию небольших задач записи прокси. Технически вы можете создавать задачи из других задач, но это приведет к утечкам.
Для других потоков неатомарные данные видны через прокси-объекты, доступные только для чтения. Компилятор языка высокого уровня должен создать для вас эти задачи записи. См. каталог examples/threads/
.