EMZETT.
Войти

Futex: быстрые блокировки в ядре Linux

Коротко: Futex («fast userspace mutex») — строительный блок Linux, благодаря которому блокировки в основном работают совсем без вызова ядра, а ядро подключается только при конкуренции.

Подробнее: Блокировка — число в памяти. Если она свободна, поток берёт её атомарной операцией, не спрашивая ядро. Только если она занята, поток засыпает системным вызовом futex().

Подробности

  • Быстрый путь: Атомарное сравнение с обменом в пользовательском пространстве, несколько наносекунд.
  • Медленный путь: FUTEX_WAIT спит, пока значение не изменится, FUTEX_WAKE будит ждущих.
  • Пользователи: Мьютексы pthread, семафоры и условные переменные в glibc строятся на этом.
  • Преимущество: Неоспариваемые блокировки (обычный случай) почти ничего не стоят.
  • Ловушки: Ложные пробуждения, инверсия приоритетов (с ней борется наследование приоритетов) и справедливость.
  • Наблюдение: strace показывает много вызовов futex, если программа страдает от конкуренции за блокировки. См. strace.

См. также: Семафор