2024/2025
Многопоточное программирование
Статус:
Маго-лего
Кто читает:
Департамент компьютерной инженерии
Когда читается:
1, 2 модуль
Охват аудитории:
для своего кампуса
Преподаватели:
Петряйкин Федор Алексеевич
Язык:
русский
Кредиты:
6
Программа дисциплины
Аннотация
В ходе программы студенты научатся разрабатывать и перерабатывать многопоточные приложения на С++ на примере аутентичных задач, выполняемых разработчиками в реальной жизни. Студенты изучат виды многозадачности, будут понимать причины возникновения проблем при разработке многопоточных приложений и способы их решения, будут знать, как устроена модель памяти C++ многопоточных приложений, а также виды примитивов синхронизации.Обучающиеся получат навыки отладки многопоточных приложений, научатся оценивать производительность приложений, находить узкие места в работе многопоточных приложений с помощью различных инструментов и исправлять их.
Цель освоения дисциплины
- В ходе обучения студенты изучат виды многозадачности, будут понимать причины возникновения проблем при разработке многопоточных приложений и способы их решения, будут знать, как устроена модель памяти C++ многопоточных приложений, а также виды примитивов синхронизации. Обучающиеся получат навыки отладки многопоточных приложений, научатся оценивать производительность приложений, находить узкие места в работе многопоточных приложений с помощью различных инструментов и исправлять их. В конце программы учащийся сможет разработать сервер инференса нейронных сетей.
Планируемые результаты обучения
- Знать общие сведения о реализации сокетов в *nix подобных системах, методы их использования на примере обмена в составе модели OSI
- Знать способы реализации чтения/записи в сокет (блокирующий, неблокирующий)
- Уметь реализовывать простейшие сетевые асинхронные приложения на python
- Уметь реализовывать блокирующий ввод/вывод на основе сокетов Беркли
- Знает сведения об устройстве protobuf, видах сообщений, их представлении при передаче (в т.ч. сжатие) и при использовании.
- Умеет писать .proto файлы, встраивать protobuf в сборку программы, использовать его в C++ и Python-коде
- Умеет разрабатывать протоколы клиент-серверного взаимодействия
- Знает общие сведения о возможностях *nix подобных систем для поддержки многопоточных приложений. Способы межпоточного взаимодействия.
- Знает возможности стандартной библиотеки C++ для запуска и завершения потоков
- Умеет использовать стандартную библиотеку C++ для многопоточной обработки данных
- Знает режимы работы программ (системное и пользовательское время).
- Знает виды примитивов синхронизации в *nix-подобных системах, способы их использования с помощью стандартной библиотеки C++
- Умеет использовать профайлировку и инструментирование для оценки производительности приложений
- Умеет использовать примитивы синхронизации стандартной библиотеки C++ для избежания гонок и упрощения многопоточного кода
- Умеет использовать future-семантику для упрощения многопоточного кода
- Умеет использовать thread sanitizer для поиска ошибок в многопоточном коде
- Знает устройство *nix подобных систем в части поддержки асинхронного ввода/вывода
- Умеет проектировать асинхронные приложения и использовать epoll для организации асинхронного ввода/вывода
- Знает принцип работы кооперативной многоздачности (корутин), их виды
- Умеет самостоятельно реализовывать stackfull-корутины
- Умеет применять корутинные движки в реальных приложениях
- Знает принцип создания новых процессов в *nix-подобных системах, прицнипы наследования данных от родительского процесса, CoW
- Знает организацию межпроцессного взаимодействия - сигналы и shared memory
- Умеет реализовывать межпроцессное взаимодействие для передачи задач в системе master/workers.
- Знает принципы работы атомарных переменных.
- Знает устройство кэша процессора и его взаимодействие с RAM. Общие сведения о модели памяти C++, отношение happends before
Содержание учебной дисциплины
- Блокирующий ввод/вывод в Unix системах. Сокеты Беркли. async на питоне.
- Стандартизация протоколов общения. Архитектурное ревью.
- Ускорение обработки запросов с помощью многопоточного исполнения. Потоки и процессы на уровне ОС.
- Профайлировка - sys и user time. Пул потоков. Примитивы синхронизации на уровне ОС и в си: мьютексы и CV
- Future семантика и отладка многопоточного кода
- Профайлирование - пример с “медленными” клиентами
- Корутины: stackfull stackless. Корутинный движок
- Корутины C++20 и boost::coroutines
- Воркерная модель организации блокирующего i/o. Shared memory
- Атомарные переменные и барьеры памяти
Промежуточная аттестация
- 2024/2025 2nd module0.1 * Коллоквиум 1 + 0.1 * Коллоквиум 2 + 0.3 * Проект часть 1 + 0.3 * Проект часть 2 + 0.2 * Экзамен
Список литературы
Рекомендуемая основная литература
- UNIX: взаимодействие процессов : мастер - класс : пер. с англ., Стивенс, У., 2003
- UNIX. Профессиональное программирование, Стивенс, У. Р., 2018
- Современные операционные системы, Таненбаум, Э., 2018
Рекомендуемая дополнительная литература
- Эффективный и современный С++ : 42 рекомендации по использованию С++11 и С++14: пер. с англ., Мейерс, С., 2019