вторник, 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-рутин (параллельного исполнения фрагментов кода) позволяет эффективно выполнять в параллель десятки, если не сотни, тысяч ветвей. К детальному рассмотрению этих механизмов ещё придётся не раз возвращаться.

4 способа писать в защищённую страницу

Паказанные в предыдщем сообщении несколько заметок, о внесении изменений в работу системных вызовов Linux, были готовы к сентябрю, но как-то руки не доходили разместить их здесь вовремя. За это время на Хабрахабр, где они были показаны, развернулось достаточно активное обсуждение ... но, главным образом, не обсуждение для достижения конструктивного результата, а из области любимой народной забавы "подбрасывание говна на вентилятор". Главным предметом обсуждений и сомнений стала необходимость записи в страницы оперативной памяти, отмеченные как защищённые от записи, и то, как это лучше сделать. Один из способов, которым я пользуюсь больше 10 лет, уже был показан в примерах кода к упоминаемым выше заметкам (да и в тексте есть об этом пара слов). Но предмет этот отдельно интересен, а в информационном пространстве есть целый ряд публикаций последних лет о том, как решать подобную задачу.

Перечислению, опробыванию и корректировке предлагаемых способов и посвящена очередная заметка "4 способа писать в защищённую страницу". Поскольку она не такая уж и маленькая (8 страниц), а, главное, требует для подтверждения предоставления подтверждающего кода, то я не вкопирываю текст сюда, а как и раньше просто даю ссылки где это всё можно взять.

Скачать текст можно здесь.
А код, соответственно, здесь.

Предмет действительно интересен для разработчиков драйверов Linux, и показан он здесь в качестве приглашения к обсуждению как это сделать лучше и наиболее безопасным способом (не безопасное исполнение в данном случае чревато серьёзными последствиями).