linux下如何测量进程线程context switch花费的时间?

关注者
312
被浏览
12,189

6 个回答

线程和进程在内核的管理结构 task struct是一样的,切换的差别也只是是否刷新TLB,刷新TLB本身不费时,只是刷新后,TLB miss会比较影响性能,但这不能算在“切换”时间内。真正的切换时间只有寄存器的保持到内存中,并把将要执行的线程/进程的上下文从内存拷贝到寄存器中,就完成了一次切换,总之,非常快。

非超线程前提下,线程的切换时间,就是实际上内核中做进程切换所消耗的时间,这个时间很好算。直接在内核切换代码中两个时间点算就行了。超线程就算了,CPU 自己的行为, OS 无感知的,可能也就几个周期就过来了。

不好算的是进程切换,因为进程切换和线程切换步骤基本都是一样的,但是线程切换不会刷新 TLB。TLB 失效是进程切换主要的开销损耗。TLB 失效之后,你并不知道这次失效的影响什么时候才能收敛到最小。所以算线程切换,只能算一个平均效果时间:(总时间 - 除切换的运行时间)/ 切换次数。