
Книга позволяет программистам получить четкое представление о низкоуровневой конкурентности и ее реализации. Даны основы конкурентности в Rust. Раскрыты понятия об атомарности и упорядочении памяти. Рассмотрены практические аспекты создания своих собственных каналов, своего собственного типа Arc и своих собственных блокировок Дано представление о внутренней “кухне” процессора. Рассказано о примитивах операционной системы. Предложены идеи для самостоятельной разработки решений, связанных с вычислениями в конкурентном режиме.
Для Rust-программистов
Низкоуровневая конкурентность на практике (Low-Level Concurrency in Practice)
Вы изучите применение Rust в следующих областях:
Язык программирования Rust великолепно справляется с конкурентными вычислениями, а в его экосистеме имеется множество библиотек, включающих широкий набор структур данных, блокировок и многого другого, предназначенного для работы в среде конкурирующих потоков. Но корректная реализация этих структур может оказаться весьма непростой задачей. Ошибки, допущенные в вопросах упорядочения памяти, нередко встречаются даже в самых востребованных библиотеках.
В этой книге, имеющей сугубо практическую направленность, Мара Бос, руководитель команды разработчиков библиотеки Rust, помогает Rust-программистам всех уровней получить четкое представление о низкоуровневой конкурентности. Вы узнаете об атомарности и упо-рядочении памяти, а также о том, как они сочетаются с базовыми API-интерфейсами опера-ционной системы для создания таких наиболее востребованных примитивов, как мьютексы и условные переменные. Прочитав книгу, вы получите четкое представление о том, как связаны друг с другом используемая в Rust модель памяти, процессор и особенности той или иной операционной системы.
Вы узнаете:
- Об исключительной роли имеющейся в Rust сиcтемы типов в корректном программировании конкурентности
- Все о мьютексах, условных переменных, атомарности и упорядочении памяти
- Что на самом деле происходит с атомарными операциями в процессорах Intel и ARM
- Как реализуются блокировки при поддержке операционной системы
- Как создается корректный программный код, включающий конкурентность, атомарность и блокировки
- Какими приемами можно воспользоваться для правильного создания своих собственных примитивов блокировки и синхронизации
Это удивительная книга! В ней именно то, что мне самой хотелось рассказать о конкурентно-сти, но у Мары получилось гораздо лучше, о чем я даже не смела мечтать. Досконально и все на своих местах.
Ария Бейнжеснер, автор книги “The Rustonomicon”
Книгу “Rust: атомарности и блокировки” можно купить со скидкой в интернет-магазине издательства “БХВ“.
Предисловие…………………………………………………………………………………………… 11
Введение………………………………………………………………………………………………… 13
Для кого предназначена эта книга…………………………………………………………………………………………… 13
Обзор глав…………………………………………………………………………………………………………………………………… 14
Примеры кода…………………………………………………………………………………………………………………………….. 16
Условные обозначения, используемые в данной книге………………………………………………………….. 16
Благодарности…………………………………………………………………………………………………………………………… 17
Глава 1. Основы конкурентности в Rust………………………………………………… 19
Потоки в Rust……………………………………………………………………………………………………………………………… 19
Потоки с областью действия…………………………………………………………………………………………………….. 23
Совместное владение и подсчет ссылок………………………………………………………………………………….. 25
Статика…………………………………………………………………………………………………………………………………. 25
Утечка……………………………………………………………………………………………………………………………………. 25
Подсчет ссылок…………………………………………………………………………………………………………………….. 26
Заимствования и гонка данных………………………………………………………………………………………………… 28
Внутренняя изменяемость…………………………………………………………………………………………………………. 30
Cell…………………………………………………………………………………………………………………………………………. 31
RefCell……………………………………………………………………………………………………………………………………. 32
Mutex и RwLock…………………………………………………………………………………………………………………….. 33
Атомарные типы…………………………………………………………………………………………………………………… 33
UnsafeCell……………………………………………………………………………………………………………………………… 34
Потокобезопасность: Send и Sync…………………………………………………………………………………………….. 34
Блокировка: мьютексы и RwLock-блокировки………………………………………………………………………… 36
Мьютекс в языке Rust…………………………………………………………………………………………………………… 37
Отравление блокировок………………………………………………………………………………………………………. 39
Блокировка чтения-записи………………………………………………………………………………………………….. 41
Ожидание: парковка и условные переменные………………………………………………………………………… 42
Парковка потоков…………………………………………………………………………………………………………………. 42
Условные переменные…………………………………………………………………………………………………………. 45
Резюме…………………………………………………………………………………………………………………………………………. 47
Глава 2. Атомарность…………………………………………………………………………….. 48
Атомарные операции загрузки и сохранения: load и store……………………………………………………. 49
Пример: Флаг остановки……………………………………………………………………………………………………… 49
Пример: Отчет о ходе выполнения задачи………………………………………………………………………… 50
Синхронизация………………………………………………………………………………………………………….. 51
Пример: Отложенная инициализация………………………………………………………………………………… 52
Операции выборки и изменения……………………………………………………………………………………………….. 54
Пример: Отчет о ходе выполнения задачи из нескольких потоков…………………………………. 55
Пример: Статистика…………………………………………………………………………………………………………….. 56
Пример: Предоставление идентификатора……………………………………………………………………….. 58
Операции сравнения и обмена………………………………………………………………………………………………….. 60
Пример: Предоставление идентификатора без переполнения…………………………………………. 62
Пример: Отложенная однократная инициализация………………………………………………………….. 63
Резюме…………………………………………………………………………………………………………………………………………. 64
Глава 3. Упорядочение памяти………………………………………………………………. 66
Изменение порядка и оптимизация…………………………………………………………………………………………… 66
Модель памяти…………………………………………………………………………………………………………………………… 68
Отношения “происходит до”…………………………………………………………………………………………………….. 68
Порождение и присоединение…………………………………………………………………………………………….. 70
Расслабленное упорядочение…………………………………………………………………………………………………… 71
Упорядочение высвобождения и получения памяти………………………………………………………………. 73
Пример: Блокировка…………………………………………………………………………………………………………….. 76
Пример: Отложенная инициализация с применением косвенного подхода…………………… 78
Упорядочение потребления………………………………………………………………………………………………………. 81
Последовательно согласованное упорядочение…………………………………………………………………….. 82
Ограждения………………………………………………………………………………………………………………………………… 83
Распространенные заблуждения……………………………………………………………………………………………… 87
Резюме…………………………………………………………………………………………………………………………………………. 89
Глава 4. Создание своей собственной спин-блокировки………………………… 91
Минималистичная реализация…………………………………………………………………………………………………. 91
Небезопасная спин-блокировка……………………………………………………………………………………………….. 93
Безопасный интерфейс с использованием хранителя блокировки……………………………………….. 96
Резюме…………………………………………………………………………………………………………………………………………. 99
Глава 5. Создание своих собственных каналов……………………………………. 100
Простой канал на основе мьютекса……………………………………………………………………………………….. 100
Небезопасный одноразовый канал………………………………………………………………………………………… 102
Безопасность, достигаемая проверками в ходе выполнения……………………………………………….. 105
Обеспечение безопасности с использованием системы типов…………………………………………….. 109
Заимствование во избежание выделения памяти………………………………………………………………….. 114
Блокировка……………………………………………………………………………………………………………………………….. 117
Резюме………………………………………………………………………………………………………………………………………. 119
Глава 6. Создание своего собственного типа Arc………………………………….. 121
Базовый подсчет ссылок…………………………………………………………………………………………………………. 121
Тестирование……………………………………………………………………………………………………………………… 125
Изменение……………………………………………………………………………………………………………………………. 126
Слабые указатели……………………………………………………………………………………………………………………. 127
Тестирование……………………………………………………………………………………………………………………… 132
Оптимизация…………………………………………………………………………………………………………………………….. 133
Резюме………………………………………………………………………………………………………………………………………. 140
Глава 7. Представление о внутренней “кухне” процессора………………….. 141
Инструкции процессора………………………………………………………………………………………………………….. 142
Загрузка и сохранение………………………………………………………………………………………………………. 145
Операции чтения-изменения-записи…………………………………………………………………………………. 147
Префикс lock в x86…………………………………………………………………………………………………… 147
x86-инструкция сравнения-обмена……………………………………………………………………….. 149
Инструкции load-linked и store-conditional……………………………………………………………………… 150
ARM-инструкции load-exclusive и store-exclusive………………………………………………… 151
ARM-инструкции сравнения-обмена…………………………………………………………………….. 152
Кеширование……………………………………………………………………………………………………………………………. 154
Согласованность кеша………………………………………………………………………………………………………. 155
Протокол сквозной записи……………………………………………………………………………………… 156
Протокол MESI……………………………………………………………………………………………………….. 156
Влияние, оказываемое на производительность………………………………………………………………. 157
Переупорядочение…………………………………………………………………………………………………………………… 162
Упорядочение памяти……………………………………………………………………………………………………………… 164
x86-64: строго упорядоченная архитектура……………………………………………………………………. 165
ARM64: слабо упорядоченная архитектура…………………………………………………………………… 167
Эксперимент……………………………………………………………………………………………………………………….. 169
Ограждения памяти……………………………………………………………………………………………………………. 171
Резюме………………………………………………………………………………………………………………………………………. 172
Глава 8. Примитивы операционной системы……………………………………….. 175
Взаимодействие с ядром…………………………………………………………………………………………………………. 175
POSIX………………………………………………………………………………………………………………………………………… 176
Обертывание в Rust……………………………………………………………………………………………………………. 178
Linux………………………………………………………………………………………………………………………………………….. 180
Фьютекс………………………………………………………………………………………………………………………………. 180
Фьютексные операции……………………………………………………………………………………………………….. 183
Фьютексные операции с наследованием приоритета…………………………………………………….. 187
macOS……………………………………………………………………………………………………………………………………….. 188
os_unfair_lock…………………………………………………………………………………………………………………….. 189
Windows…………………………………………………………………………………………………………………………………….. 189
Тяжеловесные объекты ядра…………………………………………………………………………………………….. 189
Облегченные объекты………………………………………………………………………………………………………… 190
Легкая блокировка чтения-записи…………………………………………………………………………. 190
Адресное ожидание……………………………………………………………………………………………………………. 191
Резюме………………………………………………………………………………………………………………………………………. 192
Глава 9. Создание своих собственных блокировок………………………………. 194
Мьютекс……………………………………………………………………………………………………………………………………. 196
Предотвращение системных вызовов………………………………………………………………………………. 199
Дальнейшая оптимизация…………………………………………………………………………………………………. 201
Сравнительный анализ……………………………………………………………………………………………………… 203
Условная переменная………………………………………………………………………………………………………………. 205
Предотвращение системных вызовов………………………………………………………………………………. 210
Предотвращение ложных пробуждений………………………………………………………………………….. 212
Блокировка чтения-записи……………………………………………………………………………………………………… 215
Предотвращение применения ждущего цикла в записывающих потоках……………………. 218
Предотвращение голода записывающих потоков………………………………………………………….. 220
Резюме………………………………………………………………………………………………………………………………………. 224
Глава 10. Идеи и творческое воодушевление……………………………………….. 225
Семафор……………………………………………………………………………………………………………………………………. 225
RCU…………………………………………………………………………………………………………………………………………… 226
Связанный список без блокировки…………………………………………………………………………………………. 227
Блокировки на основе очереди………………………………………………………………………………………………. 228
Блокировки на основе парковок…………………………………………………………………………………………….. 229
Последовательная блокировка………………………………………………………………………………………………. 230
Учебные материалы………………………………………………………………………………………………………………… 231
Предметный указатель…………………………………………………………………………. 233
Об авторе……………………………………………………………………………………………… 237
Об изображении на обложке………………………………………………………………… 238

