
- •Национальный исследовательский ядерный университет «мифи»
- •Пояснительная записка к дипломному проекту на тему:
- •Глава 1. Обзор методов и средств многопоточного взаимодействия 7
- •Глава 2. Разработка структуры и алгоритмов взаимодействия 29
- •Глава 3. Реализация и тестирование разработанных структур и алгоритмов взаимодействия 53
- •Введение
- •Глава 1. Обзор методов и средств многопоточного взаимодействия
- •1.1. Блокирующая синхронизация
- •1.2. Неблокирующая синхронизация
- •1.2.1. Общие сведения
- •1.2.2. Принципы неблокирующих алгоритмов Узлы неизменяемого типа
- •Подмена указателей
- •Атомарные операции
- •Специальные методы управления памятью
- •1.2.3. Обзор специальных методов управления памятью Метод использования специальных тегов
- •Метод неблокирующего подсчета ссылок
- •Метод опасных указателей
- •1.2.4. Оценка эффективности методов
- •1.2.5. Типы алгоритмов для неблокирующей синхронизации
- •1.3. Выводы
- •Глава 2. Разработка структуры и алгоритмов взаимодействия
- •2.1. Требования к разрабатываемой структуре данных и обоснование выбранных методов реализации
- •2.2. Обзор существующих неблокирующих структур
- •2.3. Разработка структуры данных
- •2.4. Разработка алгоритмов
- •2.4.1. Алгоритм записи
- •2.4.2. Алгоритм чтения
- •Метод неблокирующего подсчёта ссылок
- •Метод опасных указателей
- •2.4.3. Алгоритм освобождения памяти
- •Метод неблокирующего подсчёта ссылок
- •Метод опасных указателей
- •2.4.4. Алгоритм добавления и удаления опасных указателей
- •Глава 3. Реализация и тестирование разработанных структур и алгоритмов взаимодействия
- •3.1. Особенности программной реализации
- •3.2. Тестирование разработанных алгоритмов
- •3.3. Тестирование разработанной структуры при многопоточном доступе
- •3.4. Сравнение структур по временным характеристикам
- •Заключение
- •Список литературы
Метод опасных указателей
Метод опасных указателей, описанный в работах [4,5], является относительно новым подходом к решению данной задачи. В отличие от остальных специальных методов управления памятью он не требует никаких дополнительных методов, например, сборки мусори (garbage collection), а также его можно использовать в качестве решения проблемы повторного использования памяти в неблокирующих алгоритмах, которые написаны для систем со сборкой мусора, в системах без сборки мусора.
Основная идея этого метода заключается в том, чтобы ассоциировать с каждым потоком, который должен работать с неблокирующими структурами, некоторое число (обычно один или два) указателей с дисциплиной доступа один пишет – много читают, так же называемых опасными указателями или hazard pointers. Указатель опасности либо равен нулю, либо указывает на узел, доступ к которому позднее может потребоваться без дополнительного подтверждения того, что ссылка на узел еще допустима. Каждый опасный указатель может быть переписан только его потоком-владельцем, но прочитан может быть любым потоком.
Метод опасных указателей гарантирует, что никакой поток не получит доступ к динамическому узлу в то время, как он может быть удален из структуры, если ни один из ассоциированных с потоками опасных указателей не указывал на него начиная с того момента времени, когда достижимость узла из корня структуры была гарантирована. Кроме того данный метод предотвращает освобождение памяти любого выбывшего узла, на который указывал хотя бы один указатель опасности одного или нескольких потоков, начиная с момента времени, предшествовавшего его удалению.
Стоит отметить, что даже малого числа указателей опасности ассоциированных с каждым потоком хватает для поддержки произвольного числа структур данных или объектов, если этого числа достаточно для работы с каждой структурой или объектом в отдельности. Например, в программе, где каждый поток может произвольно оперировать сотнями разделяемых объектов, каждому из которых требует не более двух указателей опасности на поток (например, хэш-таблицы, FIFO очереди, LIFO стеки, связные списки), программе всего требуется лишь два указателя опасности на поток.
1.2.4. Оценка эффективности методов
В работе [4] приводятся данные, отражающие относительную эффективность методологии указателей опасности по сравнению с другими методологиями управления освобождением и повторным использованием памяти в неблокирующих алгоритмах, а так же их общую эффективность, по сравнению с блокирующими алгоритмами.
Эти данные приводятся ниже. Из них можно увидеть, что производительность метода опасных указателей во всех тестах практически идентична производительности метода счетчиков изменений (специальных тегов), при том, что последний, по существу, является аппаратным решением. Так же видно, что чем больший вычислительный параллелизм возможен в системе, тем лучше себя показывает метод указателей опасности, в сравнении с остальными методами.
На рис. 1.3 представлена производительность FIFO очередей при различных методах управления освобождением памяти и повторным использованием узлов.
Рис. 1.3. Производительность FIFO очередей
На рис. 1.4 представлена производительность LIFO стеков.
Рис. 1.4. Производительность LIFO стеков
На рис. 1.5 и 1.6 представлены производительности различных методов при реализации хеш-таблиц методом цепочек. На них отображены данные для коэффициентов загрузки 1 и 5 соответственно.
Рис. 1.5. Производительность хеш-таблиц с параметром загрузки 1
Рис. 1.6. Производительность хеш-таблиц с параметром загрузки 5