【问题标题】:How can I discover how long does it take to do a context switch on my operating system?我怎样才能知道在我的操作系统上进行上下文切换需要多长时间?
【发布时间】:2014-01-19 09:14:34
【问题描述】:

我想知道在我的操作系统上进行上下文切换需要多长时间。有没有办法做到这一点?我可以用 Java 来做,还是需要本机代码(例如 C 语言)?不同线程的上下文切换是否不同?

【问题讨论】:

  • 你的意思是CPU从执行用户代码到执行内核代码需要多长时间?或者调度程序多久从一项任务切换到另一项?或者操作系统暂停一个任务并重新运行其运行队列中的下一个任务需要多少时间?
  • @mcleod_ideafix 我的意思绝对是最后一个“操作系统挂起任务并重新运行其运行队列中的下一个任务需要多少时间?”因为是程序看到的有效时间!
  • 这个盒子是否超载,即。它有比核心更多的就绪线程吗?新线程是否在不同的进程中?需要重新加载多少缓存?如果盒子是安静的、相同的进程并且没有缓存加载,则通过发出信号来运行另一个线程,这在我的 Vista 盒子上大约需要 5-7 微秒。其他常见情况需要更长的时间。
  • @MartinJames 所以你的意思是没有这样的代码可以做到这一点,我只能使用 10 微秒作为经验法则!
  • 嗯,这就是我的盒子上那个场景需要多长时间 - 这是我唯一计时的。由驱动程序准备好的线程显然需要更长的时间,因为驱动程序必须首先运行它的代码。由于内核间硬件信号,通过抢占运行在不同内核上的另一个线程来运行的线程将花费更长的时间。这一切都有些不同。

标签: java c multithreading operating-system context-switch


【解决方案1】:

很容易写一些代码来衡量它。值得自己写一个,因为您将获得与您选择的语言等相关的答案。您应该能够用任何执行线程和信号量的语言编写这样的东西。

您需要两个线程或两个进程。让其中一个人在共享缓冲区中记录一天中的高精度时间(这些天它需要精确到纳秒,这可能非常困难。这将取决于硬件/操作系统/语言提供的内容),然后发布信号量。您的其他线程或进程应该被写入等待该信号量。当它得到它时,它也应该记录一天中的高精度时间,并减去其他线程/进程放入共享缓冲区的时间。

您可能想要测量线程和进程的上下文切换时间的原因是,许多操作系统中的线程上下文切换时间比进程短(Windows 肯定如此)。

您可以通过重复运行来优化答案并测量平均时间。您还可以类似地测量发布所需的时间,并使用信号量从上下文切换时间中删除该组件。我不会为此烦恼,因为如果您担心上下文切换时间的影响,您可能还会关心导致上下文切换(例如发布信号量)所花费的时间。

我真的不知道这些天会发生什么结果。我知道早在 1990 年代,VxWorks 就在 200MHz PowerPC 芯片上实现了 10us 的上下文切换时间,这在当时真的很快。

==编辑==

多核机器中的上下文切换可能是一个多变的事情。在单核机器中,每次运行不同的线程时,操作系统必须始终切换执行上下文。但是在多核机器上,操作系统可以跨内核分配线程,因此不需要执行与上下文切换相关的所有内存事务(我实际上不知道是否有任何操作系统这样做)。但是考虑到线程/核心分布本身是一个非常可变的东西,取决于机器工作负载等,一个应用程序可能会遇到变化很大的 CST,具体取决于用户是否移动鼠标等。

【讨论】:

    【解决方案2】:

    只需多次拨打sleep(0)即可;观察总经过时间;和划分。在高优先级进程中执行此操作,以便它始终是自己安排的下一个进程。

    【讨论】:

    • 这并不意味着您正在测量上下文切换时间。您只是进入和退出内核,但您并没有强迫它实际切换执行上下文(最长的部分)。
    • @bazza 您正在测量在用户模式和内核模式之间切换上下文并再次返回的时间。
    • 你没看错:) OP 应该指定了“线程上下文”。
    • @MartinJames,公平地说,OP 确实用多线程标记了这个问题!
    • 是的,这个城市有很多上下文切换。这就是其中之一。
    【解决方案3】:

    从用户空间进程中,您可以粗略估计运行多个线程/进程,每个线程/进程在很长一段时间内尽可能频繁地获取挂钟(或处理器滴答声,RTDSC),并且然后找到不同线程的测量值之间的最小差异。并确保它们在同一个核心上运行。

    另一个估计可以通过使用某种等待互斥锁或条件变量来获得,但这宁愿显示线程/进程唤醒的性能。

    在 Java 中,您可能会获得额外的 JVM 开销。

    我想唯一可靠的方法是分析你的内核,或者在内核文档中找到数字。

    可能在尝试所有这些之前,您应该确定为什么您需要知道这样的事情。多线程/多进程应用程序的性能取决于许多因素,而上下文切换通常是次要因素。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2014-12-10
      • 2016-10-08
      相关资源
      最近更新 更多