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