.\" -*- coding: UTF-8 -*-
.\" This manpage has been automatically generated by docbook2man
.\" from a DocBook document. This tool can be found at:
.\"
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
.\"
.\" SPDX-License-Identifier: MIT
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH futex 7 "2 мая 2024 г." "Linux man\-pages 6.8"
.SH ИМЯ
futex \- быстрая блокировка в пользовательском пространстве
.SH СИНТАКСИС
.nf
\fB#include \fP
.fi
.SH ОПИСАНИЕ
Ядро Linux предоставляет фьютексы (futexes, «быстрые мьютексы (mutexes,
взаимоисключающие блокировки) в пользовательском пространстве») в качестве
строительного блока для быстрой блокировки в пользовательском пространстве и
семафоров. Фьютексы очень просты и полезны для создания высокоуровневых
абстракций блокировок, таких как мьютексы, условных переменных, блокировок
чтения\-записи, барьеров и семафоров.
.P
Большинство программистов, фактически, не используют фьютексы напрямую, а
полагаются на системные библиотеки, которые на них построены, такие как
Native POSIX Thread Library (NPTL) (смотрите \fBpthreads\fP(7)).
.P
Фьютекс отождествляется с участком памяти, который может быть общим для
процессов или нитей. В этих процессах фьютекс может быть доступен по разным
адресам. В своей основе фьютекс имеет семантику семафора; это счётчик,
который можно увеличивать и уменьшать атомарно; процессы могут ждать пока
значение не станет положительным.
.P
Работа с фьютексом выполняется полностью в пользовательском пространстве при
отсутствии конфликта (noncontended case). Ядро привлекается только для
разрешения конфликтов. Так как все проектные решения стремятся к отсутствию
конфликтов, фьютексы также оптимизированы под эту ситуацию.
.P
В своей основе фьютекс — это целое число, которое изменяется только
атомарными инструкциями ассемблера. Это целое число размером 4 байта на всех
платформах. Процессы могут совместно использовать это число посредством
\fBmmap\fP(2), сегментов общей памяти или общего пространства памяти (share
memory space, в этом случае приложение, обычно, называют многонитевым).
.SS Поведение
Любое действие с фьютексом начинается в пользовательском пространстве, но
может потребовать обращения к ядру через системный вызов \fBfutex\fP(2).
.P
Для «установки» фьютекса выполняются соответствующие ассемблерные
инструкции, которые заставляют ЦП машины атомарно увеличить целое
число. Далее проверяется, было ли действительно изменено значение с 0 на 1,
то есть не было ожидающих и операция выполнена. Это бесконфликтный вариант,
выполняется быстро и должен возникать чаще всего.
.P
При возникновении конфликта, атомарное увеличение изменяет счётчик с \-1 (или
другого отрицательного числа). Это означает, что есть ожидающие. В
пользовательском пространстве теперь нужно присвоить счётчику 1 и дать
команду ядру пробудить всех ожидающих с помощью операции \fBFUTEX_WAKE\fP.
.P
Ожидание фьютекса, его «сброс», является обратной операцией. Происходит
атомарное уменьшение счётчика и проверка того, стал ли он равен 0, то есть
операция выполнена и фьютекс был неконфликтным. Во всех других случаях,
процесс должен присвоить счётчику \-1 и запросить ядро об ожидании другого
процесса, устанавливающего фьютекс. Это выполняется с помощью операции
\fBFUTEX_WAIT\fP.
.P
В системном вызове \fBfutex\fP(2) можно указать время ожидания, то есть как
долго ядро должно ждать установку фьютекса, В этом случае семантика более
сложна и программисту нужно обратиться к \fBfutex\fP(2). Это тоже самое что и
ожидания асинхронного фьютекса.
.SH ВЕРСИИ
Впервые поддержка фьютексов появилась в Linux 2.5.7, но с другой
семантикой. Текущая семантика используется в Linux с версии 2.5.40.
.SH ПРИМЕЧАНИЯ
Ещё раз повторим: в чистом виде фьютексы не являются лёгкой в использовании
абстракцией для конечных пользователей. Использующие их программисты должны
иметь хороший запас знаний об ассемблере и уметь читать исходный код
библиотеки фьютексов для пользовательского пространства, указанной далее.
.P
.\" .SH AUTHORS
.\" .P
.\" Futexes were designed and worked on by Hubertus Franke
.\" (IBM Thomas J. Watson Research Center),
.\" Matthew Kirkwood, Ingo Molnar (Red Hat) and
.\" Rusty Russell (IBM Linux Technology Center).
.\" This page written by bert hubert.
В этой справочной странице показано самое распространённое использование
примитивов \fBfutex\fP(2), которое ни в коем случае не единственное.
.SH "СМОТРИТЕ ТАКЖЕ"
\fBclone\fP(2), \fBfutex\fP(2), \fBget_robust_list\fP(2), \fBset_robust_list\fP(2),
\fBset_tid_address\fP(2), \fBpthreads\fP(7)
.P
\fIFuss, Futexes and Furwocks: Fast Userlevel Locking in Linux\fP (proceedings
of the Ottawa Linux Symposium 2002), futex example library, futex\-*.tar.bz2
.UR https://mirrors.kernel.org\:/pub\:/linux\:/kernel\:/people\:/rusty/
.UE .
.PP
.SH ПЕРЕВОД
Русский перевод этой страницы руководства разработал
Azamat Hackimov ,
Dmitry Bolkhovskikh ,
Yuri Kozlov
и
Иван Павлов
.
.PP
Этот перевод является свободной программной документацией; он распространяется
на условиях общедоступной лицензии GNU (GNU General Public License - GPL,
.UR https://www.gnu.org/licenses/gpl-3.0.html
.UE
версии 3 или более поздней) в отношении
авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
.PP
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста,
сообщите об этом разработчику по его адресу электронной почты или по адресу
.MT
списка рассылки русских переводчиков
.ME .