CPU在空闲的时候做什么

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 
版权声明:本文为博主原创文章,转载请附上博文链接!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值