一、什么是cpuidle
cpuidle是一个用于节省能耗的Linux内核框架。在处理器空闲时,cpuidle可以根据不同的情况对处理器进行休眠状态的选择,从而减少能耗。cpuidle的基本思路是,当CPU处理器进入空闲状态时,cpuidle会选择最节能的休眠状态。 cpuidle采用了一种插件式的架构,它可以根据不同的硬件平台选择最适合的休眠模式以最大限度地节省功耗。cpuidle内核框架可以与各种硬件平台上的不同处理器的休眠状态进行协调。主要目的是通过选择最佳的能耗模式来最大限度地降低系统的能耗。
#include <linux/cpuidle.h>
struct cpuidle_driver {
const char *name;
struct list_head node;
struct cpuidle_device_driver *cpuidle_device;
struct module *owner;
struct cpumask cpu_mask;
int last_residency;
int safe_state_index;
};
二、cpuidle的使用场景
cpuidle主要用于处理大多数PC平台处于空闲状态时的低功耗设定。当系统进入空闲状态时,处理器停止运行,不再执行指令,以避免浪费处理周期,也减少了功耗。当处理器进入空闲状态时,操作系统会将处理器带入可节能状态,从而降低消耗的功耗。 在计算机的不同层次,cpuidle的功耗优化方法也各不相同,一般来说,cpuidle会影响到处理器、芯片组、板上设备等各个方面的能耗,甚至会延伸至服务器管理芯片。 在嵌入式系统领域,cpuidle也占有一席之地。针对嵌入式设备,从节能角度来看,cpuidle需要遵循以下几点:
- 选择低功耗的运行模式
- 合理选择休眠模式
- 更好的平衡性能和能耗
- 能够移植到不同的平台上
三、cpuidle的实现原理
当CPU进入空闲状态时,cpuidle会根据不同的情况选择最节能的休眠状态。cpuidle会根据不同的CPU/系统上的电源管理内核模块选择不同的休眠状态。在这方面,cpuidle具有很好的扩展性,使得其能够支持各种低功耗休眠状态。 在Linux内核中,cpuidle是通过中断处理函数或调用idle函数时触发的,当进入系统空闲状态时,就会被调用。这些函数都是通过idle标志位来处理的。在idle标志位中,有一些标志位是和cpuidle相关的。这些标志位包括:TIF_IDLE、TIF_NEED_RESCHED、TIF_NOTIFY_RESUME。
unsigned long tick_nohz_idle(void)
{
#ifdef CONFIG_CPU_IDLE_MULTI
if (cpuidle_select())
return 0;
#endif
local_irq_enable();
while (1)
cpu_idle();
return 0;
}
四、cpuidle的应用举例
举个例子,考虑一个嵌入式系统,运行一个网络服务,要求保证网络正常运行的同时,最小化系统的能耗。在这种情况下,使用cpuidle是极其重要的。可以使用如下代码段来实现:
#include <linux/cpuidle.h>
static int cpuidle_shutdown(struct platform_device *pdev)
{
struct cpuidle_device *device = cpuidle_get_device(&pdev->dev);
if (!device) {
return -ENODEV;
}
/* Prevent any entry attempts by the governor */
cpuidle_pause_and_lock();
/* Stop the idle loop */
tick_shutdown();
cpuidle_unlock(device);
return 0;
}
该代码段阻止休眠模式的对处理器的定时器中断进行影响。因此,才能够实现网络服务的正常运行。同时,系统也能最小化能耗的消耗。
五、结论
cpuidle是一个用于节省能耗的Linux内核框架,它能够根据不同的情况对处理器进行休眠状态的选择,从而减少能耗。cpuidle是一个非常重要的工具,它可以帮助我们更好的节约能耗。