问题标签 [futex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 为什么 pthread 互斥锁被认为比 futex 慢?
为什么 POSIX 互斥锁被认为比 futexes 更重或更慢?pthread 互斥锁类型的开销来自哪里?我听说 pthread 互斥体是基于 futexes 的,当没有争议时,不要对内核进行任何调用。看起来 pthread 互斥锁只是围绕 futex 的“包装器”。
是否只是函数包装调用中的开销以及互斥函数“设置” futex 的需要(即,基本上是为 pthread 互斥函数调用设置堆栈)?或者 pthread 互斥体是否发生了一些额外的内存屏障步骤?
mutex - 使用 futex 实现互斥量和条件变量
我已经使用 futex 系统调用实现了互斥量和条件变量。我相信我的实现是正确的,但希望得到其他人的验证。如果你们中的一些人可以验证它的正确性,那将是一个很大的帮助。
任何有关进一步改进互斥锁和连接变量性能的建议也将不胜感激。
谢谢
苏丹舒
c - Linux futex syscall 虚假唤醒,返回值为 0?
我遇到了 Linuxfutex
系统调用(FUTEX_WAIT
操作)的问题,有时似乎无缘无故地提前返回。文档指定了可能导致它提前返回(没有 a FUTEX_WAKE
)的某些条件,但这些都涉及非零返回值:EAGAIN
如果 futex 地址处的值不匹配,则ETIMEDOUT
for timed 等待超时,EINTR
当被 a (非重新启动)信号等。但我看到返回值为 0。除了指针指向 futexFUTEX_WAKE
的线程的终止或终止之外,还有什么可能导致返回值为 0 的返回?set_tid_address
FUTEX_WAIT
如果它有用,我正在等待的特定 futex 是线程 tid 地址(由clone
系统调用设置CLONE_CHILD_CLEARTID
),并且线程没有终止。我的(显然是不正确的)假设FUTEX_WAIT
返回 0 的操作只能在线程终止导致程序逻辑中的严重错误时发生,我已经通过循环和重试来修复它,即使它返回 0,但现在我很好奇为什么会这样。
这是一个最小的测试用例:
让它运行一段时间,它最终应该以Killed
( ) 终止,这只有在返回SIGKILL
时线程仍然存在的情况下才有可能。FUTEX_WAIT
在任何人假设这只是内核在完成销毁线程之前唤醒 futex(这实际上可能发生在我的最小测试用例中)之前,请注意,在我的原始代码中,我实际上观察到用户空间代码在线程中运行FUTEX_WAIT
回来后很好。
kernel - Futex 代码演练 - 返回 EFAULT
在futex_wake_op function
Linux 内核源代码中的 futex.c 中,我试图了解控件是如何到达这一点的。这发生在上述函数中,futex_atomic_op_inuser
返回 -EFAULT,但它uaddr2
是可写的。
但是从 的来源,futex_atomic_op_inuser
我看到它仅在 上返回 -EFAULT if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
。
futex_atomic_op_inuser
反过来调用__futex_atomic_op
宏,我在代码中看到 -EFAULT 但我被告知 EFAULT 的路径不涉及调用__futex_atomic_op
控制如何达到上述点(即if (!fshared)goto retry_private ;)then?
提前致谢!
c - 条件变量的延迟 bcast 唤醒 - 它有效吗?
我正在实现 pthread 条件变量(基于 Linux futexes),并且我有一个想法来避免pthread_cond_broadcast
进程共享条件变量的“踩踏效应”。对于非进程共享的 cond var,futex 重新排队操作传统上(即通过 NPTL)用于将等待者从 cond var 的 futex 重新排队到 mutex 的 futex 而不唤醒它们,但这对于进程共享的 cond var 通常是不可能的,因为pthread_cond_broadcast
可能没有指向关联互斥体的有效指针。在最坏的情况下,互斥锁甚至可能不会映射到其内存空间中。
我克服这个问题的想法是pthread_cond_broadcast
只直接唤醒一个服务员,并让该服务员在唤醒时执行重新排队操作,因为它确实具有指向互斥锁的所需指针。
如果我采用这种方法,自然有很多丑陋的竞争条件需要考虑,但是如果可以克服它们,是否还有其他原因导致这种实现无效或不受欢迎?我能想到的一个可能无法克服的潜在问题是负责重新排队的服务员(一个单独的进程)在它可以采取行动之前被杀死的竞争,但是通过放置 condvar 甚至可以克服这个问题futex 在健壮的互斥列表中,以便内核在进程死亡时对其执行唤醒。
c - Linux 中的分析同步操作
我想分析同步操作,例如 Linux 中互斥锁、信号量等的锁定和解锁。
我知道在内心深处它们是使用 futexes 实现的,所以也许对 futexes 的锁定和解锁进行分析就足够了(如果我在这里错了,请纠正我)。所以我的问题是如何分析它,因为 futex 操作通常发生在用户空间中。他们有任何工具可以让我对此进行分析吗?
我基本上对了解锁定 futex 和频率的功能很感兴趣。
perl - Apache mod_perl 进程挂在 futex_wait 状态
我运行一个相当流行的基于浏览器的网页游戏,在 Apache (worker) 和 mod_perl 下运行。在高峰时间,当服务器每分钟处理大约 4200 个请求时,每 3-15 分钟左右一次,Apache 进程将挂起。
我已经确定这些进程陷入“FUTEX_WAIT”状态,并且似乎没有做任何事情:它们不会消耗 CPU 或在 RAM 中变得更大。但这是一个严重的问题,因为它们只是坐在那里,占用 RAM。
我当前的解决方案是一个 cron 作业,它剔除卡在 futex_wait_queue_me 中的 Apache 进程。但这并不是很好,因为碰巧等待来自挂起的 Apache 进程的响应的用户会收到错误(500:服务器关闭连接而没有发回数据)。
我无法在我的开发机器上重现该问题,并且无法弄清楚如何进行故障排除。我很想知道:我该如何进一步诊断?
编辑:我发现问题发生在流量激增之后,当 Apache 产生更多的工作进程,然后尝试剔除它们。从孩子的角度来看,这是正常工作时的样子:
...但偶尔会这样:
...并且不再继续。
我不知道如何进一步调试。
c++ - 我将如何使用 futex 实现此方法?
这个方法(我意识到这个函数可能需要一些额外的参数):
java - 玩!框架在编译时挂起,没有报告错误
刚刚将我的应用程序移至新的 CentOS 服务器。折腾了半天,还是不能玩编译或者报错。shell 输出将显示最后一个文件编译然后挂起。我正在运行 Scala 0.9.1 模块。
我做了一个strace
过程,这就是我得到的。不确定它是否有帮助。
对原因有什么想法吗?或者我可以从哪里开始故障排除?
谢谢。
linux - 在 Linux 上克隆线程后 fclose 挂起
在全局文件描述符上调用 fclose 时,程序挂起。
它发生在克隆创建的几个线程退出之后。
下面是顺序:
非线程处理fid。
从 strace 开始,程序挂在 futex 中等待“main_arena”。我认为这应该是 glibc 中的一些互斥锁。
回溯:
这发生在使用 glibc 2.5 的 Linux 上,但不会在使用 glibc 2.12 的 Linux 上发生。
我想知道是否是因为我们不能像这样使用 clone() 创建线程。在 NPTL 中,还做了很多事情,比如 set_robust_futex() 和设置线程本地存储。
谢谢!