#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_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/>.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |