在 Linux Kernel 中,当处理器上下文从一个线程切换到另一个线程时,寄存器的状态会保存到 PCB 中,并且会进行更多的簿记以确保可以再次加载确切的状态。
从内核内存中保存和加载寄存器的整个过程可能需要一些 CPU 周期。这个时间也是在用户 CPU / 系统 CPU 或其他地方
在 Linux Kernel 中,当处理器上下文从一个线程切换到另一个线程时,寄存器的状态会保存到 PCB 中,并且会进行更多的簿记以确保可以再次加载确切的状态。
从内核内存中保存和加载寄存器的整个过程可能需要一些 CPU 周期。这个时间也是在用户 CPU / 系统 CPU 或其他地方
可以这样想:
一个任务正在用户空间中运行,但是发生了一些事情(系统调用、异常、IRQ,...)导致任务切换到内核空间
内核计算“在用户空间中花费的now - last_time
时间” last_time = now
(
内核做一些事情(最初取决于导致切换到内核空间的原因),并且在做一些事情时,它可能会或可能不会决定做一个或多个任务切换。当每个任务切换发生时,内核计算出前一个任务在内核中花费了多少时间(now - last time
)并将其添加到任务的“系统时间”中,并为以后设置“最后时间”(last_time = now
)
内核最终决定当前正在运行的任务应该返回到用户空间,并且在此之前它立即对任务的系统时间进行最终更新(now - last time
再次)并再次设置“最后一次”以供稍后(last_time = now
)以便内核可以弄清楚“在用户空间中花费的时间”稍后。
任务切换回用户空间后,返回上面的第一步并再次执行所有操作。
那个时间肯定是在 System CPU 下。花在系统调用和中断上的任何时间都应该在系统 CPU 下,而不是用户 CPU 下。用户 CPU 是在 ELF 和任何支持库中运行程序集所花费的时间——仅此而已。甚至 I/O 也算作系统 CPU。
查看第 1.8 节中的文档,我们看到
- system: processes executing in kernel mode
当然,上下文切换访问内核级数据而不是用户态数据。因此,这段代码是在内核模式下运行的,我们可以根据他们的文档的合法性确定这被视为系统时间。