Опубликовано

Новинка: “Rust: атомарности и блокировки”

Rust: атомарности и блокировки

Книга позволяет программистам получить четкое представление о низкоуровневой конкурентности и ее реализации. Даны основы конкурентности в Rust. Раскрыты понятия об  атомарности и упорядочении памяти. Рассмотрены практические аспекты создания своих собственных каналов, своего собственного типа Arc  и своих собственных блокировок  Дано представление о внутренней “кухне” процессора. Рассказано о  примитивах операционной системы.  Предложены идеи для самостоятельной разработки решений,  связанных с вычислениями в конкурентном режиме.

Для Rust-программистов

Mara Bos

Примеры кода, использованные в этой книге, загружены автором в репозиторий на GitHub для вашего ознакомления: https://github.com/m-ou-se/rust-atomics-and-locks.

Низкоуровневая конкурентность на практике (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

 

 

 

Mara Bos

Примеры кода, использованные в этой книге, загружены автором в репозиторий на GitHub для вашего ознакомления: https://github.com/m-ou-se/rust-atomics-and-locks.

Добавить комментарий