CPU在空闲的时候做什么

简介: CPU在空闲的时候做什么 对于大部分负载并不重的计算机而言,可以说CPU大部分的时间都是停留在"idle task"中,在Windows中从任管理器中可以看到大部分的CPU时间都停留在System Idle Process,如下图所示: 在Linux中,idle task并不是一个独立的线程,但是可以通过top指令查看CPU的idle比例: 总的来说,在Intel x86架构CPU中,“idle task”的实现是通过执行HLT指令实现的。

CPU在空闲的时候做什么

对于大部分负载并不重的计算机而言,可以说CPU大部分的时间都是停留在"idle task"中,在Windows中从任管理器中可以看到大部分的CPU时间都停留在System Idle Process,如下图所示:



在Linux中,idle task并不是一个独立的线程,但是可以通过top指令查看CPU的idle比例:




总的来说,在Intel x86架构CPU中,“idle task”的实现是通过执行HLT指令实现的。当CPU执行HLT指令后,CPU就会停止指令的执行,并且让CPU处于HALT状态。当CPU处于HALT状态的时候,CPU虽然停止指令执行,并且CPU的部分功能模块将会被关闭(达到降低功耗的目的),但是CPU的LAPIC(Local Advanced Programmable Interrupt Controller)并不会停止工作,即CPU将会继续接收外部中断、异常等事件(事实上,CPU HALT状态的退出将由外部事件触发)。当CPU接收到这些外部事件的时候,将会从HALT状态恢复回来,执行中断服务函数,并且当中断服务函数执行完毕后,指令寄存器(CS:EIP)将会指向HLT指令的下一条指令,即CPU继续执行HLT指令之后的程序。
HLT指令是特权指令,所以需要在Ring 0中执行,对于Linux来说,只能由内核执行。

在Linux内核源码中,定时器将会周期性地发送时钟中断,该时钟中断的频率在编译的时候由CONFIG_HZ设置,一般被设置为250,即每秒钟定时器将会向CPU发送250个时钟中断。



当CPU没有可运行的任务的时候,CPU将会执行idle task(循环地执行HLT指令),即CPU执行HLT指令后,将会进入HALT状态。当CPU接收到时钟中断的时候,将会执行中断服务函数,然后继续执行idle task,进入HALT状态。如下图所示,即CPU周期性地进入HALT状态,并被唤醒,直到CPU检测到有可运行的任务。



从Linux内核的启动源码来看,在init/main.c:start_kernel()的最后将会调用rest_init()函数,rest_init()将会进行如下调用:

init/main.c:rest_init() ==> kernel/sched/idle.c:cpu_startup_entry() ==> kernel/sched/idle.c:do_idle()  ==> kernel/sched/idle.c:cpuidle_idle_call() ==> kernel/sched/idle.c:default_idle_call() ==> arch/x86/kernel/process.c:arch_cpu_idle(),在x86平台,x86_idle被赋值为arch/x86/kernel/process.c:default_idle() ==> safe_halt()

safe_halt()指向arch/x86/include/asm/irqflags.h:native_safe_halt()



最终由native_safe_halt()实现CPU的idle task,该函数只是简单地将中断使能,然后执行HLT指令,即停止CPU的运行,并做好接收中断退出HALT状态的准备。
--------------------- 
作者:河马虚拟化 
来源:CSDN 
原文:https://blog.csdn.net/lindahui2008/article/details/83051411?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!
相关文章
|
28天前
|
缓存 Java 数据库
kswapd0 进程CPU占用过高
kswapd0 进程CPU占用过高
46 2
kswapd0 进程CPU占用过高
|
12月前
|
Shell Linux
大量后台进程占用cpu
大量后台进程占用cpu
|
缓存
完了!CPU一味求快出事儿了!
今天我们来为大家讲讲计算机的底层技术,CPU的那些事,快跟我一起去看看它又给我们整了什么活吧。
333 0
完了!CPU一味求快出事儿了!