一、什麼是cpuidle
cpuidle是一個用於節省能耗的Linux內核框架。在處理器空閑時,cpuidle可以根據不同的情況對處理器進行休眠狀態的選擇,從而減少能耗。cpuidle的基本思路是,當CPU處理器進入空閑狀態時,cpuidle會選擇最節能的休眠狀態。
cpuidle採用了一種插件式的架構,它可以根據不同的硬件平台選擇最適合的休眠模式以最大限度地節省功耗。cpuidle內核框架可以與各種硬件平台上的不同處理器的休眠狀態進行協調。主要目的是通過選擇最佳的能耗模式來最大限度地降低系統的能耗。
#include
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需要遵循以下幾點:
1、選擇低功耗的運行模式
2、合理選擇休眠模式
3、更好的平衡性能和能耗
4、能夠移植到不同的平台上
三、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
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是一個非常重要的工具,它可以幫助我們更好的節約能耗。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/272234.html
微信掃一掃
支付寶掃一掃