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

суббота, 17 октября 2015 г.

4 статьи о системных вызовах Linux

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

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

1. Делаем доступным все символы ядра.
Здесь мы учимся использовать даже те символы ядра (функции, структуры данных), к которым разработчики ядра не считают нужными давать нам доступ. Это основа всего дальнейшего обсуждения.
Скачать здесь.
Код здесь.

2. Модификация системного вызова.
Это о том, как вы можете изменить стандартное поведение любого системного вызова Linux.
Скачать здесь.
Код здесь.

3. Сетевые системные вызовы.
Сетевые (сокетные) системные вызовы в Linux обрабатываются не так, как сотни прочих системных вызовов. Это достаточно мало известно.
Скачать здесь.
Код здесь.

4. Добавить системный вызов.
А это на тот случай, если вы захотите динамически добавлять новый системный вызов в Linux для своего целевого проекта.
Скачать здесь.
Код здесь.