Linux内核中的上下文切换时间

时间:2018-10-11 20:55:29

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

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

整个从内核内存中保存和加载寄存器可能需要一些CPU周期。这次是否属于用户CPU /系统CPU或其他地方

2 个答案:

答案 0 :(得分:2)

这样想:

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

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

  • 内核会执行任务(最初取决于导致切换到内核空间的原因),而在执行任务时,它可能会或可能不会决定执行一个或多个任务切换。每次任务切换发生时,内核都会计算出前一个任务在内核中所花费的时间(now - last time),并将其添加到任务的“系统时间”中,并设置“上次时间”以供以后使用(last_time = now)< / p>

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

  • 任务切换回用户空间后,返回到上面的第一步,然后再次执行所有操作。

答案 1 :(得分:0)

该时间肯定应该在系统CPU下。花在系统调用和中断上的任何时间都应该在系统CPU之下,而不是在用户CPU之下。用户CPU是花在运行正在积极执行的ELF中的程序集以及任何支持库上的时间-其他都没有。甚至I / O也算作系统CPU。

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

this.setState({bubbles: this.state.bubbles.map(x => ({...x, vy: x.vy + 1})})

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