
Огляд підручника: чи паралельне програмування складне і що з цим робити
Ендрю Гелвер опублікував детальний огляд безкоштовного підручника Пола Е. Мак-Кенні про паралельне програмування — що сподобалось, що ні та де текст залишається прив'язаним до ядра Linux.
Ендрю Гелвер опублікував детальний огляд безкоштовного онлайн-підручника «Is Parallel Programming Hard, And, If So, What Can You Do About It?» Пола Е. Мак-Кенні — автора механізму синхронізації RCU в ядрі Linux. Гелвер прочитав більшу частину книги під час відпустки з родиною та розповідає, що працює добре, що ні і де текст залишається в контексті ядра Linux.
Від розподілених систем до lock-free коду
Після десятиліття роботи з TLA⁺ і розподіленими системами Гелвер узявся за книгу після конференції Software Should Work 2026 у Колумбії, штат Міссурі. Розмова там із Філіпом Пізло про складність написання конкурентного lock-free збирача сміття показала, як мало він насправді знав про конкурентність. Пізло також зауважив, що TLA⁺ не надто зручна для міркувань про події, які відбуваються буквально одночасно, і наголосив на лінеаризовності. Гелвер хотів книгу про lock-free програмування, а не про м'ютекси чи передачу повідомлень.
Кеші CPU, хитрощі компілятора та лічильники
Третій розділ, «Hardware and its Habits», пояснює, що робить сучасні CPU швидкими, а що — повільними, зокрема випадок, коли ядро записує за адресою, якої немає в його кеші. Протокол когерентності MESI згадується лише в додатку, але знання про нього прояснює решту: ядра x86 пишуть у власні кеші й потребують ексклюзивного володіння кеш-лінією, тому буквально одночасних записів в одну адресу не буває — хоча записи, що перетинають кілька кеш-ліній, можуть розриватися.
Четвертий розділ, «Tools of the Trade», описує, що компілятор може зробити з необережним паралельним кодом: розрив і злиття завантажень і збережень, перевпорядкування коду, вигадані завантаження та збереження, перетворення store-to-load і видалення мертвого коду — а далі додає свої сюрпризи сам CPU. П'ятий розділ, «Counting», — головний у книзі: близько десяти способів змусити кілька потоків збільшувати один лічильник; наївні атомарні інкременти відкидаються через погану продуктивність, а розділ завершується signal-theft limit counter. Найбільше Гелверу сподобалися масивні потокові статистичні лічильники: вони схожі на conflict-free replicated datatypes зі світу розподілених систем і показують ціну false sharing.
Вердикт
Головна критика — специфічність прикладів для ядра Linux: робота C++11 і C11 над моделями пам'яті, зокрема std::memory_order, отримала лише короткі абзаци, а старі дискусії про «доброякісні» гонки даних пропущено. Lock-free програмування з'являється лише в розділі 14, а порядок доступу до пам'яті — у 15-му; на той час автор уже читав зовнішні джерела. Внутрішні посилання, корисні для питань самоперевірки, незручні на e-reader. Попри це, Гелвер називає підручник чудовим: він викликав бажання вчитися далі, і наступною темою стане високопродуктивне збирання сміття.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.