Введение

Системный вызов ядра
В вычислительной технике futex (сокращение от "fast userspace mutex") — это системный вызов ядра, который программисты могут использовать для реализации базовой блокировки или в качестве строительного блока для более сложных механизмов блокировки, таких как семафоры, POSIX мьютексы или условные переменные. Futex состоит из очереди ожидания в пространстве ядра, привязанной к атомарному целому числу в пользовательском пространстве. Несколько процессов или потоков оперируют с этим целым числом полностью в пользовательском пространстве (используя атомарные операции, чтобы избежать взаимных помех) и обращаются к относительно дорогим системным вызовам только для выполнения операций с очередью ожидания (например, для пробуждения ожидающих процессов или добавления текущего процесса в очередь ожидания). Правильно реализованная блокировка на основе futex не будет использовать системные вызовы, кроме случаев возникновения конфликта; поскольку большинство операций не требуют разрешения конфликтов между процессами, это происходит нечасто.

История

Хьюбертус Франке (IBM Thomas J. Watson Research Center), Мэтью Кирквуд, Инго Молнар (Red Hat) и Расти Рассел (IBM Linux Technology Center) разработали механизм futex в Linux в 2002 году. В том же году обсуждалось предложение сделать futex доступным через файловую систему, создав специальный узел в /dev или /proc. Однако Линус Торвальдс категорически возражал против этой идеи и отклонил все связанные с ней патчи. Футексы впервые появились в версии 2.5.7 серии разработки ядра Linux; их семантика стабилизировалась с версии 2.5.40, а футексы стали частью основной ветки ядра Linux с выходом стабильной серии 2.6.x в декабре 2003 года. Функциональность futex была реализована в Microsoft Windows начиная с Windows 8 или Windows Server 2012 под названием WaitOnAddress. В 2013 году Microsoft запатентовала WaitOnAddress, связанный с futex, а патент был выдан в 2014 году. В мае 2014 года система CVE сообщила об обнаруженной уязвимости в подсистеме futex ядра Linux, которая позволяла проводить DoS-атаки (отказ в обслуживании) или повышать локальные привилегии. В мае 2015 года в ядре Linux был представлен баг, приводящий к взаимоблокировке (deadlock) через коммит b0c29f79ecea, что вызывало зависание пользовательских приложений. Этот баг затронул многие корпоративные дистрибутивы Linux, включая ядра 3.x и 4.x, Red Hat Enterprise Linux версий 5, 6 и 7, SUSE Linux 12 и Amazon Linux. Футексы были реализованы в OpenBSD с 2016 года. Механизм futex является одной из ключевых концепций ядра Zircon в операционной системе Fuchsia от Google, по крайней мере, начиная с апреля 2018 года. Apple внедрила futex в iOS/iPadOS/tvOS 17.4, macOS 14.4, watchOS 10.4 и visionOS 1.1.