• 【Linux kernel/cpufreq】framework ----初识


    CMOS电路中分为动态功耗和静态功耗,公式为 power=Σ(CV²αf + VI)。 C 代表负载电容的容值,V 是工作电压,α 是当前频率下的翻转率,f为工作频率,I代表静态电流。公式中加号前面部分代表动态功耗,后半部分代表静态功耗。要想降低动态功耗的话,需要从C/α/V/f几个参数入手,而对于软件而言,通常可以调节的只有V和f。

    对CPU core来说,功耗和性能是一对不可调和的矛盾,通过调整CPU的电压和频率,可以在功耗和性能之间找一个平衡点。由于调整是在系统运行的过程中,因此cpufreq framework的功能也称作动态电压/频率调整(Dynamic Voltage/Frequency Scaling,DVFS)。

    DVFS技术是一项需要软硬件结合的技术,硬件方面比如Intel的SpeedStep技术以及由此衍生的EIST技术,ARM的IEM和AVS技术等。软件方面对于Linux而言主要就是CPUfreq技术。

    对于Cpufreq技术其实也就是软件根据系统的负载,动态的去调整电压和频率来平衡性能和功耗。

    总体而言,Cpufreq包含两部分内容,一是策略部分,该部分与具体CPU无关;而是driver部分,与具体平台实现策略有关系。这种设计的优点是实现了策略和实现机制的分离。首先看策略部分,目前Linux上通用的策略有五种,如下表所示:

    策略名 策略说明
    ondemand 平时以低俗运行,系统负载提高时按需提高频率
    performance CPU以最高频率运行
    conservative 跟ondemand方式类似, 不同之处在于提高频率时渐进提高
    powersave cpu以最低频率运行
    userspace 使用用户在/sys 节点scaling_setspeed设置的频率运行
    对于安卓系统而言,还增加了一种interactive策略针对延时敏感的UI任务,当有UI任务时,改策略会采取更加激进的方式调节CPU频率。

    cpufreq framework的核心功能,是通过调整CPU core的电压和频率,兼顾系统的性能和功耗。在不需要高性能时,降低电压和频率,以降低功耗;在需要高性能时,提高电压和频率,以提高性能。要达到此目的,有两个关键点:

    1)如果控制CPU core的电压和频率。

    2)何时改变CPU core的电压和频率。

    针对这两个关键点,CPU core有两种实现。

    实现1:CPU core根据自身的负荷,自动调整电压和频率,不需要OS级别的软件参与。

    这种实现,软件复杂度非常低,通常情况下,只需要告诉CPU core电压和频率的调整范围(通过频率表示,scaling_min_freq和scaling_max_freq,也称作policy),CPU core即可自行调整。因此:

    关键点1,由CPU core自行处理;

    关键点2,OS需要根据大致的应用场景(例如,是高性能场景,还是低性能场景),设定一个频率范围,改变时机,由CPU core自行决定。

    注1:由于软件参与度小,该实现的省电效率可能较低。

    实现2:CPU core不参与任何的逻辑动作,由OS软件根据系统运行情况,调整电压和频率。

    这种实现,几乎完全由软件掌控DVFS行为:

    关键点1,基于clock framework和regulator framework提供的接口,控制CPU core的频率和电压;

    关键点2,根据应用场景,手动(用户发起,例如省电模式)或者自动(软件自动调整,例如HMP)的调整。

    注2:对关键点2来说,如果调整比较频繁,则需要CPU core在不同频率之间转换的速度足够快,后面会详细介绍。

    为了实现上述功能需求,cpufreq framework抽象出cpufreq driver、cpufreq policy(策略)、cpufreq governor等多个软件实体,具体请参考下面的说明。

    cpufreq framework的软件架构如下面图片所示:
    在这里插入图片描述
    对下,cpufreq framework基于cpu subsystem driver、OPP、clock framework、regulator framework等模块,提供对CPU core频率和电压的控制。这一部分主要由cpufreq driver实现。

    对上,cpufreq framework会通过cpufreq core、cpufreq governors、cpufreq stats等模块,以sysfs的形式,向用户空间提供cpu frequency的查询、控制等接口。同时,在频率改变的时候,通过notifier通知关心的driver。

    内部,cpufreq framework包括cpufreq core、cpufreq driver、cpufreq governors、cpufreq stats等模块,具体功能会在下一章详细分析。

    注3:cpufreq driver中有,有一个特别的driver----arm big·little driver,用于实现ARM平台big·little的切换逻辑。虽然arm bit·little和cpufreq不是同一个概念,但它们的目的和逻辑非常类似,因此就放到这里了。后续会有专门的文章介绍该功能,因此分析cpufreq framework其它内容时,会直接把它忽略不表。

    学习wiki:
    Linux性能之DVFS/cpufreq
    linux cpufreq framework(1)_概述

  • 相关阅读:
    基于单片机的智能水位监控识别系统设计
    AI换脸之Faceswap技术原理与实践
    曝一段十多年前的“情史”!
    map和set的使用
    Android IPC | Android多进程模式
    【redis】redis持久化学习
    linux常用命令
    使用ESP8266构建家庭自动化系统
    工作手机安全管理平台建设方案
    对于使用Cookie还是使用Session的判断 [JavaWeb][Servlet]
  • 原文地址:https://blog.csdn.net/mmbb26/article/details/127560684