梁衡,劉新新,鄭遠(yuǎn)攀
(1.許昌學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,河南許昌461000;2.鄭州輕工業(yè)學(xué)院計(jì)算機(jī)與通信工程學(xué)院,河南鄭州450002)
基于Linux內(nèi)核的Android系統(tǒng)的應(yīng)用平臺(tái)越來(lái)越廣泛,對(duì)電源管理的要求越來(lái)越高,目前應(yīng)用最廣泛的動(dòng)態(tài)電源管理(DPM)提供了一種操作系統(tǒng)級(jí)別的電源管理能力.相比傳統(tǒng)電源管理,通過(guò)用戶層制定策略與內(nèi)核提供管理功能交互,實(shí)時(shí)調(diào)整電源參數(shù)并同時(shí)滿足系統(tǒng)實(shí)時(shí)應(yīng)用的需求,允許電源管理參數(shù)在短時(shí)間的空閑,或任務(wù)運(yùn)行在低電源需求時(shí)可以被頻繁地、低延遲地調(diào)整,從而實(shí)現(xiàn)更精細(xì)、更智能的電源管理[1].
Android作為一種嵌入Linux內(nèi)核的操作系統(tǒng),依賴于Linux分層架構(gòu),包括應(yīng)用程序?qū)印?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層以及Linux內(nèi)核層4部分[2].以Linux為核心的應(yīng)用程序?qū)幼鳛锳ndroid應(yīng)用平臺(tái)層,使用Java語(yǔ)言編寫基于Java虛擬機(jī)運(yùn)行環(huán)境的程序.作為Android應(yīng)用平臺(tái)核心API應(yīng)用程序框架,使得開發(fā)人員可以開發(fā)自定義應(yīng)用程序,包括View System、Content Providers、Resource Manager、Notification Manager、Activity Manager、Window Manager、Package Manager.在使用 Android 應(yīng)用框架時(shí),系統(tǒng)通過(guò)系統(tǒng)運(yùn)行庫(kù)層中的運(yùn)行庫(kù)來(lái)支持用戶使用的各個(gè)組件,更好的為用戶提供服務(wù).Android核心層是作為硬件和軟件棧間的抽象層,除了Linux2.6內(nèi)核的功能,還提供對(duì)硬件的驅(qū)動(dòng)程序服務(wù).
動(dòng)態(tài)電源管理框架是指在一定規(guī)則和機(jī)制的基礎(chǔ)上,整合系統(tǒng)不同組件功能的動(dòng)態(tài)優(yōu)化技術(shù),從整體上看,它著眼于整個(gè)系統(tǒng)各個(gè)功能的最優(yōu)化設(shè)計(jì),而不是僅僅局限于系統(tǒng)的局部性質(zhì),從而實(shí)現(xiàn)全局最優(yōu)的效果.
框架設(shè)計(jì)需求有如下幾點(diǎn)[3]:
(1)具備框架設(shè)計(jì)的靈活性;
(2)具備收集系統(tǒng)資源信息的能力;
(3)具備能夠同時(shí)進(jìn)行普通任務(wù)和功能監(jiān)控任務(wù)的功能;
(4)具備外設(shè)狀態(tài)的變化獨(dú)立于管理策略變化的特性;
(5)具備支持動(dòng)態(tài)電壓調(diào)節(jié)、動(dòng)態(tài)頻率調(diào)節(jié)等硬件參數(shù).
DPM模塊中除DPM基本框架中的操作點(diǎn)管理、操作狀態(tài)管理、策略管理、設(shè)備約束管理外,還包括了擴(kuò)展的策略優(yōu)化和CPU負(fù)載檢測(cè)模塊,使用任務(wù)級(jí)設(shè)備調(diào)度優(yōu)化策略,并在設(shè)備調(diào)度過(guò)程中根據(jù)動(dòng)態(tài)CPU頻率自動(dòng)調(diào)整參數(shù),減少能量消耗.DPM框架系統(tǒng)模型[4]見圖1.
圖1 DPM整體框架模型Fig.1 DPMoverall frame model
操作點(diǎn)對(duì)應(yīng)整個(gè)平臺(tái)各種硬件的數(shù)據(jù)參數(shù),是動(dòng)態(tài)電源管理框架中最基本的抽象組合[5-6].操作點(diǎn)實(shí)現(xiàn)如下:
struct dpm_opt
{
char*name; //操作點(diǎn)名字
struct list_head list;//初始化的操作點(diǎn)列表
dpm_md_pp_t pp[DPM_PP_NBR];//初始化參數(shù)
struct dpm_md_optmd_opt;//設(shè)備屬性
int constrained; //是否受其他條件約束
struct kobject kobj;//內(nèi)核設(shè)備對(duì)象結(jié)構(gòu)
struct dpm_stats stats;//相關(guān)數(shù)據(jù)統(tǒng)計(jì)
int flags; //標(biāo)志項(xiàng)
};
struct dpm_md_opt{
unsigned int v; //目標(biāo)電壓(mV)
unsigned int cpu; //CPU頻率(kHz)
…… //其它參數(shù)
};
操作狀態(tài)是由多個(gè)操作點(diǎn)組成的狀態(tài)集合[7];操作系統(tǒng)可以認(rèn)為是一個(gè)狀態(tài)機(jī),通過(guò)事件的觸發(fā),操作系統(tǒng)可以在不同的狀態(tài)間進(jìn)行切換,而針對(duì)同一狀態(tài)根據(jù)不同的負(fù)載,也可以進(jìn)行不同的操作點(diǎn)間的切換,達(dá)到系統(tǒng)能耗的最優(yōu)化.
針對(duì)操作系統(tǒng)的狀態(tài)切換,可以與操作狀態(tài)進(jìn)行一一對(duì)應(yīng),而當(dāng)前系統(tǒng)所使用的操作點(diǎn),可以通過(guò)策略進(jìn)行管理,通過(guò)不同的策略的切換不同操作狀態(tài),達(dá)到切換不同操作點(diǎn)的目的.
Android系統(tǒng)中主要有以下 3種狀態(tài):USER_AWAKE;USER_NOTIFICATION;USER_SLEEP[8].而Android系統(tǒng)從工作狀態(tài)轉(zhuǎn)為休眠狀態(tài)的一個(gè)重要因素是一種叫Wake lock的鎖機(jī)制,Wake lock是對(duì)系統(tǒng)能否進(jìn)入休眠狀態(tài)時(shí)的一個(gè)判斷前提.只有當(dāng)前沒有用戶態(tài)應(yīng)用程序且內(nèi)核態(tài)進(jìn)程持有Wakelock,系統(tǒng)才能進(jìn)入休眠狀態(tài),否則,在Wake lock鎖主動(dòng)釋放或者超時(shí)自動(dòng)釋放前,系統(tǒng)無(wú)法進(jìn)入休眠狀態(tài).操作狀態(tài)的代碼如下:
struct dpm_class
{
char*name; //類名稱
struct list_head list;//初始化類列表
unsigned nops;//該操作類中操作點(diǎn)的個(gè)數(shù)
struct dpm_opt**ops;//指向操作點(diǎn)地址的指針struct dpm_opt*opt;//類中被選中的操作點(diǎn)
struct dpm_stats stats;//相關(guān)數(shù)據(jù)統(tǒng)計(jì)
};
操作策略,即管理策略,表示操作狀態(tài)與操作點(diǎn)或操作類之間的映射關(guān)系,根據(jù)不同操作狀態(tài)和操作點(diǎn)的映射關(guān)系可以定義不同的操作策略.
操作策略數(shù)據(jù)結(jié)構(gòu)表示如下:
struct dpm_policy
{
char*name; //策略名稱
struct list_head list;//初始化類列表,鏈接到dpm_class鏈表中
struct dpm_class*classes[DPM_STATES];//該操作策略中包含的類
struct dpm_stats stats;//相關(guān)數(shù)據(jù)統(tǒng)計(jì)
};
操作點(diǎn)、操作狀態(tài)機(jī)操作類、操作策略之間的關(guān)系可以表示為鏈表形式,即:
extern struct list_head dpm-polieies;
extem struct head dpm_classes;
extern struct list head dpm_opts:
其中一個(gè)操作策略對(duì)應(yīng)多個(gè)操作狀態(tài)即操作類,一個(gè)操作狀態(tài)對(duì)應(yīng)多個(gè)操作點(diǎn).
策略管理者通過(guò)底層的設(shè)備驅(qū)動(dòng)管理設(shè)備的能耗,選擇滿足約束條件的操作點(diǎn),保證設(shè)備在操作點(diǎn)下正常工作.約束數(shù)據(jù)結(jié)構(gòu)表示如下:
struct constraints
{
int asserted;//設(shè)備約束是否起作用標(biāo)志
int count;//約束參數(shù)的個(gè)數(shù)
int violations;//違反約束的操作點(diǎn)數(shù)
struct constraint_param param[DPM_CONSTRA INT_PARAMS_MAX];//約束參數(shù)
struct list_head entry;//初始化的約束列表
};
struct constraint_param
{
int id;//約束參數(shù)ID
int min;//最小約束值
int max;//最大約束值
};
目前,大多數(shù)研究中的DPM策略都著力于對(duì)目標(biāo)設(shè)備進(jìn)行負(fù)載檢測(cè)的角度,而忽略了不同負(fù)載任務(wù)的工作形式,不可避免地造成設(shè)備利用率降低以及預(yù)測(cè)策略的預(yù)測(cè)錯(cuò)誤等情況[9-10].為排除這種不良狀況的發(fā)生,本研究從任務(wù)級(jí)的角度著手,考慮設(shè)備運(yùn)行狀態(tài),提出了一種全新的在線設(shè)備調(diào)度策略IDSP(Improved Device SchedulingPolicy).引入任務(wù)隊(duì)列機(jī)制,基于先進(jìn)先出的系統(tǒng)任務(wù)調(diào)度方式,實(shí)現(xiàn)任務(wù)運(yùn)行前的設(shè)備實(shí)時(shí)調(diào)度,從而減少任務(wù)運(yùn)行過(guò)程中設(shè)備的等待時(shí)間,減少狀態(tài)轉(zhuǎn)換功耗.有效節(jié)省運(yùn)行總功耗.
假設(shè)系統(tǒng)共有M+1個(gè)用戶任務(wù),表示為Ti(1≤i≤M)和系統(tǒng)空閑任務(wù)TM+1.任務(wù)隊(duì)列表示為TQ,長(zhǎng)度為N(N>M),首任務(wù)表示為TQ{0},后續(xù)任務(wù)以此類推.系統(tǒng)將任務(wù)隊(duì)列中進(jìn)入就緒狀態(tài)的任務(wù)按照FIFO(先進(jìn)先出)規(guī)則進(jìn)行調(diào)度.
首先按照規(guī)則:①相鄰子任務(wù)間至少使用了一個(gè)不同的外設(shè);②保證某一外設(shè)在子任務(wù)執(zhí)行期間完全被使用;將任務(wù)Ti劃分為相互獨(dú)立的N個(gè)子任務(wù){(diào)STi,1,STi,2,...,STi,n},子任務(wù)隊(duì)列表示為{STQ{0},STQ{1}...,STQ{n-1}}.根據(jù)實(shí)際任務(wù)分類空閑任務(wù)、單任務(wù)、多任務(wù)三種情況,作相應(yīng)的策略處理.即:
其次將每個(gè)子任務(wù)STi,k都表示成一個(gè)二維數(shù)據(jù)結(jié)構(gòu) {SDi,SEi}.SDi表示每個(gè)子任務(wù)在執(zhí)行過(guò)程中所使用到的IO設(shè)備集,SEi表示每個(gè)子任務(wù)的執(zhí)行時(shí)間.
然后根據(jù)任務(wù)執(zhí)行隊(duì)列調(diào)度相對(duì)應(yīng)設(shè)備.可以分為以下幾種情況[7]:①運(yùn)行STi,k之前,若設(shè)備sdi∈SDi處于正常工作狀態(tài),且當(dāng)STi,k與STi,k+1都不會(huì)使用sdi時(shí)關(guān)閉sdi;當(dāng)STi,k不使用sdi但STi,k+1使用時(shí),若子任務(wù)執(zhí)行時(shí)間sei≥TBE時(shí)關(guān)閉sdi,否則將sdi置為正常模式等待喚醒;②運(yùn)行子任務(wù)STi,k之前,若設(shè)備sdi處于睡眠狀態(tài),則當(dāng)STi,k不使用但STi,k+1使用sdi時(shí),則STi,k運(yùn)行完畢之前提前喚醒sdi.運(yùn)行子任務(wù)STi,k之前,對(duì)子任務(wù)STi,k和子任務(wù)STi,k+1CPU負(fù)載情況進(jìn)行操作點(diǎn)評(píng)估,并在任務(wù)STi,k運(yùn)行中對(duì)當(dāng)前CPU負(fù)載進(jìn)行調(diào)整,以達(dá)到性能最優(yōu)化.
Android平臺(tái)系統(tǒng)中,/proc/loadavg文件中定義了系統(tǒng)在最近時(shí)間段中的系統(tǒng)平均負(fù)載.在系統(tǒng)運(yùn)行過(guò)程中,內(nèi)核中全局變量current來(lái)標(biāo)識(shí)運(yùn)行進(jìn)程[11-12],每過(guò)一段時(shí)間內(nèi)核中斷程序?qū)?zhí)行一次,可以在內(nèi)核中斷程序的下半部分增加CPU平均負(fù)載計(jì)算函數(shù):
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);
}
通過(guò)上面代碼的調(diào)用可實(shí)現(xiàn)對(duì)系統(tǒng)平均負(fù)載的獲取.當(dāng)?shù)玫较到y(tǒng)負(fù)載之后,將進(jìn)行如下過(guò)程,調(diào)整CPU頻率:
(1)如果當(dāng)前頻率大于設(shè)備約束條件,且向下調(diào)整頻率則無(wú)法滿足需求,則不做調(diào)整;
(2)如果當(dāng)前頻率大于設(shè)備約束條件,且能夠在降低當(dāng)前頻率也能夠保證約束條件,則在下個(gè)子任務(wù)執(zhí)行前,下調(diào)CPU工作頻率;
(3)如果當(dāng)前頻率無(wú)法滿足設(shè)備約束條件,則在子任務(wù)執(zhí)行前,上調(diào)CPU工作頻率.
本文基于IDSP策略對(duì)多組任務(wù)進(jìn)行了實(shí)驗(yàn),具體的實(shí)驗(yàn)環(huán)境設(shè)置為:使用的CPU正常最高工作頻率為 1 500 MHz;工作頻率可在 1 500 MHz、1 000 MHz、700 MHz、300 MHz之間調(diào)整.任務(wù)組中共有 4 個(gè)可調(diào)度任務(wù)(T1、T2、T3、T4),各個(gè)任務(wù)對(duì)應(yīng)的子任務(wù)的執(zhí)行時(shí)間及其所調(diào)用外設(shè)見表1.
表1 子任務(wù)執(zhí)行時(shí)間及相關(guān)設(shè)備表Tab.1 Son task execution time and related equipment
系統(tǒng)中設(shè)備均具有高能耗的正常狀態(tài)和低能耗的睡眠狀態(tài)這些設(shè)備的電氣特性,見表2,其中的功耗數(shù)值為單位功耗.
表2 設(shè)備電器特性Tab.2 Clectrical characteristics of equipment
該組的實(shí)驗(yàn)?zāi)康氖菍⒈疚奶岢龅娜蝿?wù)級(jí)IDSP策略與設(shè)備級(jí)的DPM策略TimOut進(jìn)行功耗及性能的比較.TimeOut的固定超時(shí)時(shí)限設(shè)置為4個(gè)時(shí)間單元,即設(shè)備在經(jīng)過(guò)4個(gè)單元時(shí)間的空閑之后將進(jìn)入休眠狀態(tài).該組實(shí)驗(yàn)中兩種策略的實(shí)時(shí)功耗對(duì)比結(jié)果見圖2.IDSP策略任務(wù)組中CPU頻率調(diào)整與正常工作頻率對(duì)比結(jié)果見圖3.
圖2 策略功耗結(jié)果對(duì)比Fig.2 Comparison of strategy power consumption
圖3 CPU頻率調(diào)整結(jié)果對(duì)比Fig.3 Comparison of CPU frequency Adjustment
由圖2、圖3可知,IDSP策略中實(shí)施的CPU頻率調(diào)整后的數(shù)據(jù)明顯低于調(diào)整前的正常工作值,能夠有效降低CPU功耗.
本文基于動(dòng)態(tài)電源管理基本框架,擴(kuò)展了CPU頻率檢測(cè)功能和策略優(yōu)化功能,應(yīng)用于Android平臺(tái).根據(jù)任務(wù)分類提出一種新的任務(wù)級(jí)設(shè)備調(diào)度策略ISDP,并根據(jù)實(shí)時(shí)檢測(cè)到的調(diào)度過(guò)程中相關(guān)設(shè)備約束條件調(diào)整操作點(diǎn),在保證設(shè)備正常工作條件下,減少了CPU功耗.相對(duì)傳統(tǒng)DLPM策略,本策略在一定程度上延長(zhǎng)了設(shè)備使用時(shí)間,顯著降低了外設(shè)整體功耗.
[1]蘇健.Android智能手機(jī)平臺(tái)電源管理技術(shù)[J].微處理機(jī),2011,10(5):66-69.
[2]張海絨.基于Android平臺(tái)的動(dòng)態(tài)電源管理技術(shù)研究[D].昆明:云南大學(xué),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]劉發(fā)貴,麥偉鵬,黃凱耀.動(dòng)態(tài)電源管理框架的擴(kuò)展與實(shí)現(xiàn)[J].華南理工大學(xué)學(xué)報(bào):自然科學(xué)版,2007,35(5):60-64.
[5]Binweinberg.基于Linux的動(dòng)態(tài)電源管理:使嵌入式設(shè)備更節(jié)能[M].Monta VistaSoftware,2003.
[6]陽(yáng)富民,梁晶,張杰,等.嵌入式Linux電源管理技術(shù)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2004,26(12):93-95.
[7]卜愛國(guó),劉昊,胡晨,等.基于任務(wù)級(jí)的動(dòng)態(tài)電源管理設(shè)備調(diào)度策略[J].電路與系統(tǒng)學(xué)報(bào),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]萬(wàn)恩海,劉宗田.基于Linux動(dòng)態(tài)頻率調(diào)整的DPM方案[J].計(jì)算機(jī)工程,2011,37(10):237-242.
[12]史軍勇,齊艷珂.Linux操作系統(tǒng)環(huán)境下CPU平均負(fù)載的研究[J].福建電腦,2009(6):119-121.