EMZETT.
Увійти

Futex: швидкі блокування в ядрі Linux

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

Докладніше: Блокування — число в пам’яті. Якщо воно вільне, потік бере його атомарною операцією, не питаючи ядро. Лише якщо воно зайняте, потік засинає системним викликом futex().

Подробиці

  • Швидкий шлях: Атомарне порівняння з обміном у просторі користувача, кілька наносекунд.
  • Повільний шлях: FUTEX_WAIT спить, доки значення не зміниться, FUTEX_WAKE будить тих, що чекають.
  • Користувачі: М’ютекси pthread, семафори й умовні змінні в glibc будуються на цьому.
  • Перевага: Неоспорювані блокування (звичайний випадок) майже нічого не коштують.
  • Пастки: Хибні пробудження, інверсія пріоритетів (з нею бореться успадкування пріоритетів) і справедливість.
  • Спостереження: strace показує багато викликів futex, якщо програма страждає від конкуренції за блокування. Див. strace.

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