2.3. Futex系统调用

Posted broler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.3. Futex系统调用相关的知识,希望对你有一定的参考价值。

futex

Futex是整个Linux内核中对用户程序性能至关重要的一环,用户端几乎所有需要陷入内核的锁都基于Futex实现。Futex实现的是一种根据内存地址内容来睡眠等待的机制,相当于将内核的调度系统以一个比较轻量级的接口的方式暴露给用户空间。
Futex的接口如下:

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

Futex的入口系统调用只有一个,但是在这一个API中同时包含多个不同的入口。最常用的两个操作是futex_wait和futex_wake,内部对应的操作是在futex_op参数中给出一个编号,在内核中有一个对应的函数实现,与socket系统调用入口类似。uaddr就是Futex要依赖的地址内容,在等待时需要指定val的值,这个值要与uaddr中的值一样才会让线程进入睡眠。futex_wake在有futex_wait的时候才有唤醒的意义,而futex_wait只在用户空间判断需要陷入内核时才被调用。调用这个函数的用户逻辑认为,当用户根据内容判断当前逻辑无法继续执行,需要陷入内核等待时,在发生实际等待之前,再进行一遍对内存值的判断,就能有效避免睡眠等待,这是一个典型的性能加速的逻辑。

futex_wake也是输入uaddr地址来进行唤醒的,Futex并没有给用户端的锁一个fd之类的handle,对应的等待对象都放在内核内部根据uaddr制作的哈希表中。等待会添加到哈希表的等待队列,唤醒会根据uaddr找到哈希表的等待队列,然后唤醒指定数量(val)的等待个数,需要特别注意的是,futex_wake即使将唤醒数量val指定为0,也最少会

以上是关于2.3. Futex系统调用的主要内容,如果未能解决你的问题,请参考以下文章

linux 内核的futex系统调用

内核中的 Futex 和阻塞

linux 内核的futex - requeue 以及 requeue-pi

Berkeley DB:由于先前在 c api 调用期间异常退出而卡在 futex_wait

v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码

FUTEX_SWAP补丁分析-SwitchTo 如何大幅度提升切换性能?