FUTEX - Linux手册页

时间:2019-08-20 18:01:53  来源:igfitidea点击:

Linux程序员手册 第7部分
更新日期: 2017-09-15

名称

futex-快速的用户空间锁定

语法

#include <linux/futex.h>

说明

Linux内核提供了futex("快速用户空间互斥体")作为快速用户空间锁定和信号灯的构建块。 Futex非常基础,可以很好地用于构建更高级别的锁定抽象,例如互斥锁,条件变量,读写锁,障碍和信号灯。

实际上,大多数程序员不会直接使用futex,而将依赖于基于它们构建的系统库,例如本机POSIX线程库(NPTL)(请参阅pthreads(7))。

futex由一块内存标识,该内存可以在进程或线程之间共享。在这些不同的过程中,futex不必具有相同的地址。 futex以其裸露的形式具有信号量语义。它是一个可以原子递增和递减的计数器;流程可以等待该值变为正值。

对于非竞争情况,Futex操作完全在用户空间中发生。内核仅涉及仲裁争端。由于任何理智的设计都将努力争取不争夺,因此也针对这种情况对烟囱进行了优化。

futex以其裸露的形式是一个对齐的整数,仅原子汇编指令会对其进行触摸。在所有平台上,此整数都是四个字节长。进程可以使用mmap(2),通过共享的内存段或由于它们共享内存空间来共享此整数,在这种情况下,应用程序通常称为多线程。

Semantics

任何futex操作都在用户空间中启动,但是可能有必要使用futex(2)系统调用与内核进行通信。

要"启动" futex,请执行适当的汇编程序指令,这将使主机CPU自动增加整数。然后,检查它是否实际上已从0更改为1,在这种情况下,没有服务员,操作就完成了。这是一种无争议的情况,速度很快,应该很常见。

在有争议的情况下,原子增量将计数器从-1(或其他负数)更改。如果检测到此情况,则有服务员。用户空间现在应将计数器设置为1,并指示内核使用FUTEX_WAKE操作唤醒所有等待程序。

等待一个" futex"以使其"下降"是相反的操作。以原子方式递减计数器,并检查其是否更改为0,在这种情况下,操作已完成且futex不竞争。在所有其他情况下,该进程应将计数器设置为-1,并请求内核等待另一个进程启动该futex。这是使用FUTEX_WAIT操作完成的。

可选地,可以将futex(2)系统调用传递给超时,该超时指定内核等待futex更新的时间。在这种情况下,语义更加复杂,程序员可以参考futex(2)以获得更多详细信息。异步futex等待也是如此。

版本

最初的futex支持在Linux 2.5.7中进行了合并,但语义与上述不同。从Linux 2.5.40开始可以使用当前的语义。

备注

重申一下,裸露的熔体不打算作为最终用户的易于使用的抽象。期望实现者具有汇编知识,并已阅读下面引用的futex用户空间库的源代码。

该手册页说明了futex(2)基元的最常见用法;它绝不是唯一的。

另外参见

clone(2),futex(2),get_robust_list(2),set_robust_list(2),set_tid_address(2),pthreads(7)

Fuss,Futex和Furwocks:Linux中的快速用户级锁定(渥太华Linux专题讨论会2002的成果),futex示例库,futex-*。tar.bz2

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/