← All posts tagged GreenThreads

Довольно непросто найти сейчас M:N планировщик. Судя по сохранённой странице IBM NGPT, его последняя версия — 2.2.2, но в Интернет Архиве нашёл только максимум 1.9.90. Ещё хорошо поискав, нашёл NGPT 2.2.1.

Как делать обычные потоки с предвыделенными стеками, уже давно разобрались, а вот с зелёными ещё ничего не решено, и как делать M:N планировщик второго уровня поверх ядра, с академической точки зрения всё ещё интересно.

В продолжение #2763888 . Может, это и что-то простое, но меня вдруг озарило. Зелёные потоки, синхронизирующиеся с обычными, — это аналогично потокам с привязкой к процессору, если потоки OS считать виртуальными ядрами. Обычные потоки — это потоки, которые исполняются на специальных ядрах и только на них, а зелёные потоки исполняются только на своих других ядрах, где работает трамплин зелёных потоков. У них взаимоисключающие маски affinity. Если где-то есть планировщик, поддерживающий привязку к ядру, мьютексы и условные переменные, то его, предположительно, можно научить решать такие задачи.

parasail-programming-language.blogspot.ru

К слову про зелёнопоточныe аналоги pthreads. На ParaSail реализован классический буфер ограниченного размера, прям как в Танненбауме и других книжках, с той разницей, что мьютексы и условные переменные скрыты тем же способом, которым они скрыты в адских protected entry. Захват мьютекса происходит при попытке войти в метод. Для тех методов, которые имеют условие входа (в языке Ада у них вместо procedure ключевое слово entry; в языке ParaSail ключевое слово queued вместо locked), это условие проверяют и, если оно не выполнено, повисают на условной переменной, автоматически создаваемой для каждого условия. Каждый метод перед выходом постреливает по всем условным переменным, которые могли измениться во время выполнения, что определяется в ходе статического анализа. В коде этого не видно, но программист на языке Ада представляет, как адские protected превращаются в pthreads. Можно посмотреть на этот код, потом на код на Pidgin Pascal у Танненбаума.

parasail-programming-language.blogspot.ru
С июля давно новостей не было, я уж думал, после слияния с AdaCore проект утонул. Как–никак, исследовательский. Ан нет, работа продолжается. С виртуальной машины переносят на нативный компилятор на базе LLVM.
Проект пока ещё не зрелый. Я пытался применить вместо node.js+Wind.js, но сразу наткнулся на то, что нет зелёнопоточной сети и работы с XML, а самому делать некогда было.

Green threads
On a multi-core processor, native thread implementations can automatically assign work to multiple processors, whereas green thread implementations normally cannot.Казалось бы, что мешает гонять зелёные потоки на нескольких ядрах. И не так, как в Erlang, сведя взаимодействие к обмену сообщениями, а с полным инструментарием, с мьютексами, условными переменными, rwlock'ами. И, если надо, можно на мьютексах и условных переменных, так уж и быть, потом реализовать обмен сообщениями, запрограммировав буфер сообщений как хочется. Надо просто сделать зелёный планировщик с зелёными мьютексами, зелёными условными переменными и так далее. В Erlang, Go и т. п. планировщики неполноценные, их за образец не возьмёшь. А вот тут, похоже, и есть полноценный планировщик зелёных потоков.