Provided by: manpages-ru_4.27.0-1_all 

НАИМЕНОВАНИЕ
futex - быстрая блокировка в пользовательском пространстве
ОБЗОР
#include <linux/futex.h>
ОПИСАНИЕ
Ядро Linux предоставляет фьютексы (futexes, «быстрые мьютексы (mutexes, взаимоисключающие блокировки) в
пользовательском пространстве») в качестве строительного блока для быстрой блокировки в пользовательском
пространстве и семафоров. Фьютексы очень просты и полезны для создания высокоуровневых абстракций
блокировок, таких как мьютексы, условных переменных, блокировок чтения-записи, барьеров и семафоров.
Большинство программистов, фактически, не используют фьютексы напрямую, а полагаются на системные
библиотеки, которые на них построены, такие как Native POSIX Thread Library (NPTL) (смотрите
pthreads(7)).
Фьютекс отождествляется с участком памяти, который может быть общим для процессов или нитей. В этих
процессах фьютекс может быть доступен по разным адресам. В своей основе фьютекс имеет семантику семафора;
это счётчик, который можно увеличивать и уменьшать атомарно; процессы могут ждать пока значение не станет
положительным.
Работа с фьютексом выполняется полностью в пользовательском пространстве при отсутствии конфликта
(noncontended case). Ядро привлекается только для разрешения конфликтов. Так как все проектные решения
стремятся к отсутствию конфликтов, фьютексы также оптимизированы под эту ситуацию.
В своей основе фьютекс — это целое число, которое изменяется только атомарными инструкциями ассемблера.
Это целое число размером 4 байта на всех платформах. Процессы могут совместно использовать это число
посредством mmap(2), сегментов общей памяти или общего пространства памяти (share memory space, в этом
случае приложение, обычно, называют многонитевым).
Поведение
Любое действие с фьютексом начинается в пользовательском пространстве, но может потребовать обращения к
ядру через системный вызов futex(2).
Для «установки» фьютекса выполняются соответствующие ассемблерные инструкции, которые заставляют ЦП
машины атомарно увеличить целое число. Далее проверяется, было ли действительно изменено значение с 0 на
1, то есть не было ожидающих и операция выполнена. Это бесконфликтный вариант, выполняется быстро и
должен возникать чаще всего.
При возникновении конфликта, атомарное увеличение изменяет счётчик с -1 (или другого отрицательного
числа). Это означает, что есть ожидающие. В пользовательском пространстве теперь нужно присвоить счётчику
1 и дать команду ядру пробудить всех ожидающих с помощью операции FUTEX_WAKE.
Ожидание фьютекса, его «сброс», является обратной операцией. Происходит атомарное уменьшение счётчика и
проверка того, стал ли он равен 0, то есть операция выполнена и фьютекс был неконфликтным. Во всех других
случаях, процесс должен присвоить счётчику -1 и запросить ядро об ожидании другого процесса,
устанавливающего фьютекс. Это выполняется с помощью операции FUTEX_WAIT.
В системном вызове futex(2) можно указать время ожидания, то есть как долго ядро должно ждать установку
фьютекса, В этом случае семантика более сложна и программисту нужно обратиться к futex(2). Это тоже самое
что и ожидания асинхронного фьютекса.
ВЕРСИИ
Впервые поддержка фьютексов появилась в Linux 2.5.7, но с другой семантикой. Текущая семантика
используется в Linux с версии 2.5.40.
ПРИМЕЧАНИЯ
Ещё раз повторим: в чистом виде фьютексы не являются лёгкой в использовании абстракцией для конечных
пользователей. Использующие их программисты должны иметь хороший запас знаний об ассемблере и уметь
читать исходный код библиотеки фьютексов для пользовательского пространства, указанной далее.
В этой справочной странице показано самое распространённое использование примитивов futex(2), которое ни
в коем случае не единственное.
СМОТРИТЕ ТАКЖЕ
clone(2), futex(2), get_robust_list(2), set_robust_list(2), set_tid_address(2), pthreads(7)
Fuss, Futexes and Furwocks: Быстрая блокировка на уровне пользователя в Linux (материалы Ottawa Linux
Symposium 2002), библиотека примеров фьютексов, futex-*.tar.bz2 https://mirrors.kernel.org/pub/linux
/kernel/people/.
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>,
Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов
<pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.9.1 2 мая 2024 г. futex(7)