В прошлом посте мы решали практическую задачку и использовали язык Go. Его основная особенность - наличие собственного рантайма в рамках которого происходит управление и планирование горутин - потоков исполнения не связанных явно 1к1 с потоками ОС.
А если у языка собственный рантайм и "собственные" потоки, то и должны быть "собственные" примитивы синхронизации, умеющие работать с горутинами. И они действительно есть. Основным примитивом синхронизации в Go является
sync.Mutex.У ребят из VictoriaMetrics получился великолепный разбор внутреннего устройства
sync.Mutex c красивыми иллюстрациями и кодом. Я бы не смог рассказать лучше, а пересказывать копируя материал не хочется. Тем более, что многие приемы и детали упоминал ранее, только в контексте POSIX. Поэтому советую освежить в памяти предыдущие посты цикла. Увидите, что многие идеи и оптимизации придуманные для ОС были использованы в рантайме Go. Уровень абстракции выше, а проблемы и вызовы такие же😊
Внутри вас ждёт:
- Внутреннее представление
sync.Mutex.- Как выглядят
Fast path и Slow path в sync.Mutex (в том числе в ассемблере).- Как
sync.Mutex пытается обеспечить справедливость и избегать голодания.- Как происходит
Unlock.https://victoriametrics.com/blog/go-sync-mutex/
-----
Если вам понравился пост, поддержите его реакциями и комментариями. Мне важно увидеть вашу обратную связь. Спасибо!
P.S. Следующая публикация вероятнее всего будет на Хабре, выпуск намечен на следующую неделю. Будем как в прошлый раз писать свои велосипеды в погоне за эталонными реализациями, оценивать результаты бенчмарками и профилями😊