100 likes | 298 Views
Реализация и формальная верификация динамического распределителя памяти без блокировок. Александр Ситников. Санкт-Петербургский Государственный Университет Факультет Прикладной Математики – Процессов Управления Кафедра Технологии Программирования. Научный руководитель: Стученков А. Б.
E N D
Реализация и формальная верификация динамического распределителя памяти без блокировок Александр Ситников Санкт-Петербургский Государственный Университет Факультет Прикладной Математики – Процессов Управления Кафедра Технологии Программирования Научный руководитель: Стученков А. Б. 16 апреля 2014
Параллельные алгоритмы • Несколько потоков управления с общей памятью • Разделение задач • Повышение производительности Недостатки параллельности • Синхронизация потоков • Сложность разработки • Состоние гонки (race condition) • Взаимная блокировка (deadlock)
Типы синхронизаций Блокирующая Неблокирующая Атомарные операции Чтение Запись Чтение-сравнение-запись Краеугольный камень – CAS (Compare-And-Swap/Set) bool CAS(addr, exp, nval) atomic { if (*addr == exp) { *addr = nval; return true; } return false; }
Свобода от блокировок (Lock-free) • Ограничение CAS: 64 бита • Комбинаторный взрыв числа состояний • Состояние гонки, активная блокировка • Если нет сборщика мусора (Garbage collector) • Ложное освобождение используемой памяти • Проблема ABA Пример • Процесс P1 читает значение Aиз разделяемой памяти; • P1приостанавливается и начинается выполнение процесса P2; • P2меняет значение Aна Bи затем обратно на A; • P1возобновляет работу, видит, что значение в памяти не изменилось, и продолжает работу.
Распределитель памяти (allocator) • Системная куча (heap) • Использует блокировку • Неэффективна при частых обращениях и для небольших участков памяти Требования • Lock-free • Поддержка 64-разрядных указателей • Эффективность Определение Динамический распределитель памяти – алгоритм, обрабатывающий запросы на выделение и освобождение динамической памяти
Реализация аллокатора на C++11 • Scalable Lock-Free Dynamic Memory Allocation by Maged M. Michael (2004 год) • Удовлетворяет всем требованиям • Наиболее известная разработка • Нет общедоступной реализации • Задача: реализовать аллокатор на C++11 • C++: быстрота, универсальность, отсутствие GC • Поддержка параллельной модели памяти • Атомарные типы данных (std::atomic<T>) • Проблема: нет гарантии корректности
Проверка корректности • Тестирование оказывается несостоятельным • Альтернатива: формальная верификация • Проверка всех путей исполнения параллельной системы • Доказательство выполнимости инвариантов • Моделирование пути, на котором не выполняется свойство (инвариант) системы • Автоматическая проверка модели и выполнимости на ней заданных свойств • Задача: верифицировать аллокатор
Проверка модели (model checking) Определение Проверка модели – метод автоматической формальной верификации параллельных систем с конечным числом состояний Определение Определение
Система SPIN и язык Promela • SPIN – Simple Promela Interpreter • Promela – Process Meta Language • Язык высокого уровня с C-подобным синтаксисом • Включает 5 базовых интегральных типов • Объявление асинхронных процессов • Операторы: выполняемые и заблокированные • Недетерминированные циклы Дейкстры • Атомарные блоки • Каналы передачи переменных • Формулы линейной темпоральной логики
Аллокатор на Promela • В Promela нет указателей • Невозможность адресной арифметики • Отсутствие динамической памяти • Нет 64-битных типов данных