tmpa-2015: automated testing of multi-thread data structures solutions linerializability

27
Антон Евдокимов ([email protected]) Дмитрий Цителов ([email protected]) Роман Елизаров ([email protected]) Виталий Трифанов ([email protected]) Автоматическое тестирование линеаризуемости реализаций многопоточных структур данных

Upload: iosif-itkin

Post on 12-Apr-2017

2.697 views

Category:

Science


1 download

TRANSCRIPT

Page 1: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Антон Евдокимов ([email protected])

Дмитрий Цителов ([email protected])

Роман Елизаров ([email protected])

Виталий Трифанов ([email protected])

Автоматическое тестирование

линеаризуемости реализаций

многопоточных структур

данных

Page 2: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

В чем проблема?

─ Процессоры многоядерные

─ Нужно писать многопоточный код

─ Это не так просто

─ В многопоточной среде появляются

специфические проблемы

─ Одновременный доступ к разделяемым

ресурсам

Page 3: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

В чем проблема?

Page 4: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

В чем проблема?

─ Стандартные подходы к тестированию

не работают

─ Но проверять корректность

реализации все равно хочется

Page 5: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Линеаризуемость

─ Любое параллельное исполнение эквивалентно

некоторому последовательному

Page 6: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Метод

─ Взять небольшое количество потоков

─ В каждом несколько операций над

структурой данных

─ Запустить много-много раз и

попытаться объяснить результаты

последовательной перестановкой

─ Повторить

Page 7: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Метод

Page 8: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Границы применимости метода

─ Подходит для популярных структур

данных

─ Очереди, множества, хеш-таблицы…

─ Но

─ Структура данных не зависит от

внешней среды

─ Не блокируется

─ Метод точен, но не полон

Page 9: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Очередь

Page 10: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Генерация тестовых наборов

─ Наивно?

─ Операции

─ Изменяют структуру данных

─ Не изменяют

─ Аргументы

─ Влияют на логику поведения

структуры данных

─ Не влияют

Page 11: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Генерация тестовых наборов

Page 12: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Генерация тестовых наборов

Page 13: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Генерация тестовых наборов

P Q

offer(1);

offer(2);

poll();

poll();

Page 14: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Последовательные исполнения

─ Перестановки исходного набора

операций

─ С сохранением порядка операций для

каждого потока

Page 15: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Последовательные исполнения

P Q

offer(1);

offer(2);

poll();

poll();

offer(1); poll() {1}; offer(2); poll() {2};

Page 16: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Последовательные исполнения

offer(1); offer(2); poll() {1}; poll() {2};

offer(1); poll() {1}; offer(2); poll() {2};

offer(1); poll() {1}; poll() {Exception}; offer(2);

poll() {Exception}; poll() {Exception}; offer(1); offer(2);

poll() {Exception}; offer(1); offer(2); poll() {1};

poll() {Exception}; offer(1); poll() {1}; offer(2);

Page 17: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Параллельные исполнения

─ Множественные запуски

─ Синхронизация старта

─ Все служебные структуры создаем

вне многопоточной системы

─ Можно вызывать методы через

Reflection API, но используется ASM

─ Две фазы запусков (без/с задержками)

Page 18: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Проверка

─ Ищем последовательное исполнение,

соответствующее по результатам

параллельному

─ Если не нашли, то структура

нелинеаризуема!

offer(1); poll() {1}; offer(2); poll() {1};

Page 19: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Результаты

─ Синтетические примеры

─ Очередь, счетчик, некоторые другие

─ Потеря synchronized, volatile,

ошибочное использование

неатомарных переменных

─ Нашлись наборы операций,

приводящие к ошибке

Page 20: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Результаты

─ java.util.concurrent ✓

─ Google Guavа ✓

Page 21: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Результаты

─ jctools [1]

─ MpmcArrayQueue ✗

─ zchannel [2]

─ GenericMPMCQueue ✗

─ high_scale_lib [3]

─ NonBlockingHashMap ✗

[1] https://github.com/JCTools/JCTools

[2] http://landz.github.io/

[3] https://github.com/stephenc/high-scale-lib

Page 22: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Результаты

─ zchannel – GenericMPMCQueue

P Q

offer(9); {true}

poll(); {null}

offer(1); {true}

poll(1); {1}

Page 23: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Результаты

Структура данных Время (мс); мин-макс (средн.)

Counter 4 – 110 (33)

Queue 5 – 38786 (8635)

Accounts 3 – 50606 (18697)

NonBlockingSetInt 52 – 10414 (4291)

NonBlockingHashSet 5 – 66975 (16111)

MpmcArrayQueue(2) 2352 – 45628 (19974)

MPMCQueue(2) 1814 – 33958 (19714)

MPMCQueue(16) 1877 – 33858 (8651)

LockFreeQueue 8825 – 342199 (135202)

Page 24: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Что дальше?

─ Генерация параллельных исполнений

с помощью управляемого

переключения между потоками

─ Конкретная последовательность

инструкций

─ Лучшее покрытие состояний

Page 25: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Где посмотреть

─ Lincheck

─ https://github.com/Devexperts/lin-check

─ E-mail

[email protected]

Page 26: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Вопросы?

Page 27: TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Linerializability

Спасибо