我想知道在我的操作系统上进行上下文切换需要多长时间。有没有做到这一点的黑客?我可以用Java做,或者我需要本机代码(例如在C中)?不同线程的上下文切换是否不同?
答案 0 :(得分:3)
从用户空间进程中,您可以粗略估计运行多个线程/进程,每个线程/进程获得挂钟时钟(或处理器滴答,RTDSC
)的频率,对于某些线程/进程可能大量的时间,然后找到不同线程的测量之间的最小差异。并确保它们在同一核心运行。
可以通过使用互斥或条件变量的某种等待来获得另一个估计值,但这样可以显示线程/进程唤醒的性能。
在Java中,您可能会获得JVM的额外开销。
我想唯一可靠的方法是分析内核或者在内核文档中找到数字。
可能在尝试所有这些之前,你应该确定为什么你需要知道这样的事情。多线程/多进程应用程序的性能取决于许多因素,而上下文切换通常是次要的。
答案 1 :(得分:0)
如果要测量它的代码,那么写一点很容易。值得自己写一个,因为你会得到一个与你选择的语言等相关的答案。你应该能够用任何用线程和信号量的语言写出这样的东西。
您需要两个线程或两个进程。让其中一个记录一天中的高精度时间(这些天它需要好到几纳秒,这可能非常困难。它将取决于硬件/ OS /语言提供的内容)在共享缓冲区中然后发布一个信号量。应该编写您的其他线程或进程以等待该信号量。当它得到它时,它应该记录高精度的时间,并减去另一个线程/进程放入共享缓冲区的时间。
您可能希望测量线程和进程的上下文切换时间的原因是许多操作系统中的线程上下文切换时间小于进程的时间(对于Windows来说肯定是这样)。
您可以通过重复运行来优化答案并测量平均时间。您还可以类似地测量发布和获取信号量以从上下文切换时间中删除该组件所花费的时间。我不打扰那个,因为如果你担心上下文切换时间的影响,你可能也会关心导致上下文切换所花费的时间(比如发布一个信号量)。
我真的不知道这些天会有什么结果。我知道VxWorks在20世纪90年代在200MHz PowerPC芯片上实现了10us的上下文切换时间,那时候真的很快。
== EDIT ==
多核机器中的上下文切换可能是一个更加可变的东西。在单核心机器中,OS必须始终在每次运行不同的线程时切换执行上下文。但是在多核机器上,操作系统可以在内核之间分配线程,所以必然需要执行与上下文切换相关的所有内存事务(我实际上并不知道是否有任何操作系统那样做)。但鉴于线程/核心分布本身是一个非常可变的东西,取决于机器工作负载等,一个人的应用程序可能会遇到变化很大的CST,具体取决于用户是否正在移动鼠标等。
答案 2 :(得分:0)
只需多次致电sleep(0)
;观察总的经过时间;和分裂。在高优先级流程中执行此操作,以便始终自行安排下一个流程。