梁衡,刘新新,郑远攀
(1.许昌学院计算机科学与技术学院,河南许昌461000;2.郑州轻工业学院计算机与通信工程学院,河南郑州450002)
基于Linux内核的Android系统的应用平台越来越广泛,对电源管理的要求越来越高,目前应用最广泛的动态电源管理(DPM)提供了一种操作系统级别的电源管理能力.相比传统电源管理,通过用户层制定策略与内核提供管理功能交互,实时调整电源参数并同时满足系统实时应用的需求,允许电源管理参数在短时间的空闲,或任务运行在低电源需求时可以被频繁地、低延迟地调整,从而实现更精细、更智能的电源管理[1].
Android作为一种嵌入Linux内核的操作系统,依赖于Linux分层架构,包括应用程序层、应用程序框架层、系统运行库层以及Linux内核层4部分[2].以Linux为核心的应用程序层作为Android应用平台层,使用Java语言编写基于Java虚拟机运行环境的程序.作为Android应用平台核心API应用程序框架,使得开发人员可以开发自定义应用程序,包括View System、Content Providers、Resource Manager、Notification Manager、Activity Manager、Window Manager、Package Manager.在使用 Android 应用框架时,系统通过系统运行库层中的运行库来支持用户使用的各个组件,更好的为用户提供服务.Android核心层是作为硬件和软件栈间的抽象层,除了Linux2.6内核的功能,还提供对硬件的驱动程序服务.
动态电源管理框架是指在一定规则和机制的基础上,整合系统不同组件功能的动态优化技术,从整体上看,它着眼于整个系统各个功能的最优化设计,而不是仅仅局限于系统的局部性质,从而实现全局最优的效果.
框架设计需求有如下几点[3]:
(1)具备框架设计的灵活性;
(2)具备收集系统资源信息的能力;
(3)具备能够同时进行普通任务和功能监控任务的功能;
(4)具备外设状态的变化独立于管理策略变化的特性;
(5)具备支持动态电压调节、动态频率调节等硬件参数.
DPM模块中除DPM基本框架中的操作点管理、操作状态管理、策略管理、设备约束管理外,还包括了扩展的策略优化和CPU负载检测模块,使用任务级设备调度优化策略,并在设备调度过程中根据动态CPU频率自动调整参数,减少能量消耗.DPM框架系统模型[4]见图1.
图1 DPM整体框架模型Fig.1 DPMoverall frame model
操作点对应整个平台各种硬件的数据参数,是动态电源管理框架中最基本的抽象组合[5-6].操作点实现如下:
struct dpm_opt
{
char*name; //操作点名字
struct list_head list;//初始化的操作点列表
dpm_md_pp_t pp[DPM_PP_NBR];//初始化参数
struct dpm_md_optmd_opt;//设备属性
int constrained; //是否受其他条件约束
struct kobject kobj;//内核设备对象结构
struct dpm_stats stats;//相关数据统计
int flags; //标志项
};
struct dpm_md_opt{
unsigned int v; //目标电压(mV)
unsigned int cpu; //CPU频率(kHz)
…… //其它参数
};
操作状态是由多个操作点组成的状态集合[7];操作系统可以认为是一个状态机,通过事件的触发,操作系统可以在不同的状态间进行切换,而针对同一状态根据不同的负载,也可以进行不同的操作点间的切换,达到系统能耗的最优化.
针对操作系统的状态切换,可以与操作状态进行一一对应,而当前系统所使用的操作点,可以通过策略进行管理,通过不同的策略的切换不同操作状态,达到切换不同操作点的目的.
Android系统中主要有以下 3种状态:USER_AWAKE;USER_NOTIFICATION;USER_SLEEP[8].而Android系统从工作状态转为休眠状态的一个重要因素是一种叫Wake lock的锁机制,Wake lock是对系统能否进入休眠状态时的一个判断前提.只有当前没有用户态应用程序且内核态进程持有Wakelock,系统才能进入休眠状态,否则,在Wake lock锁主动释放或者超时自动释放前,系统无法进入休眠状态.操作状态的代码如下:
struct dpm_class
{
char*name; //类名称
struct list_head list;//初始化类列表
unsigned nops;//该操作类中操作点的个数
struct dpm_opt**ops;//指向操作点地址的指针struct dpm_opt*opt;//类中被选中的操作点
struct dpm_stats stats;//相关数据统计
};
操作策略,即管理策略,表示操作状态与操作点或操作类之间的映射关系,根据不同操作状态和操作点的映射关系可以定义不同的操作策略.
操作策略数据结构表示如下:
struct dpm_policy
{
char*name; //策略名称
struct list_head list;//初始化类列表,链接到dpm_class链表中
struct dpm_class*classes[DPM_STATES];//该操作策略中包含的类
struct dpm_stats stats;//相关数据统计
};
操作点、操作状态机操作类、操作策略之间的关系可以表示为链表形式,即:
extern struct list_head dpm-polieies;
extem struct head dpm_classes;
extern struct list head dpm_opts:
其中一个操作策略对应多个操作状态即操作类,一个操作状态对应多个操作点.
策略管理者通过底层的设备驱动管理设备的能耗,选择满足约束条件的操作点,保证设备在操作点下正常工作.约束数据结构表示如下:
struct constraints
{
int asserted;//设备约束是否起作用标志
int count;//约束参数的个数
int violations;//违反约束的操作点数
struct constraint_param param[DPM_CONSTRA INT_PARAMS_MAX];//约束参数
struct list_head entry;//初始化的约束列表
};
struct constraint_param
{
int id;//约束参数ID
int min;//最小约束值
int max;//最大约束值
};
目前,大多数研究中的DPM策略都着力于对目标设备进行负载检测的角度,而忽略了不同负载任务的工作形式,不可避免地造成设备利用率降低以及预测策略的预测错误等情况[9-10].为排除这种不良状况的发生,本研究从任务级的角度着手,考虑设备运行状态,提出了一种全新的在线设备调度策略IDSP(Improved Device SchedulingPolicy).引入任务队列机制,基于先进先出的系统任务调度方式,实现任务运行前的设备实时调度,从而减少任务运行过程中设备的等待时间,减少状态转换功耗.有效节省运行总功耗.
假设系统共有M+1个用户任务,表示为Ti(1≤i≤M)和系统空闲任务TM+1.任务队列表示为TQ,长度为N(N>M),首任务表示为TQ{0},后续任务以此类推.系统将任务队列中进入就绪状态的任务按照FIFO(先进先出)规则进行调度.
首先按照规则:①相邻子任务间至少使用了一个不同的外设;②保证某一外设在子任务执行期间完全被使用;将任务Ti划分为相互独立的N个子任务{STi,1,STi,2,...,STi,n},子任务队列表示为{STQ{0},STQ{1}...,STQ{n-1}}.根据实际任务分类空闲任务、单任务、多任务三种情况,作相应的策略处理.即:
其次将每个子任务STi,k都表示成一个二维数据结构 {SDi,SEi}.SDi表示每个子任务在执行过程中所使用到的IO设备集,SEi表示每个子任务的执行时间.
然后根据任务执行队列调度相对应设备.可以分为以下几种情况[7]:①运行STi,k之前,若设备sdi∈SDi处于正常工作状态,且当STi,k与STi,k+1都不会使用sdi时关闭sdi;当STi,k不使用sdi但STi,k+1使用时,若子任务执行时间sei≥TBE时关闭sdi,否则将sdi置为正常模式等待唤醒;②运行子任务STi,k之前,若设备sdi处于睡眠状态,则当STi,k不使用但STi,k+1使用sdi时,则STi,k运行完毕之前提前唤醒sdi.运行子任务STi,k之前,对子任务STi,k和子任务STi,k+1CPU负载情况进行操作点评估,并在任务STi,k运行中对当前CPU负载进行调整,以达到性能最优化.
Android平台系统中,/proc/loadavg文件中定义了系统在最近时间段中的系统平均负载.在系统运行过程中,内核中全局变量current来标识运行进程[11-12],每过一段时间内核中断程序将执行一次,可以在内核中断程序的下半部分增加CPU平均负载计算函数:
Unsigned long actice_tasks;
Static int count=LOAD_FREQ;
Count-=iticks;
If(count<0)
{
Count+=LOAD_FREQ;
Active_tasks=count_active_tasks();
CALC_LOAD(avenrun[0],EXP_1,active_tasks);
CALC_LOAD(avenrun[1],EXP_5,active_tasks);
CALC_LOAD(avenrun[2],EXP_15,active_tasks);
}
通过上面代码的调用可实现对系统平均负载的获取.当得到系统负载之后,将进行如下过程,调整CPU频率:
(1)如果当前频率大于设备约束条件,且向下调整频率则无法满足需求,则不做调整;
(2)如果当前频率大于设备约束条件,且能够在降低当前频率也能够保证约束条件,则在下个子任务执行前,下调CPU工作频率;
(3)如果当前频率无法满足设备约束条件,则在子任务执行前,上调CPU工作频率.
本文基于IDSP策略对多组任务进行了实验,具体的实验环境设置为:使用的CPU正常最高工作频率为 1 500 MHz;工作频率可在 1 500 MHz、1 000 MHz、700 MHz、300 MHz之间调整.任务组中共有 4 个可调度任务(T1、T2、T3、T4),各个任务对应的子任务的执行时间及其所调用外设见表1.
表1 子任务执行时间及相关设备表Tab.1 Son task execution time and related equipment
系统中设备均具有高能耗的正常状态和低能耗的睡眠状态这些设备的电气特性,见表2,其中的功耗数值为单位功耗.
表2 设备电器特性Tab.2 Clectrical characteristics of equipment
该组的实验目的是将本文提出的任务级IDSP策略与设备级的DPM策略TimOut进行功耗及性能的比较.TimeOut的固定超时时限设置为4个时间单元,即设备在经过4个单元时间的空闲之后将进入休眠状态.该组实验中两种策略的实时功耗对比结果见图2.IDSP策略任务组中CPU频率调整与正常工作频率对比结果见图3.
图2 策略功耗结果对比Fig.2 Comparison of strategy power consumption
图3 CPU频率调整结果对比Fig.3 Comparison of CPU frequency Adjustment
由图2、图3可知,IDSP策略中实施的CPU频率调整后的数据明显低于调整前的正常工作值,能够有效降低CPU功耗.
本文基于动态电源管理基本框架,扩展了CPU频率检测功能和策略优化功能,应用于Android平台.根据任务分类提出一种新的任务级设备调度策略ISDP,并根据实时检测到的调度过程中相关设备约束条件调整操作点,在保证设备正常工作条件下,减少了CPU功耗.相对传统DLPM策略,本策略在一定程度上延长了设备使用时间,显著降低了外设整体功耗.
[1]苏健.Android智能手机平台电源管理技术[J].微处理机,2011,10(5):66-69.
[2]张海绒.基于Android平台的动态电源管理技术研究[D].昆明:云南大学,2011.
[3]IBMand Monta Vista Software.Dynamic power manag ement for embedded systems(V11.1)[EB/OL].(2002-11-19).http://www.resea rch.ibm.com/arl/projects/dpm.html
[4]刘发贵,麦伟鹏,黄凯耀.动态电源管理框架的扩展与实现[J].华南理工大学学报:自然科学版,2007,35(5):60-64.
[5]Binweinberg.基于Linux的动态电源管理:使嵌入式设备更节能[M].Monta VistaSoftware,2003.
[6]阳富民,梁晶,张杰,等.嵌入式Linux电源管理技术的研究与实现[J].计算机工程与科学,2004,26(12):93-95.
[7]卜爱国,刘昊,胡晨,等.基于任务级的动态电源管理设备调度策略[J].电路与系统学报,2005,10(5):33-38.
[8]Peek J,O’Reilly T,Loukides M.UNIX Power Tools[M].Sebastopol,California:O’Reilly&Assoc.Inc.,1997.
[9]Cockcroft A.Sun Performacne and Tuning[M].Mountain View,California:SunSoft Press,1995.
[10]Sesic A,Daut ovic S,Malbasa V.Dynamic power management of a system with a two priority request queue using probabilistic model checking[J].IEEE Transactions on Computer Aided Design of Integrated Circuits and Systems,2008,27(2):403-407.
[11]万恩海,刘宗田.基于Linux动态频率调整的DPM方案[J].计算机工程,2011,37(10):237-242.
[12]史军勇,齐艳珂.Linux操作系统环境下CPU平均负载的研究[J].福建电脑,2009(6):119-121.