futex() - Unix,Linux系统调用
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于TP  

futex() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

futex - 快速用户空间锁定系统调用

概要

#include <linux/futex.h>

#include <sys/time.h>

int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);

描述

futex() 系统调用提供了一种方法,允许程序等待给定地址的值发生变化,以及唤醒等待特定地址的任何进程的方法(虽然不同进程中相同内存的地址可能不相等,但内核会在内部映射它们,因此在不同位置映射的相同内存对于futex() 调用将对应)。正如futex(7)中所述,它通常用于实现共享内存中锁的竞争情况。

futex(7)操作未在用户空间无竞争地完成时,需要调用内核进行仲裁。仲裁可以意味着使调用进程休眠,或者相反,唤醒等待进程。

此函数的调用者应遵守futex(7)中规定的语义。由于这些语义涉及编写非便携式汇编指令,这反过来可能意味着大多数用户实际上是库作者,而不是一般的应用程序开发人员。

uaddr 参数需要指向一个存储计数器的对齐整数。要执行的操作通过op 参数传递,以及一个值val

目前定义了五个操作

标签描述
FUTEX_WAIT
 此操作会原子地验证 futex 地址uaddr 是否仍然包含值val,并在等待此 futex 地址上的 FUTEX_WAKE 时休眠。如果timeout 参数非空,则其内容描述等待的最大持续时间,否则为无限期等待。参数uaddr2val3 被忽略。

对于futex(7),如果递减计数得到负值(表示竞争),则执行此调用,并将休眠直到另一个进程释放 futex 并执行 FUTEX_WAKE 操作。

FUTEX_WAKE 此操作最多唤醒val 个等待此 futex 地址(即在 FUTEX_WAIT 内部)的进程。参数timeoutuaddr2val3 被忽略。

对于futex(7),如果递增计数显示有等待者,则在 futex 值设置为 1(表示可用)后执行此操作。

FUTEX_FD 为了支持异步唤醒,此操作将文件描述符与 futex 关联。如果另一个进程执行 FUTEX_WAKE,则该进程将接收在val中传递的信号编号。调用进程必须在使用后关闭返回的文件描述符。

为了防止竞争条件,调用者应该在 FUTEX_FD 返回后测试 futex 是否已增加。

FUTEX_REQUEUE(自 Linux 2.5.70 起)为了避免使用 FUTEX_WAKE 时出现“惊群效应”(thundering herd effect),并需要获取另一个 futex 的所有唤醒进程,引入了此操作。此调用唤醒val 个进程,并将所有其他等待者重新排队到地址uaddr2 上的 futex。
FUTEX_CMP_REQUEUE(自 Linux 2.6.7 起)FUTEX_REQUEUE 的预期用途存在竞争,因此引入了 FUTEX_CMP_REQUEUE。这类似于 FUTEX_REQUEUE,但首先检查位置uaddr 是否仍然包含值val3。如果不是,则返回错误 EAGAIN。

返回值

根据执行的操作,返回值可能具有不同的含义。

标签描述
FUTEX_WAIT 如果进程被 FUTEX_WAKE 调用唤醒,则返回 0。超时的情况下,返回 ETIMEDOUT。如果 futex 不等于预期值,则操作返回 EWOULDBLOCK。信号(或其他虚假唤醒)导致 FUTEX_WAIT 返回 EINTR。
FUTEX_WAKE 返回唤醒的进程数。
FUTEX_FD 返回与 futex 关联的新文件描述符。
FUTEX_REQUEUE 返回唤醒的进程数。
FUTEX_CMP_REQUEUE 返回唤醒的进程数。

错误

错误代码描述
EACCES 没有对 futex 内存的读取访问权限。
EAGAIN FUTEX_CMP_REQUEUE 发现 futex 值意外。(这可能表示竞争;现在使用安全的 FUTEX_WAKE。)
EFAULT 从用户空间获取timeout 信息时出错。
EINVAL 未定义操作或页面对齐错误。
ENFILE 已达到打开文件的系统总数限制。

备注

需要重申的是,裸 futex 并非旨在作为面向最终用户的易于使用的抽象。预期实现者精通汇编语言,并阅读过下面引用的 futex 用户空间库的源代码。

版本

最初的 futex 支持合并到 Linux 2.5.7 中,但语义与上述描述不同。具有此处给定语义的 4 参数系统调用是在 Linux 2.5.40 中引入的。在 Linux 2.5.70 中添加了一个参数。在 Linux 2.6.7 中添加了第六个参数——混乱,尤其是在 s390 架构上。

符合标准

此系统调用是 Minux 特定的。



previous next Printer Friendly

广告


  

广告



广告