2021-03-24 11:58:21
Есть книга про параллельное программирование от инженера и исследователя Paul McKenney. В 2011 году он выложил её в открытый доступ под лицензией CC BY-SA 3.0 и продолжает дописывать её до сих пор (600+ стр.). Я про неё узнал из постов автора на LWN, где он рассказывал как верифицировать алгоритм RCU с помощью SPIN/Promela. Так вот в книге автор рассказывает о проблемах параллельного программирования начиная с того, как работает CPU и память (CPU pipeline, memory barriers, cache misses), потом переходит к поддержке мультипроцессорности в POSIX системах и далее к синхронизации и блокировках в проектировании систем.
Я бы не стал писать про это здесь, если бы автор не посвятил целых два раздела в книге валидации и формальной верификации параллельных систем. С первых строк хочется разобрать текст на цитаты:
"Where Do Bugs Come From? Bugs come from developers."
"When Should Validation Start? Validation should start exactly when the project starts."
"But never forget that the two best debugging tools are a thorough understanding of the requirements, a solid design and a good night’s sleep!"
Золотые слова!
Из интересного я бы выделил разделы про гейзенбаги и вероятности возникновения багов, изоляцию тестов друг от друга и выявление фактов влияния тестов друг на друга.
Ещё мне нравится что то, что пишет автор, основано на его собственном опыте. Тут нужно отметить, что Пол адвокат алгоритма RCU (read-copy-update) и этот алгоритм широко (в статье "RCU Usage In the Linux Kernel: One Decade Later" утверждается, что RCU используется в большинстве подсистем Linux ядра) используется в Linux ядре (как я понимаю это отчасти его заслуга, но не нашёл этому прямых подтверждений). И так как он занимался RCU и использованию RCU в ядре в частности, то и в книге многие примеры касаются RCU. Например про вероятности возникновения багов: "a million-year race-condition bug is happening three times a day across the installed base". Чтобы такие редкие баги найти уже не достаточно стандартных средств вроде инспекции кода, статического анализа и тестирования, нужны более изощрённые подходы. Поэтому часть багов в RCU нашли с помощью моделирования в SPIN, проверки кода с CBMC и с помощью мутационного тестирования.
Книга: https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html
758 viewsSergey Bronnikov, 08:58