Скоро! The Nature of Concurrency - Курс по многопоточному программированию [Тариф Base] [Игорь Панасюк]

Статус
В этой теме нельзя размещать новые ответы.

Складчина: The Nature of Concurrency - Курс по многопоточному программированию [Тариф Base] [Игорь Панасюк]​

The Nature of Concurrency - Курс по многопоточному программированию [Тариф Base] [Игорь Панасюк]


Описание:


Путь для тех, кто готов и хочет стать мастером многопоточного программирования

Самое главное
  • Уникальность
    Помимо личного опыта, материалы для курса я собирал, общаясь с ведущими разработчиками индустрии, например, с создателем языка Kotlin
  • Постоянная связь
    Во время и после обучения, ты будешь иметь доступ к Telegram сообществу, в котором будут ответы на все твои вопросы и регулярные прямые эфиры
  • Универсальность
    Знания, которые будут получены на курсе, будут применимы к любому языку программирования, в частности, к языку Go
Программа курса
По итогу обучения ты напишешь свою In-Memory многопоточную obstruction-free платёжную систему
  • Занятие №1. Мотивация изучения многопоточного программирования
  • Занятие №2. Глобальные проблемы и цели многопоточного программирования
  • Домашнее задание №1
  • Занятие №3. Реализация низкоуровневых примитивов синхронизации на Go
  • Занятие №4. Реализация критической секции на базе низкоуровневых примитивов синхронизации
  • Домашнее задание №2
  • Занятие №5. Устройство и ключевые свойства блокировок
  • Занятие №6. Использование и устройство сложных примитивов синхронизации
  • Домашнее задание №3
  • Занятие №7. Каналы в Go как встроенная многопоточная очередь
  • Занятие №8. Многопоточные паттерны на основе каналов в Go
  • Домашнее задание №4
  • Занятие №9. Формализм и аппаратные особенности многопоточного программирования
  • Занятие №10. Продвинутые блокировки для многосерверных систем
  • Домашнее задание №5
  • Занятие №11. Продвинутые многопоточные паттерны для коллекций
  • Занятие №12. Lock-free и obstruction-free алгоритмы
  • Домашнее задание №6
  • Занятие №13. Асинхронное программирование
Спойлер: Программа подробно:
Занятие №1. Мотивация изучения многопоточного программирования
Разберёшься с тем, зачем нужно многопоточное программирование и почему за последние 25 лет оно стало таким востребованным
1. История. Однозадачные, пакетные, многозадачные и многопоточные системы
2. Закон Мура. Обзор частоты, производительности и числа ядер
3. Типы параллелизма: на уровне инструкций, на уровне задач, на уровне данных
4. Чтение и запись как основные операции в многопоточном программировании
5. Абстракции операционной системы как компоненты многопоточной программы: process, thread, execution, context switching
6. Построение графа исполнения, обзор проблем многопоточного программирования

Занятие №2. Глобальные проблемы и цели многопоточного программирования
Поймешь, как и какие задачи решает многопоточное программирование. Осознаешь проблематику, начиная от аппаратной части компьютера, заканчивая абстракциями операционной системы и языков программирования
1. User-threads - примеры, состояния горутин в Go
2. Свойства планировщика: тип многозадачности, безопасность, живучесть, справедливость
3. Построение графа исполнения, обзор проблем многопоточного программирования
4. Обзор виртуальной памяти, MMU, TLB. Обзор проблемы с memory ordering
5. Когерентность кэша и его важность в многопоточном программировании
6. Инструкции процессора для синхронизации
7. Отличие Concurrency от Parallelism

Домашнее задание №1
На примере руками построишь многопоточный граф исполнения. Поймёшь, в каких состояниях может находиться многопоточная программа и как на практике верифицируют корректность многопоточных программ

Занятие №3. Реализация низкоуровневых примитивов синхронизации на Go
Начиная с ассемблера и атомарных инструкций, заканчивая собственным мьютексом, сам реализуешь все самые известные примитивы синхронизации, своими руками написав 80% пакетов atomic и sync
1. Spurious wakeup как важная часть многопоточных паттернов
2. Атомарные операции, пакет atomic, его реализация на ассемблере
3. Реализация собственных атомиков на ассемблере
4. Операция GetAndSet/GetAndInc
5. Консенсусное число примитивов синхронизации, операция CompareAndSet

Занятие №4. Реализация критической секции на базе низкоуровневых примитивов синхронизации\
На базе собственных примитивов синхронизации напишешь свой мьютекс и продвинутые типы из пакета sync
1. Критические секции в многопоточном программировании
2. Реализация собственного мьютекса на базе spinlock
3. Реентерабельный мьютекс
4. Собственная реализация sync.Once, отличие от библиотечной
5. Собственная реализация sync.WaitGroup, отличие от библиотечной

Домашнее задание №2
Мьютекс в Go неплохой, но, к сожалению, в отличие от мьютекса в Java, он нереентерабельный, то есть нельзя вызвать lock() два раза из одной и той же горутины.
Вам предлагается реализовать свой мьютекс, поддержав это свойство

Занятие №5. Устройство и ключевые свойства блокировок
Блокировка (mutex) - самый частый примитив синхронизации, который используется на практике. После занятий ты поймешь, по каким ключевым свойствам стоит оценивать любую блокировку. На практике реализуешь различные алгоритмы мьютекса и осознаешь продвинутые способы работы с блокировками
1. Ключевые свойства блокировок (mutex exclusion, deadlock freedom, starvation freedom)
2. Условия честности (quadratic wait, linear wait, first come first served ~ fair)
3. Реализация алгоритма мьютекса Петерсона
4. Реализация алгоритма мьютекса Лампорта
5. Проблемы блокировок (условные условия прогресса, инверсия приоритетов, голодание, последовательное выполнение)
6. Шардированная блокировка
7. Тонкая блокировка
8. Иерархическая блокировка
9. Понятия deadlock/livelock
10. Задача об обедающих философах

Занятие №6. Использование и устройство сложных примитивов синхронизации
В реальной жизни любые по-настоящему сложные вещи — это набор эвристик и костылей. Во время занятия мы рассмотрим сложные примитивы синхронизации и поймем, как ими пользоваться и почему они написаны именно так, а не иначе
1. Устройство мьютекса с эвристиками (sync.Mutex)
2. Read/Write Mutex (sync.RWMutex)
3. Concurrent hashmap (sync.Map)
4. Rendezvous (sync.Cond)
5. Concurrent pool (sync.Pool). Пример использования и оптимизации GC

Домашнее задание №3
В этом домашнем задании ты будешь реализовывать свою платёжную систему. Будет дан некоторый интерфейс, который нужно будет реализовать. Набор методов будет включать в себя операции перевода, получения суммы и агрегацию.
Конечно же, любая платёжная система хочет проводить операции быстро, поэтому нужно будет использовать иерархические блокировки и другие примитивы синхронизации, рассмотренные в занятиях.
Можно заметить, что даже в таком простом коде
func transferMoney(from, to int) bool
transferMoney(1, 2)
transferMoney(2, 1)
Легко попасть в deadlock. Поэтому реализация такого платёжного шлюза - довольно нетривиальная задача

Занятие №7. Каналы в Go как встроенная многопоточная очередь
В этом занятии ты разберёшься с тем, как устроена самая примитивная многопоточная очередь.
В свою очередь канал в Go является частным случаем многопоточной очереди, в занятии разберём его устройство и интерфейс взаимодействия
1. Реализация многопоточной очереди
2. Устройство каналов в Go на базе thread-safe очереди, буферизация
3. Создание, направленность и закрытие каналов
4. Особенности каналов (сравнение, zero value, утечки, for range)
5. Select statement, expression evaluation

Занятие №8. Многопоточные паттерны на основе каналов в Go
На основе каналов Go реализуешь различные практические concurrency паттерны
1. Реализация ErrorGroup с использованием каналов
2. Done channel, promise, future
3. Реализация rate limiter'a
4. Реализация Barrier
5. Реализация Single Flight
6. Реализация time.Ticker и таймаутов
7. Context как обёртка над done channel'ом в Go (виды context'a)
8. Workerpool
9. Generator
10. Pipeline (с Finite State Machine расширением)
11. FanIn / FanOut
12. Semaphore
13. Publisher/subscriber

Домашнее задание №4
Вы продолжаете реализовывать платёжную систему из прошлого домашнего задания. На этот раз вы будете реализовывать обработку платежей - использовать паттерн Pipeline.
Конечно, некоторые стадии обработки платежа могут быть долгими, вам необходимо их ускорить, используя паттерны FanIn/FanOut.
Ясное дело, что нужно каким-то образом управлять задачами в платёжной системе, для этого вы интегрируете вышеописанную логику с паттерном WorkerPool.
Помимо этого, вы будете делать некоторые действия в рамках обработки платежей. Для некоторых операций есть очень важное свойство - идемпотентность. Для её поддержки в этом домашнем задании вам предлагается реализовать один из самых сложных многопоточных паттернов в Go - Single Flight.

Занятие №9. Формализм и аппаратные особенности многопоточного программирования
На самом деле мир немного сложнее и за многопоточным программированием скрывается огромная и интересная теория, которую вы изучите в рамках этого занятия.
Помимо этого, мы рассмотрим продвинутые аппаратные инструкции и абстракции над ними, которые позволяют контролировать порядок исполнения инструкций в процессоре
1. Memory model в языках программирования
2. Разбор memory model Go
3. Отношения sequenced before, synchronized before, happens before
4. Понятие линеаризуемости структур данных
5. Понятие thread-safe структуры данных
6. Конвейер процессора, out-of-order execution
7. Пример инструкций для синхронизаций
8. Устройство барьеров на x86, барьеры на чтение, на запись, acquire, release.
9. Регулирование модели памяти вручную на примере Go и C++

Занятие №10. Продвинутые блокировки для многосерверных систем
Это занятие посвящено примитивам синхронизации, которые используются на практике в highload системах.
Перед рассмотрением мы разберёмся, какие проблемы в многопоточном программировании возникают, когда мы не задумываемся о взаимодействии с кэшем и памятью.
В реальности, в дата-центрах используются сервера с тысячами ядер, такие сервера чаще всего используют NUMA архитектуру. Для неё нужно использовать специальные блокировки, чтобы не было кросс-обращения в память другого ядра. Именно такие блокировки используются в ядрах операционных систем, в этом занятии мы рассмотрим самые известные из них.
Далее мы рассмотрим примитив синхронизации UpgradableLock, который представляет собой RWMutex с возможностью улучшать read() блокировку до write() блокировки. Такой примитив часто бывает нужен, но, к сожалению, из-за сложности его реализации и интерфейса, в Go его нет, поэтому мы напишем его сами
1. Проблемы работы с кэшем и памятью (True sharing, false sharing, cache contention)
2. UpgradableLock (в Go не реализован из-за сложности интерфейса)
3. CAS spin
4. NUMA
5. Обзор блокировок, которые используются в масштабных NUMA системах
6. Travis Craig, Anders Landin, Erik Hagersten (CHL Lock)
7. John Mellor-Crummey and Michael Scott (MCS Lock)

Домашнее задание №5
Примитив синхронизации UpgradableLock, который представляет собой RWMutex с возможностью улучшать read() блокировку до write() блокировки. Такой примитив часто бывает нужен, но, к сожалению, из-за сложности его реализации и интерфейса, в Go его нет, поэтому мы напишем его сами

Занятие №11. Продвинутые многопоточные паттерны для коллекций
В реальной жизни чаще всего приходится программировать какие-либо структуры данных или коллекции, которые что-то делают с данными. В этом уроке мы рассмотрим самую известную технику многопоточного программирования, которая позволяет сделать любую структуру данных многопоточной.
Помимо этого, мы спроектируем гарантии и реализуем свой планировщик
1. Как сделать любую коллекцию многопоточной (самая известная техника flat combining (не lock-free))
2. Реализация многопоточной очереди на базе flat-combining
3. Реализация собственного планировщика

Занятие №12. Lock-free и obstruction-free алгоритмы
В этом занятии мы погрузимся в самую сложную часть многопоточного программирования - неблокирующие алгоритмы. У блокировок есть свои минусы, поэтому иногда люди стараются проектировать структуры данных без блокировок.
Мы обсудим классы многопоточных алгоритмов, рассмотрим одну из самых быстрых многопоточных очередей.
Помимо этого, мы сфокусируемся на транзакционной памяти и MVCC методологии. Всё это используется в реальных базах данных для управления транзакциями. Вы поймете устройство и сами научитесь реализовывать подобные механизмы.
В конце мы рассмотрим реализацию транзакций на базе аппаратных инструкций процессора
1. Obstruction-free, lock-free, wait-free алгоритмы
2. Одна из самых быстрых очередей fetch-and-add queue
3. Реализация MVCC
4. Реализация Software Transaction Manager - собственной транзакционной памяти на базе случайного contention manager'a
5. Реализация Hardware Transaction Manager - собственной транзакционной памяти на базе транзакционных инструкций процессора

Домашнее задание №6
В завершающем домашнем задании по разработке вашей платёжной системы, вы добавите поддержку транзакций как в реальной базе данных.
В усложнённой версии предлагается написать свой собственный STM, в упрощённой - воспользоваться готовой библиотекой.
Помимо этого, вы реализуете свой WAL на базе MVCC как в настоящих базах данных и поддержите снапшоты для вашего платёжного шлюза

Занятие №13. Асинхронное программирование
В этом занятии мы обсудим, почему за последние годы почти все популярные языки программирования добавили к себе поддержку асинхронного программирования.
Рассмотрим устройство неблокирующих вызовов и поймем, как на самом деле устроено "реактивное программирование"
1. Почему все языки программирования добавляют асинхронное программирование, устройство неблокирующих системных вызовов
2. Использование API epoll'a на linux

Об авторе: Игорь Панасюк
Разрабатываю платёжный шлюз Яндекса 500+ RPS, обеспечивающий обработку платежей для всех клиентских сервисов компании. Помимо этого, преподаю курс по Go для сотрудников компании
В Университете ИТМО читаю лекции и курирую двухсеместровый курс «Программирование на Go» на кафедре прикладной математики и информатики
Спикер конференций HighLoad, GolangConf, GoFunc и локальных митапов
Автор YouTube канала. 5+ лет в промышленной разработке, более 3000 часов менторства и преподавания, более 500 человек обучились на моих курсах

Тариф Base
Доступ к материалам на 6 мес
Финальный проект
4 групповые Q/A сессии
13 практических занятий
6 домашних заданий с автотестами

Цена: 14900 руб.
Скрытая ссылка

Материал «The Nature of Concurrency - Курс по многопоточному программированию [Тариф Base] [Игорь Панасюк]», возможно, скоро появится на SHAREWOOD.
Воспользуйтесь поиском, может быть, он уже опубликован.
 
Статус
В этой теме нельзя размещать новые ответы.

Последние темы автора

SHAREWOOD
Ответы
0
Просмотры
7
SHAREWOOD
SHAREWOOD
SHAREWOOD
Ответы
0
Просмотры
11
SHAREWOOD
SHAREWOOD
SHAREWOOD
Ответы
0
Просмотры
10
SHAREWOOD
SHAREWOOD
SHAREWOOD
Ответы
0
Просмотры
14
SHAREWOOD
SHAREWOOD
SHAREWOOD
Ответы
0
Просмотры
11
SHAREWOOD
SHAREWOOD

Похожие темы

SHAREWOOD
Ответы
0
Просмотры
3K
SHAREWOOD
SHAREWOOD
Сверху Снизу