Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,050 views

Published on

Automated Testing of Multi-thread Data Structures Solutions Linerializability
Anton Evdokimov, Dmitry Tsitelov, Roman Elizarov, Vitaly Trifanov, Saint Petersburg State University of Information Technologies, Mechanics and Optics, Saint Petersburg

12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg

Published in: Science
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Антон Евдокимов (aevdokimov@devexperts.com) Дмитрий Цителов (cit@devexperts.com) Роман Елизаров (elizarov@devexperts.com) Виталий Трифанов (trifanov@devexperts.com) Автоматическое тестирование линеаризуемости реализаций многопоточных структур данных
  2. 2. В чем проблема? ─ Процессоры многоядерные ─ Нужно писать многопоточный код ─ Это не так просто ─ В многопоточной среде появляются специфические проблемы ─ Одновременный доступ к разделяемым ресурсам
  3. 3. В чем проблема?
  4. 4. В чем проблема? ─ Стандартные подходы к тестированию не работают ─ Но проверять корректность реализации все равно хочется
  5. 5. Линеаризуемость ─ Любое параллельное исполнение эквивалентно некоторому последовательному
  6. 6. Метод ─ Взять небольшое количество потоков ─ В каждом несколько операций над структурой данных ─ Запустить много-много раз и попытаться объяснить результаты последовательной перестановкой ─ Повторить
  7. 7. Метод
  8. 8. Границы применимости метода ─ Подходит для популярных структур данных ─ Очереди, множества, хеш-таблицы… ─ Но ─ Структура данных не зависит от внешней среды ─ Не блокируется ─ Метод точен, но не полон
  9. 9. Очередь
  10. 10. Генерация тестовых наборов ─ Наивно? ─ Операции ─ Изменяют структуру данных ─ Не изменяют ─ Аргументы ─ Влияют на логику поведения структуры данных ─ Не влияют
  11. 11. Генерация тестовых наборов
  12. 12. Генерация тестовых наборов
  13. 13. Генерация тестовых наборов P Q offer(1); offer(2); poll(); poll();
  14. 14. Последовательные исполнения ─ Перестановки исходного набора операций ─ С сохранением порядка операций для каждого потока
  15. 15. Последовательные исполнения P Q offer(1); offer(2); poll(); poll(); offer(1); poll() {1}; offer(2); poll() {2};
  16. 16. Последовательные исполнения 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);
  17. 17. Параллельные исполнения ─ Множественные запуски ─ Синхронизация старта ─ Все служебные структуры создаем вне многопоточной системы ─ Можно вызывать методы через Reflection API, но используется ASM ─ Две фазы запусков (без/с задержками)
  18. 18. Проверка ─ Ищем последовательное исполнение, соответствующее по результатам параллельному ─ Если не нашли, то структура нелинеаризуема! offer(1); poll() {1}; offer(2); poll() {1};
  19. 19. Результаты ─ Синтетические примеры ─ Очередь, счетчик, некоторые другие ─ Потеря synchronized, volatile, ошибочное использование неатомарных переменных ─ Нашлись наборы операций, приводящие к ошибке
  20. 20. Результаты ─ java.util.concurrent ✓ ─ Google Guavа ✓
  21. 21. Результаты ─ 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
  22. 22. Результаты ─ zchannel – GenericMPMCQueue P Q offer(9); {true} poll(); {null} offer(1); {true} poll(1); {1}
  23. 23. Результаты Структура данных Время (мс); мин-макс (средн.) 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)
  24. 24. Что дальше? ─ Генерация параллельных исполнений с помощью управляемого переключения между потоками ─ Конкретная последовательность инструкций ─ Лучшее покрытие состояний
  25. 25. Где посмотреть ─ Lincheck ─ https://github.com/Devexperts/lin-check ─ E-mail ─ dxlab@devexperts.com
  26. 26. Вопросы?
  27. 27. Спасибо

×