在Linux内核中,当处理器上下文从一个线程切换到另一个线程时,寄存器的状态被保存到PCB中,并且进行了更多簿记以确保可以再次加载确切的状态。
整个从内核内存中保存和加载寄存器可能需要一些CPU周期。这次是否属于用户CPU /系统CPU或其他地方
答案 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})})
当然,上下文切换访问内核级数据,而不访问用户层数据。因此,这些代码是在内核模式下运行的,并且我们可以确定,根据其文档的合法性,这被视为系统时间。