Concurrency and Consistency. Non-blocking, lock-free and async. Пост №12. Заключение.
Когда я начинал цикл постов у меня было ожидание что lock-free это - ускорять программы ценой усложнения кода. При этом интуиция шептала, что в таком случае мьютексы автоматически становятся ненужными, а они живее всех живых. С этой точки я и решил погрузиться в вопрос в поисках истины.
По итогам цикла постов я могу с уверенностью сказать - выбор между locking и non-blocking синхронизацией это выбор проблем с которыми ты готов иметь дело + ограничения накладываемые предметной областью.
Блокирующая синхронизация это про
+ простоту
+ отличную среднюю производительность
- дедлоки
- голодание
- livelock
- инверсию приоритетов.
- thundering herd
- lock convoy
Страшные слова, но с ними вполне можно работать. Единственный момент - в совокупности с вытесняющей многозадачностью блокировки не способны дать предсказуемый latency для худшего случая. Наша программа может работать очень быстро 99% времени, но в 1% времени у нас могут случаться всплески latency (просто так совпало). Для некоторого набора софта это вполне нормально и не несет проблем.
Неблокирующая синхронизация в свою очередь это:
+ "почти никогда" не простаиваем
+ гарантии прогресса
+ гарантии предсказуемого количества попыток.
- пляски с аллокациями
- retry storm
- aba problem
- очень сложный код, по сравнению с кодом на мьютексах
При этом бенмарки шепчут - алгоритмы на атомиках в среднем будут работать хуже. Больше работы с памятью, CAS циклы, синхронизация кешей CPU. Еще и код очень сложный.
Зачем тогда это всё? Ответ - неблокирующая синхронизация способна дать больше гарантий для latency худшего случая.
В медицине, запуске ракет, роботах, авиаиндустрии, ну и само собой разработке ОС и СУБД можно найти примеры процессов для которых важен предсказуемый по времени ответ и для которых минусы блокирующего подхода неприемлемы. И вот тут рассмотренные алгоритмы и структуры выходят на сцену. А то что в среднем работает медленнее не проблема, а трейдофф на который нужно идти.
Вот такие выводы получились, дополняйте, если что-то упустил.
На этом цикл завершаю, спасибо, что читали, надеюсь вам было интересно и полезно, буду рад почитать о ваших впечатлениях от материала в комментариях)
Post #467
1.01K
- ❤ 10
- 👍 4