【问题标题】:Context Switch Time in Linux KernelLinux 内核中的上下文切换时间
【发布时间】:2019-03-17 01:14:38
【问题描述】:

在 Linux Kernel 中,当处理器上下文从一个线程切换到另一个线程时,寄存器的状态会保存到 PCB 中,并且会进行更多的记录以确保可以再次加载准确的状态。

从内核内存中保存和加载寄存器的整个过程可能需要一些 CPU 周期。这个时间也是在用户 CPU / 系统 CPU 或其他地方

【问题讨论】:

    标签: linux multithreading linux-kernel context-switch context-switching


    【解决方案1】:

    这样想:

    • 一个任务正在用户空间运行,但发生了一些事情(系统调用、异常、IRQ...)导致任务切换到内核空间

    • 内核计算“在用户空间中花费的时间”(now - last_time)并更新任务的“用户时间”计数器,并为以后设置“最后时间”(last_time = now)。

    • 内核会做一些事情(最初取决于导致切换到内核空间的原因),并且在做一些事情时,它可能会或可能不会决定做一个或多个任务切换。当每个任务切换发生时,内核计算出前一个任务在内核中花费了多少时间(now - last time)并将其添加到任务的“系统时间”中并设置“最后时间”供以后使用(last_time = now

    • 内核最终决定当前运行的任务应该返回到用户空间,并在此之前立即对任务的系统时间进行最终更新(再次now - last time)并再次设置“最后一次”为稍后(last_time = now),以便内核稍后可以计算出“在用户空间中花费的时间”。

    • 任务切换回用户空间后,回到上面的第一步,再做一遍。

    【讨论】:

    • 这个上下文切换时间(now - last_time)是针对哪个进程计算的。在上下文切换之前运行的进程/线程或在上下文切换之后运行的进程/线程。
    • @mridul_verma:如果任务切换的代价是Q;然后在任务切换期间,Q 的一部分(我将称之为R)将归属于前一个任务,然后剩余部分(Q - R)将归属于下一个任务。如果一个任务停止使用 CPU,然后又开始使用 CPU;该任务的总时间为(R) + (Q - R) = QR 的大小无关紧要。
    • @mridul_verma:请注意(对于现代多 GHz CPU)任务切换 (Q) 的总成本可能在几十纳秒范围内,因此任何暂时的不平衡都会在噪音。另请注意,我在这里谈论的是“直接成本”。实际上,“间接成本”(在任务切换后、内核返回用户空间后发生的 TLB 未命中和缓存未命中的成本)比“直接成本”要重要得多;并且这些间接成本归因于“用户时间”而不是“系统时间”(因为那是 TLB 未命中和缓存未命中发生的时间)。
    • 这完全回答了我的问题。感谢您提供信息。
    【解决方案2】:

    那个时间肯定是在System CPU下。在系统调用和中断中花费的任何时间都应该在系统 CPU 下,而不是用户 CPU 下。用户 CPU 是在 ELF 和任何支持库中运行程序集所花费的时间——仅此而已。甚至 I/O 也算作系统 CPU。

    查看第 1.8 节中的documentation,我们看到

    - system: processes executing in kernel mode
    

    当然,上下文切换访问内核级数据而不是用户级数据。因此,这段代码是在内核模式下运行的,我们可以根据他们的文档的合法性确定这被视为系统时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-09
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2021-09-21
      相关资源
      最近更新 更多