The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Интерактивная система просмотра системных руководств (man-ов)

 ТемаНаборКатегория 
 
 [Cписок руководств | Печать]

futex ()
  • >> futex (2) ( Русские man: Системные вызовы )
  • futex (2) ( Linux man: Системные вызовы )
  • futex (4) ( Русские man: Специальные файлы /dev/* )
  • futex (4) ( Linux man: Специальные файлы /dev/* )
  • futex (7) ( Linux man: Макропакеты и соглашения )
  •  

    НАЗВАНИЕ

    futex - системный вызов быстрых связей пространства пользователя  

    СИНТАКСИС

    #include <linux/futex.h>

    #include <sys/time.h>

    int sys_futex (void *futex, int op, int val, const struct timespec *timeout);  

    ОПИСАНИЕ

    Системный вызов sys_futex обеспечивает программный метод для ожидания изменения значения указанного адреса памяти и метод пробуждения всех ожидающих на определенном адресе (хотя адреса для одного и того же участка памяти в разных процессах могут быть не идентичны, ядро распределяет их внутренне так, что один участок памяти, распределенный разными методами, будет соответствовать одинм вызовам sys_futex). Обычно это используется для реализации случаев споров за блокировку разделяемой памяти, как это описано в futex(4).

    Когда операции futex(4) заканчиваются без завершения спора в пространстве пользователя, должен быть сделан вызов к ядру для выноса решения. Вынос решения может означать как усыпление вызывающего процесса, так и наоборот - пробуждение ожидающего процесса.

    Вызывающие эту функцию должны твердо придерживаться семантики, описанной в futex(4). Так как эта семантика приводит к созданию непортируемых инструкций ассемблера, то фактически это приведет к тому, что большинство использующих их пользователей станут авторами библиотек, а не создателями программ.

    Аргумент futex должен указывать на выровненное целое, хранящее счетчик. Операция для исполнения передается через параметр op вместе со значением val.

    В данный момент определены три операции:

    FUTEX_WAIT
    Эта операция автоматически проверяет, что адрес футекса все еще содержит заданное значение, и спит в ожидании FUTEX_WAKE на этом адресе футекса. Если аргумент timeout не равен NULL, то его содержимое описывает максимальную задержку ожидания, иначе это время бесконечно. По futex(4) этот вызов исполняется, если уменьшение счетчика дает отрицательное значение (указывая на наличие спора), или будет спать, пока другой процесс не освободит футекс и не исполнит операцию FUTEX_WAKE.
    FUTEX_WAKE
    Эта операция пробуждает по большей части val процессов, ожидающих на этом адресе футекса (т.е. внутри FUTEX_WAIT). По futex(4) этот вызов исполняется, если увеличение счетчика показало, что есть ожидающие, как только значение футекса стало равным 1 (обозначая что есть доступные ожидающие).
    FUTEX_FD
    Для поддержки асинхронных пробуждений эта операция ассоциирует описатель файла с футексом. Если другой процесс исполняет FUTEX_WAKE, то процесс будет получать номер сигнала, переданный в val. Вызывающий процесс должен закрыт возвращаемый описатель файла после использования.

    Для предотвращения создания условий спора, вызывающие должны проверять, не был ли футекс увеличен после возврата FUTEX_FD.

     

    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

    В зависимости от исполняемой операции возвращаемые значения могут иметь разные смысловые значения.

    FUTEX_WAIT
    Возвращает 0, если процесс был пробужден вызовом FUTEX_WAKE. В случаем истечения срока таймера возвращается ETIMEDOUT. Если футекс не был эквивалентен ожидаемому значению, то операция возвращает EWOULDBLOCK. Сигналы (или другие ложные срабатывания) приводят FUTEX_WAIT к возврату EINTR.
    FUTEX_WAKE
    Возвращает число пробужденных процессов.
    FUTEX_FD
    Возвращает новый описатель файлов, ассоциированный с футексом.
     

    ЗАМЕЧАНИЯ

    Еще раз повторим: в чистом виде футексы не являются легкой в использовании абстракцией для конечных пользователей. Реализующие их программисты должны иметь хороший запас знаний о структуре футексов, также желательно изучить указанные в приложении документы.  

    АВТОРЫ

    Футексы были разработаны Hubertus Franke (IBM Thomas J. Watson Research Center), Matthew Kirkwood, Ingo Molnar (Red Hat) и Rusty Russell (IBM Linux Technology Center). Данное руководство создано Bert Hubert.  

    ВЕРСИИ

    Начальная поддержка футексов была встроена в Linux 2.5.7, но с другой семантикой, отличающейся от описанной выше. Данная семантика доступна, начиная с ядер Linux 2.5.40.  

    СМ. ТАКЖЕ

    futex(4), работу `Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux' (записки с Симпозиума Linux в Оттаве 2002), библиотеку примеров футексов futex-*.tar.bz2 <URL:ftp://ftp.kernel.org:/pub/linux/kernel/people/rusty/>.


     

    Index

    НАЗВАНИЕ
    СИНТАКСИС
    ОПИСАНИЕ
    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
    ЗАМЕЧАНИЯ
    АВТОРЫ
    ВЕРСИИ
    СМ. ТАКЖЕ


    Поиск по тексту MAN-ов: 




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру