Futex: быстрые блокировки в ядре Linux
Коротко: Futex («fast userspace mutex») — строительный блок Linux, благодаря которому блокировки в основном работают совсем без вызова ядра, а ядро подключается только при конкуренции.
Подробнее: Блокировка — число в памяти. Если она свободна, поток берёт её атомарной операцией, не спрашивая ядро. Только если она занята, поток засыпает системным вызовом futex().
Подробности
- Быстрый путь: Атомарное сравнение с обменом в пользовательском пространстве, несколько наносекунд.
- Медленный путь:
FUTEX_WAITспит, пока значение не изменится,FUTEX_WAKEбудит ждущих. - Пользователи: Мьютексы pthread, семафоры и условные переменные в glibc строятся на этом.
- Преимущество: Неоспариваемые блокировки (обычный случай) почти ничего не стоят.
- Ловушки: Ложные пробуждения, инверсия приоритетов (с ней борется наследование приоритетов) и справедливость.
- Наблюдение:
straceпоказывает много вызововfutex, если программа страдает от конкуренции за блокировки. См. strace.
См. также: Семафор