Тип работы:
Предмет:
Язык работы:


Исследование и реализация методов верификации и тестирования конкурентных алгоритмов на С++

Работа №161493

Тип работы

Бакалаврская работа

Предмет

программирование

Объем работы37
Год сдачи2024
Стоимость4760 руб.
ПУБЛИКУЕТСЯ ВПЕРВЫЕ
Просмотрено
1
Не подходит работа?

Узнай цену на написание


Введение 3
Цели и задачи работы 4
Глава 1. Обзор предметной области 5
1.1. Используемые понятия 5
1.2. Существующие подобные инструменты 8
Глава 2. Реализация верификатора 9
2.1. Пользовательский интерфейс 9
2.2. Архитектура верификатора 10
2.3. Интерфейс Task 12
2.4. Выбор корутин для реализации Task 13
2.5. Реализация корутин 15
2.6. Генерация прерываний в целевых методах 17
2.7. Реализация примитивов синхронизации 18
2.8. Задачи планировщика 21
2.9. Случаный планировщик 22
2.10. ModelCheck планировщик 24
Глава 3. Применение верификатора 27
3.1. Неатомарный счетчик 27
3.2. Lock-free очередь 1 28
3.3. Lock-free очередь из библиотеки корутин 29
3.4. RWM буффер из библиотеки корутин 32
Выводы 33
Заключение 34
Список литературы 35


Сейчас трудно представить производительный серверный код, написанный без использования конкурентности, параллелизма, или же смеси этих
двух подходов. Абстракция конкурентности означает, что исполняемые функции чередуются, передавая поток исполнения друг другу тем или иным способом. Для реализации этой абстракции в современных языках программирования используются легкие потоки, называемые файберами или корутинами
[1].
Язык C++ используется для написания высокопроизводительного кода.
Корутины, как концепция языка, появились в 20-м его стандарте [2]. Однако,
предоставляется лишь минимальный набор операций, не предполагающий их
использование в сыром виде: нет неблокирующих примитивов синхронизаци,
планировщика.
В одной из команд компании «ВКонтакте» написали библиотеку на
базе корутин из C++, которая призвана решить описанные выше проблемы. В
нее вошли как упомянутые примитивы синхронизации: мьютексы, условные
переменные, так и lock-free очереди, наборы буфферов.
Планировщик библиотеки исполняет корутины в нескольких системных потоках, поэтому для синхронизации и обмена данными между ними используются многопоточные структуры данных. Для них написано множество
модульных и интеграционных тестов, запускающихся в том числе под санитайзером [3]. Однако, такие тесты не могут гарантировать, что проверяемые
структуры данных обладают свойствами корректности, потому что каждый
такой тест проверяет лишь одно конкретное исполнение из большого пространства. Кроме того, даже большое количество запусков может не помочь
обнаружить проблемые исполнения, потому что поведение многопоточного
кода может сильно зависеть от текущего состояния системы.
Требуемым свойством корректности является линеаризуемость [4]. Кроме того, в библиотеке используются дуальные структуры данных, и линеаризуемость может быть расширена для проверки в том числе их корректности
[5].
Так как нами не было найдено открытого инструмента для проверки
3C++ кода на линеаризуемость, то было решено разработать его самостоятельно. Кроме того, разрабатываемый инструмент должен быть способен работать
с кодом произвольных многопоточных структур данных, чтобы быть применимым в модульных тестах других приложений и библиотек.

Возникли сложности?

Нужна помощь преподавателя?

Помощь в написании работ!


Несмотря на то, что разработанного функционала хватает для базовой
проверки структур на линеаризуемость, встраивания в модульные тесты существующих библиотек, достижения целей текущей работы, трудно назвать
верификатор законченным. Поэтому необходимо упомянуть список возможных доработок:
1. Добавить возможность распараллеливания проверки историй. В данный
момент используется лишь одно ядро. Распараллеливание приведет к
существенному ускорению, так как генерация историй может быть произведена независимо.
2. Добавить возможность указания степени параллельности методов, чтобы можно было протестировать не только multi-producer multi-consumer
очереди, но и варианты с одним consumer, одним producer.
343. Добавить минимизацию найденной нелинеаризуемой истории исполнения. Таким образом, можно упростить отладку.
4. Добавить отлов дедлока на написанных примитивах.
5. Добавить проверку других моделей: например, последовательную согласованность, отсутствие препятствий, отсутствия ожиданий [31].


[1] Fiber. URL: https://en.wikipedia.org/wiki/Fiber_Ccomputer_ science) (дата обр. 25.04.2024)
[2] Coroutines. URL: https://en.cppreference.eom/w/cpp/language/ coroutines (дата обр. 25.04.2024)
[3] ThreadSanitzier. URL: https://clang.llvm.org/docs/
ThreadSanitizer.html(дата обр. 25.04.2024)
[4] Maurice P. Herlihy, Jeannete M. Wing. «Linearizability: A Correctness Condition for Concurrent Objects». ACM Transactions on Programming Languages and Systems, Vol. 12, No. 3, July 1990. URL: https://cs.brown. edu/~mph/HerlihyW90/p463-herlihy.pdf(дата обр. 25.04.2024)
[5] William N. Scherer III, Michael L. Scott. «Nonblocking Concurrent Data Structures with Condition Synchronization». URL: https: //citeseerx.ist.psu.edu/viewdoc/download;jsessionid= 2A32CD27835F6B4ABA33DC9B237A2076?doi=10.1.1.330.131&rep= rep1&type=pdf (дата обр. 25.04.2024)
[6] Gibbons, P. B., Korach, E. «Testing shared memories.». SIAM Journal on Computing 26, 4 (1997), 1208-1244.
[7] Infographics: Operation Costs in CPU Clock Cycles. URI: http://ithare. com/infographics-operation-costs-in-cpu-clock-cycles/(дата обр. 25.04.2024)
[8] Rendezvous synchronization. URL: https://en.wikipedia.org/wiki/ Rendezvous_(Plan_9)(gaTa обр. 25.04.2024)
[9] Partially ordered set. URL: https://en.wikipedia.org/wiki/ Partially_ordered_set#Partial_order(дaтa обр. 25.04.2024)
[10] Multithreading. URL: https://en.cppreference.Com/w/cpp/
language/multithread(дaтa обр. 25.04.2024)
[11] Memory order. URL: https://en.cppreference.com/w/cpp/atomic/ memory_order(дaтa обр. 25.04.2024)
[12] Sequential consistency atomics. URL: https://eel.is/c++draft/ atomics#order-note-5(дaтa обр. 25.04.2024)
[13] Lincheck. URL: https://github.com/JetBrains/lincheck(дaтa обр. 25.04.2024)
[14] Chess. URL: https://github.com/LeeSanderson/Chess(дaтa обр. 25.04.2024)
[15] Twist. URL: https://gitlab.com/Lipovsky/twist(дaтa обр. 25.04.2024)
[16] tla+. URL: https://github.com/tlaplus(дaтa обр. 25.04.2024)
[17] tuple. URL: https://en.cppreference.com/w/cpp/utility/
tuple(дaтa обр. 25.04.2024)
[18] YACLib. URL: https://github.com/YACLib/YACLib(дaтa обр. 25.04.2024)
[19] Concurencpp. URL: https://github.com/David-Haim/
concurrencpp(дaтa обр. 25.04.2024)
[20] LLVM Coroutines. URL: https://llvm.org/docs/Coroutines. ЬШ^дата обр. 25.04.2024)
[21] longjmp. URL: https://en.cppreference.eom/w/cpp/utility/ program/longjmp(gaTa обр. 25.04.2024)
[22] signal. URL: https://man7.Org/linux/man-pages/man7/signal.7. ^т1(дата обр. 25.04.2024)
[23] sigaction. URL: https://man7.org/linux/man-pages/man2/
sigaction.2.htm1(дaтa обр. 25.04.2024)
[24] LLVM Pass. URL: https://llvm.org/docs/WritingAnLLVMPass. htm1(дaтa обр. 25.04.2024)
[25] S. Burckhardt, P. Kothari, M. Musuvathi. «A Randomized
Scheduler with Probabilistic Guarantees of Finding Bugs». UR: https://www.microsoft.com/en-us/research/wp-content/uploads/ 2016/02/asp1os277-pct.pdf(дaтa обр. 25.04.2024)
[26] Mutex. URL: https://en.cppreference.com/w/cpp/thread/
mutex(дaтa обр. 25.04.2024)
[27] Condition variable. URL: https://en.cppreference.com/w/cpp/ thread/condition_variab1e(дaтa обр. 25.04.2024)
[28] Stress testing. URL: https://en.wikipedia.org/wiki/Stress_ testing(дaтa обр. 25.04.2024)
[29] folly IOBuf. URL: https://github.com/facebook/folly/blob/main/ fo11y/io/IOBuf.h(дaтa обр. 25.04.2024)
[30] IDDFS. URL: https://en.wikipedia.org/wiki/Iterative_
deepening_depth-first_search(дaтa обр. 25.04.2024)
[31] Non-blocking algorithms. URL: https://en.wikipedia.org/wiki/ Non-b1ocking_a1gorithm(дaтa обр. 25.04.2024)
[32] herlihy. URL: https://git1ab.com/whir1-framework/her1ihy(дaтa обр. 25.04.2024)


Работу высылаем на протяжении 30 минут после оплаты.




©2025 Cервис помощи студентам в выполнении работ