Введение
Системный вызов ядра
В вычислительной технике futex (сокращение от "fast userspace mutex") — это системный вызов ядра, который программисты могут использовать для реализации базовой блокировки или в качестве строительного блока для более сложных механизмов блокировки, таких как семафоры, POSIX мьютексы или условные переменные. Futex состоит из очереди ожидания в пространстве ядра, привязанной к атомарному целому числу в пользовательском пространстве. Несколько процессов или потоков оперируют с этим целым числом полностью в пользовательском пространстве (используя атомарные операции, чтобы избежать взаимных помех) и обращаются к относительно дорогим системным вызовам только для выполнения операций с очередью ожидания (например, для пробуждения ожидающих процессов или добавления текущего процесса в очередь ожидания). Правильно реализованная блокировка на основе futex не будет использовать системные вызовы, кроме случаев возникновения конфликта; поскольку большинство операций не требуют разрешения конфликтов между процессами, это происходит нечасто.
In computing, a futex (short for "fast userspace mutex") is a kernel system call that programmers can use to implement basic locking, or as a building block for higher level locking abstractions such as semaphores and POSIX mutexes or condition variables. A futex consists of a kernel space wait queue that is attached to an atomic integer in userspace. Multiple processes or threads operate on the integer entirely in userspace (using atomic operations to avoid interfering with one another), and only resort to relatively expensive system calls to request operations on the wait queue (for example to wake up waiting processes, or to put the current process on the wait queue). A properly programmed futex based lock will not use system calls except when the lock has contention; since most operations do not require arbitration between processes, this will not happen in most cases.
История
Хьюбертус Франке (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.