CPU核心中idle进程作用

cpuidle framework
每一个 cpu 核心都会有一个 idle 进程,idle 进程是当系统没有调度 cpu 资源的时候,会进入 idle 进程,而 idle 进程的作用就是不使用 cpu,以此达到省电的目的。
在arm64架构中,当cpu idle时,会调用wfi指令(wait for interrupt),关掉cpu的clock以便降低功耗,当有外设中断触发时,cpu又会恢复回来。
cpuidle core 是 cpuidle framework 的核心模块,负责抽象出 cpuidle device、cpuidle driver 和 cpuidle governor 三个实体,如下所示:
cpuidle core 抽象出了 cpuidle device、cpuidle driver 和 cpuidle governor 三个数据结构。
数据结构
cpuidle_device
针对每个cpu核都对应一个struct cpuidle_device结构,主要字段介绍如下
struct cpuidle_device { //该cpu核是否注册进内核中 unsigned int  registered:1; //该cpu核是否已经使能 unsigned int  enabled:1; unsigned int  use_deepest_state:1; //对应的cpu number unsigned int  cpu; //该cpu核上一次停留在cpuidle状态的时间(us) int   last_residency; //记录每个cpuidle状态的统计信息,包括是否使能、进入该cpuidle状态的次数,停留在该cpuidle状态的总时间(us) struct cpuidle_state_usage states_usage[cpuidle_state_max];  ......};  
对应的注册接口是 cpuidle_register_device。
cpuidle_driver
cpuidle driver用于驱动一个或多个cpu核,关键字段描述如下:
struct cpuidle_driver { const char  *name; struct module   *owner; int                     refcnt; //用于驱动注册时判断是否需要设置broadcast timer unsigned int            bctimer:1; //用于描述cpuidle的状态,需要按照功耗从大到小来排序,具体有多少个cpuidle状态 struct cpuidle_state states[cpuidle_state_max];  ......};//cpu有多种不同的idle级别。这些idle级别有不同的功耗和延迟,从而可以在不同的场景下使用//主要包括exit_latency、power_usage、target_residency。这些特性是governor制定idle策略的依据struct cpuidle_state { char  name[cpuidle_name_len]; char  desc[cpuidle_desc_len]; unsigned int flags; //cpu从该idle state下返回运行状态的延迟,单位为us。它决定了cpu在idle状态和run状态之间切换的效率,如果延迟过大,将会影响系统性能; unsigned int exit_latency; /* in us */ //cpu在该idle state下的功耗,单位为mw int  power_usage; /* in mw */ //期望的停留时间,单位为us。进入和退出idle state是需要消耗额外的能量的,如果在idle状态停留的时间过短,节省的功耗少于额外的消耗,则得不偿失。governor会根据该字段,结合当前的系统情况(如可以idle多久),选择idle level; unsigned int target_residency; /* in us */ bool  disabled; /* disabled on all cpus */ //进入该state的回调函数 int (*enter) (struct cpuidle_device *dev,   struct cpuidle_driver *drv,   int index); //cpu长时间不需要工作时(称作offline),可调用该回调函数。 int (*enter_dead) (struct cpuidle_device *dev, int index);  ......};  
对应的注册接口是 cpuidle_register_driver。
cpuidle_governor
governor 结构主要提供不同的回调函数,最终由 menu_governor 填充,主要字段如下:
struct cpuidle_governor { char   name[cpuidle_name_len]; struct list_head  governor_list; //governor的级别,正常情况下,kernel会选择系统中rating值最大的governor作为当前governor unsigned int  rating;  //在设备驱动注册和注销的时候调用 int  (*enable)  (struct cpuidle_driver *drv,     struct cpuidle_device *dev); void (*disable)  (struct cpuidle_driver *drv,     struct cpuidle_device *dev); //根据当前系统的运行状况,以及各个idle state的特性,选择一个state(即决策) int  (*select)  (struct cpuidle_driver *drv,     struct cpuidle_device *dev,     bool *stop_tick); //通过该回调函数,可以告知governor,系统上一次所处的idle state是哪个 void (*reflect)  (struct cpuidle_device *dev, int index);};  
对应的注册接口是 cpuidle_register_governor。
流程
我们先看下设备和驱动的注册过程:
注册之后便将设备和驱动建立起连接关系了,最终 cpuidle framework 的用户便可通过接口来调用下层的接口,进而完成具体的硬件操作。
下面看下 cpu 进入 idle 状态的流程图:
可以看出,最终是通过 psci 来实现 cpu 的 suspend。
psci
psci, power state coordination interface,由arm定义的电源管理接口规范,通常由firmware来实现,而linux系统可以通过smc/hvc指令来进入不同的exception level,进而调用对应的实现。
psci 支持如下功能:
cpu hotplug (on/off)
cpu idle (suspend/resume)
system suspend/resume
system shutdown and reset
每个功能和atf之间的调用接口如下所示:


三星电子金基南预计今年全球芯片需求仍将增长 并计划大规模生产使用5纳米节点的芯片
PLC梯形图编程的规则和规律有哪些
直流电机机械臂DIY图解
iPad2加速医疗设备诊断级产品便携化
国产IC视频转换大全广用工控电脑、一体机、广告机等市场
CPU核心中idle进程作用
友达光电:目前没有micro LED显示产品的具体路线图和量产时间表
MagnaChip宣布推出新款MiniLED驱动器
一种可提升DRAM单元访问速度的新技术探索与研究
服务机器人市场未来可期 这些领域值得关注
触摸屏的应用及分类
我国主要蓄电池系列产品有哪些?
关于电路中共模信号的影响分析
研究发现电极被反转的发光二极管可能会为未来的微处理器提供新的固态冷却技术
Busbar电芯模组焊后外观缺陷检测
在4片级联参考设计板上进行发射天线的连续波测试
盘点扫地机器人品牌排名
华为P10怎么样?华为P10评测:华为P10畏惧小米6抢风头所以降价?
百度开源边缘计算平台 加速人工智能应用落地
4.5kV IGBT/二极管芯片组在高压直流输电领域的应用