其工作原理很简单,两个进程互相通过 pipe 拼命地发 1000000 个整数,进程 A 发给 B,同时 B 发给 A。因为 A 和 B 互相依赖,因此假如调度器不公平,对 A 比 B 好,那么 A 和 B 整体所需要的时间就会更长。
al@al-System-Product-Name:~/perf$ perf bench sched pipe
# Running \'sched/pipe\' benchmark:
# Executed 1000000 pipe operations between two processes
Total time: 12.240 [sec]
12.240411 usecs/op
81696 ops/sec
该测试衡量 不同版本的memcpy/memset/ 函数处理一个 1M 数据的所花费的时间,转换成吞吐率。
al@al-System-Product-Name:~/perf$ perf bench mem all
# Running mem/memcpy benchmark...
# function \'default\' (Default memcpy() provided by glibc)
# Copying 1MB bytes ...
1.236155 GB/sec.
..
3.4.3 perf bench futexFutex是一种用户态和内核态混合机制,所以需要两个部分合作完成,linux上提供了sys_futex系统调用,对进程竞争情况下的同步处理提供支持。
所有的futex同步操作都应该从用户空间开始,首先创建一个futex同步变量,也就是位于共享内存的一个整型计数器。