我想分析同步操作,例如 Linux 中互斥量、信号量等的锁定和解锁。
我知道在内心深处,它们是使用 futexes 实现的,所以也许足以分析 futexes 的锁定和解锁(如果我在这里错了,请纠正我)。所以我的问题是如何分析它,因为 futex 操作通常发生在用户空间中。他们有什么工具可以让我对此进行分析吗?
我主要想知道锁定 futexes 的函数和频率。
最佳答案
您可能会对 valgrind 及其工具 callgrind 感兴趣。
valgrind --trace-children=yes --tool=callgrind -v ./program
它将在文件中生成详细的调用图,其中包括每个函数中传递的时间量。
然后您可以使用 kcachegrind 查看所有这些,这是一个很好的可视化数据的 UI。
kcachegrind
它将允许您查看调用 pthread_mutex_lock()(或其他函数)的所有函数,其中,最前面的函数,按时间百分比,......
callgrind 最相关的部分是你可以很容易地找到单线程程序中的瓶颈,因为你只需要查看占用最多 cpu 时间的函数。
在多线程程序中,一个函数等待某个东西(互斥量)很长时间是正常情况,因此比较困难。
您还可以使用 valgrind 的 Helgrind 工具,它有助于发现您使用互斥体时的错误(潜在的死锁或潜在的数据竞争)。
我猜它通过分析 Serializability 来分析您对同步函数的调用以及您读取/写入的数据,以检测潜在问题(可能发生超过 1000000 次的问题 1 次)。同步和数据访问的一致性。 (我重复一遍:我猜)。
valgrind --tool=helgrind --suppressions=$PWD/supp --gen-suppressions=yes --db-attach=yes --track-lockorders=no ./program
以及valgrind的核心特性:检查内存泄漏:
valgrind --leak-check=yes -v --db-attach=yes ./program
关于c - 分析 Linux 中的同步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7613304/