Предисловие . 10
Благодарности . 12
Об этой книге 14
Для кого эта книга . 14
Как устроена эта книга . 15
О коде в книге . 15
Форум liveBook . 16
Об авторе . 17
От издательства 18
ЧАСТЬ I. ОРКЕСТР ОСЬМИНОГОВ. СИМФОНИЯ КОНКУРЕНТНОСТИ . 19
Глава 1. Знакомство с конкурентностью 20
Почему конкурентность важна . 21
Уровни конкурентности . 27
Что вы узнаете из этой книги . 29
Итоги . 31
Глава 2. Последовательное и параллельное выполнение 32
Обзор основных понятий: что такое программа . 33
Последовательное выполнение . 35
Требования к параллельным вычислениям . 41
Параллельные вычисления . 43
Закон Амдала . 49
Закон Густафсона . 54
Конкурентность и параллелизм . 55
Итоги . 57
Глава 3. Как работают компьютеры . 59
Процессор . 60
Система выполнения . 64
Архитектура компьютерных систем . 66
Уровни конкурентного оборудования . 67
Итоги . 72
Глава 4. Структурные элементы конкурентности 74
Этапы конкурентного программирования . 75
Потоки . 80
Итоги . 86
Глава 5. Межпроцессная коммуникация . 87
Типы коммуникации . 88
Пул потоков . 98
Снова о подборе паролей . 101
Итоги . 103
ЧАСТЬ II. ЩУПАЛЬЦА КОНКУРЕНТНОСТИ: МНОГОЗАДАЧНОСТЬ, ДЕКОМПОЗИЦИЯ И СИНХРОНИЗАЦИЯ . 105
Глава 6. Многозадачность . 106
Приложения с интенсивными вычислениями (CPU-bound) и интенсивным вводом/выводом (I/O-bound) . 107
Почему необходима многозадачность . 109
Общие принципы многозадачности . 112
Многозадачные среды . 119
Итоги . 121
Глава 7. Декомпозиция . 123
Анализ зависимостей . 124
Декомпозиция задач . 125
Декомпозиция задач: паттерн «Конвейер» . 128
Декомпозиция данных . 133
Уровень детализации . 143
Итоги . 145
Глава 8. Как решать проблемы конкурентности: ситуации гонки и синхронизация . 146
Общие ресурсы . 147
Ситуация гонки . 148
Синхронизация . 153
Итоги . 161
Глава 9. Как решать проблемы конкурентности: взаимные блокировки и нехватка ресурсов . 162
Обедающие философы . 163
Взаимные блокировки . 165
Нехватка ресурсов . 173
Как проектировать синхронизацию . 175
Несколько слов напоследок . 181
Итоги . 181
ЧАСТЬ III. АСИНХРОННЫЕ ОСЬМИНОГИ. ИСТОРИЯ О КОНКУРЕНТНОМ ВЫПОЛНЕНИИ СО ВКУСОМ ПИЦЦЫ . 183
Глава 10. Неблокирующий ввод/вывод . 184
Мир распределенных вычислений . 185
Модель «клиент — сервер» . 185
Служба заказа пиццы . 188
Блокирующий ввод/вывод . 195
Неблокирующий ввод/вывод . 198
Итоги . 201
Глава 11. Событийная конкурентность 203
События . 204
Обратные вызовы . 205
Цикл событий . 206
Мультиплексирование ввода/вывода . 208
Событийный сервер для заказа пиццы . 209
Паттерн «Реактор» . 212
Синхронизация при передаче сообщений . 214
Модели ввода/вывода . 217
Итоги . 219
Глава 12. Асинхронная коммуникация . 220
Зачем нужна асинхронность . 221
Асинхронные вызовы процедур . 222
Кооперативная многозадачность . 223
Преднамеченные объекты . 229
Кооперативный сервер для заказа пиццы . 232
Асинхронная пиццерия . 237
Асинхронная модель: выводы . 243
Итоги . 244
Глава 13. Как писать конкурентные приложения . 245
Так что же такое конкурентность? . 246
Методология Фостера . 247
Умножение матриц . 249
Распределенный подсчет слов . 258
Итоги . 271
Эпилог . 272
Конкурентность позволяет эффективно выполнять компьютерные программы, разделяя их на задачи, которые можно запускать независимо. Такой подход помогает ускорить игровую графику, обучать большие модели искусственного интеллекта, быстро масштабировать веб-приложения, оптимизировать обработку больших данных и решать многие другие задачи. Работать с конкурентностью непросто, так что эта книга постепенно введет вас в курс дела, а помогут в этом интересные примеры, забавные иллюстрации и понятный код на Python. Вы изучите приемы, с помощью которых сможете программировать многоядерные и графические процессоры, а так же другие высокопроизводительные системы. Кирилл Бобров обходится без сложной математики, технического жаргона и тяжеловесных научных рассуждений, предпочитая простые и доступные объяснения.