вторник, 20 октября 2015 г.

Планирование параллельного исполнения в Go

О некоторых особенностях языка Go я уже писал здесь в блоге (Go конспект). Но одно из самых интересных мест Go - это как-раз то, как организуются параллельные ветви выполнения (и на различных процессорах в SMP). Утверждается, что после версии GoLang 1.1 (2012г.-2013г.) этот механизм Go-рутин радикально переделан, улучшен и сделан ещё существенно более эффективным, чем ранее.

Теперь используется алгоритм планирования с заимствованием работ (в оригинале даже "воровством работ", но в русскоязычной терминологии уже установился благозвучный термин заимствование). Обстоятельнейший (на 29 страниц) анализ самих принципов, на которых построен этот механизм, описан в Scheduling Multithreaded Computations by Work Stealing. Там же проведе сложнейший и детальный математический анализ производительности.

Коротко ("на пальцах") механизм описан в заметке The Go scheduler (by Daniel Morsing 30 June 2013). Это настолько интересно, что мной сделан перевод этой заметки, который вы можете найти на странице Диспетчер Go.

Утверждается (и это подтвердают эксперименты), что механизм Go-рутин (параллельного исполнения фрагментов кода) позволяет эффективно выполнять в параллель десятки, если не сотни, тысяч ветвей. К детальному рассмотрению этих механизмов ещё придётся не раз возвращаться.

Комментариев нет: