識(shí)別android系統(tǒng)下應(yīng)用程序啟動(dòng)階段的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于計(jì)算機(jī)內(nèi)存優(yōu)化技術(shù)領(lǐng)域,具體的是一種識(shí)別android系統(tǒng)下應(yīng)用程 序啟動(dòng)階段的方法。
【背景技術(shù)】
[0002] 隨著技術(shù)的發(fā)展,智能手機(jī)硬件配置越來越高,可是它和現(xiàn)在的PC相比,其運(yùn)算 能力,續(xù)航能力,存儲(chǔ)空間等都還是受到很大的限制,同時(shí)用戶對(duì)手機(jī)的體驗(yàn)要求遠(yuǎn)遠(yuǎn)高于 PC的桌面應(yīng)用程序。Android系統(tǒng)對(duì)每個(gè)軟件所能使用的RAM空間進(jìn)行了限制(如:Nexus one對(duì)每個(gè)軟件的內(nèi)存限制是24M),同時(shí)Java語言本身比較消耗內(nèi)存,dalvik虛擬機(jī)也要 占用一定的內(nèi)存空間,所以合理使用內(nèi)存是應(yīng)用程序開發(fā)過程中一項(xiàng)比較重要的事情。
[0003] 然而現(xiàn)在Linux的物理內(nèi)存是較為離散的。對(duì)于內(nèi)核的內(nèi)存需求,Linux內(nèi)存管 理系統(tǒng)傾向于從低物理地址的內(nèi)存區(qū)分配;而對(duì)于用戶進(jìn)程的內(nèi)存需求,則傾向于從高物 理地址的內(nèi)存區(qū)分配。并且隨著系統(tǒng)中進(jìn)程的不斷創(chuàng)建和消亡,加劇了物理內(nèi)存的碎片問 題。應(yīng)用程序的啟動(dòng)、運(yùn)行到退出這三個(gè)階段伴隨著應(yīng)用程序的整個(gè)生命周期,其不同階段 對(duì)應(yīng)的內(nèi)存需求的不同變化。監(jiān)測(cè)以及準(zhǔn)確判斷應(yīng)用程序生命周期中的不同階段,一方面 可以針對(duì)性的調(diào)整內(nèi)存分配策略來優(yōu)化應(yīng)用程序;另一方面,可借助于調(diào)頻機(jī)制加速應(yīng)用 程序啟動(dòng)。本發(fā)明由此而來。
【發(fā)明內(nèi)容】
[0004] 本發(fā)明的目的是提供一種識(shí)別android系統(tǒng)下應(yīng)用程序啟動(dòng)階段的方法,解決了 現(xiàn)有技術(shù)中應(yīng)用程序沒有系統(tǒng)的進(jìn)行監(jiān)測(cè),無法根據(jù)應(yīng)用程序的內(nèi)存需求規(guī)律針對(duì)性的進(jìn) 行應(yīng)用程序優(yōu)化等技術(shù)問題。
[0005] 為了解決現(xiàn)有技術(shù)中的這些問題,本發(fā)明提供的技術(shù)方案如下:
[0006] -種識(shí)別android系統(tǒng)下應(yīng)用程序啟動(dòng)階段的方法,其特征在于所述方法包括 android系統(tǒng)運(yùn)行時(shí)獲取應(yīng)用程序連續(xù)若干個(gè)統(tǒng)計(jì)周期內(nèi)的物理內(nèi)存分配數(shù)量,根據(jù)物理 內(nèi)存分配數(shù)量大于預(yù)定閾值的統(tǒng)計(jì)周期的數(shù)量占所有統(tǒng)計(jì)周期的比例來判斷應(yīng)用程序是 否處于啟動(dòng)階段;其中,
[0007] 當(dāng)物理內(nèi)存分配數(shù)量大于預(yù)定閾值的統(tǒng)計(jì)周期的數(shù)量占所有統(tǒng)計(jì)周期的比例大 于等于預(yù)設(shè)值時(shí),判定應(yīng)用程序處于啟動(dòng)階段;否則,則認(rèn)為應(yīng)用程序不處于啟動(dòng)階段。
[0008] 優(yōu)選的技術(shù)方案中,所述方法中所述獲取的所有統(tǒng)計(jì)周期的數(shù)量為3~10個(gè);統(tǒng) 計(jì)周期為連續(xù)兩次調(diào)用CPU frequency governor進(jìn)行CPU頻率調(diào)節(jié)之間的時(shí)間段;優(yōu)選 的,所述獲取的所有統(tǒng)計(jì)周期的數(shù)量為5個(gè)。
[0009] 優(yōu)選的技術(shù)方案中,所述方法中CPU主頻調(diào)節(jié)器選自按需調(diào)節(jié)器(ondemand)、性 能調(diào)節(jié)器(performance)、節(jié)約電能調(diào)節(jié)器(powersave)、用戶自定義調(diào)節(jié)器(userspace)、 傳統(tǒng)調(diào)節(jié)器(conservative)。在linux系統(tǒng)中cpufreq是一個(gè)動(dòng)態(tài)調(diào)整cpu頻率的模塊,系 統(tǒng)啟動(dòng)時(shí)生成一個(gè)文件夾 /sys/devices/system/cpu/cpuO/cpufreq/,其中 sealing_min_ freq代表最低頻率,scaling_max_freq代表最高頻率,scalin_governor代表cpu頻率調(diào) 整模式,用它來控制CPU頻率。
[0010] cpu頻率調(diào)整模式根據(jù)CPU主頻調(diào)節(jié)算法的不同對(duì)CPU的頻率和電壓進(jìn)行調(diào)整。 大致有以下幾種:l)performance :該算法只注重效率,將CPU頻率固定工作在其支持的最 高運(yùn)行頻率上,而不動(dòng)態(tài)調(diào)節(jié)。2)p〇werSa Ve :將CPU頻率設(shè)置為最低,即所謂"省電"模式, CPU會(huì)固定工作在其支持的最低運(yùn)行頻率上。因此這兩種調(diào)節(jié)器都屬于靜態(tài)調(diào)節(jié)器,即在使 用它們時(shí)CPU的運(yùn)行頻率不會(huì)根據(jù)系統(tǒng)運(yùn)行時(shí)負(fù)載的變化動(dòng)態(tài)作出調(diào)整。這兩種調(diào)節(jié)器對(duì) 應(yīng)的是兩種極端的應(yīng)用場(chǎng)景,使用performance governor是對(duì)系統(tǒng)高性能的最大追求,而 使用powersave governor則是對(duì)系統(tǒng)低功耗的最大追求。3)Userspace :最早的cpufreq 子系統(tǒng)通過userspace governor為用戶提供了這種靈活性。系統(tǒng)將變頻策略的決策權(quán)交 給了用戶態(tài)應(yīng)用程序,并提供了相應(yīng)的接口供用戶態(tài)應(yīng)用程序調(diào)節(jié)CPU運(yùn)行頻率使用。該 模式可以通過手動(dòng)編輯配置文件進(jìn)行配置。4) ondemand是按需快速動(dòng)態(tài)調(diào)整CPU頻率,一 旦CPU利用達(dá)到足夠多的利用率,則立即達(dá)到最大頻率運(yùn)行;如果低于某個(gè)利用率,則緩慢 降低到最低支持頻率運(yùn)行,這樣保持CPU利用率一直控制在70-80%。userspace是內(nèi)核態(tài) 的檢測(cè),用戶態(tài)調(diào)整,效率低。而ondemand是完全在內(nèi)核態(tài)下工作并且能夠以更加細(xì)粒度 的時(shí)間間隔對(duì)系統(tǒng)負(fù)載情況進(jìn)行采樣分析的governor。ondemand governor監(jiān)測(cè)到系統(tǒng)負(fù) 載超過up_threshold所設(shè)定的百分比時(shí),說明用戶當(dāng)前需要CPU提供更強(qiáng)大的處理能力, 因此ondemand governor會(huì)將CPU設(shè)置在最高頻率上運(yùn)行。但是當(dāng)ondemand governor 監(jiān)測(cè)到系統(tǒng)負(fù)載下降,可以降低CPU的運(yùn)行頻率時(shí),ondemand governor的最初實(shí)現(xiàn)是在 可選的頻率范圍內(nèi)調(diào)低至下一個(gè)可用頻率,例如CPU支持三個(gè)可選頻率,分別為1. 67GHz、 1. 33GHz和1GHz,如果CPU運(yùn)行在1. 67GHz時(shí)ondemand governor發(fā)現(xiàn)可以降低運(yùn)行頻率, 那么1. 33GHz將被選作降頻的目標(biāo)頻率。5) conservative,與ondemand不同,平滑地調(diào)整 CPU頻率,頻率的升降是漸變式的,會(huì)自動(dòng)在頻率上下限調(diào)整,與ondemand的區(qū)別在于它會(huì) 按需分配頻率,而不是一味追求最高頻率。
[0011] 優(yōu)選的技術(shù)方案中,所述方法中所述預(yù)定閾值為40~60個(gè)物理頁;優(yōu)選的,所述 預(yù)定閾值為50個(gè)物理頁。
[0012] 優(yōu)選的技術(shù)方案中,所述方法中所述預(yù)設(shè)值為50~100% ;優(yōu)選的,所述預(yù)設(shè)值為 60%〇
[0013] 優(yōu)選的技術(shù)方案中,所述方法具體按照如下步驟進(jìn)行:
[0014] (l)android系統(tǒng)運(yùn)行時(shí)獲取應(yīng)用程序連續(xù)若干個(gè)統(tǒng)計(jì)周期內(nèi)的物理內(nèi)存分配數(shù) 量,根據(jù)物理內(nèi)存分配數(shù)量大于預(yù)定閾值的統(tǒng)計(jì)周期的數(shù)量占所有統(tǒng)計(jì)周期的比例來判斷 應(yīng)用程序是否處于啟動(dòng)階段;
[0015] (2)繼續(xù)步驟(1)獲取應(yīng)用程序連續(xù)若干個(gè)統(tǒng)計(jì)周期內(nèi)的物理內(nèi)存分配數(shù)量,根 據(jù)物理內(nèi)存分配數(shù)量大于預(yù)定閾值的統(tǒng)計(jì)周期的數(shù)量占所有統(tǒng)計(jì)周期的比例來判斷應(yīng)用 程序是否處于啟動(dòng)階段;依次循環(huán)。
[0016] 優(yōu)選的技術(shù)方案中,所述方法中物理內(nèi)存分配數(shù)量的統(tǒng)計(jì)方法是采用_alloc_ pages_nodemask()函數(shù)統(tǒng)計(jì)系統(tǒng)中內(nèi)存請(qǐng)求的數(shù)量并在該函數(shù)中使用該變量進(jìn)行累加即 可獲得統(tǒng)計(jì)周期內(nèi)系統(tǒng)接受的物理內(nèi)存請(qǐng)求的數(shù)量。
[0017] 優(yōu)選的技術(shù)方案中,所述方法中當(dāng)存在垃圾回收機(jī)制時(shí),在統(tǒng)計(jì)周期內(nèi)android 系統(tǒng)先對(duì)當(dāng)前進(jìn)程進(jìn)行判斷,如果當(dāng)前進(jìn)程是垃圾回收進(jìn)程,則不進(jìn)行物理內(nèi)存分配數(shù)量 的統(tǒng)計(jì);否則進(jìn)行物理內(nèi)存分配數(shù)量的統(tǒng)計(jì)。
[0018] 本發(fā)明的另一目的在于提供一種降低android系統(tǒng)智能設(shè)備功耗的方法,其特征 在于所述方法包括按照前面所述的方法識(shí)別應(yīng)用程序的啟動(dòng)階段;根據(jù)識(shí)別的結(jié)果對(duì)內(nèi)存 分配策略和CPU頻率和電壓進(jìn)行調(diào)整的步驟。
[0019] 對(duì)Android應(yīng)用程序啟動(dòng)階段進(jìn)行辨識(shí)可以作為很多對(duì)Android功耗優(yōu)化的基礎(chǔ) 之一。應(yīng)用程序生命周期中不同的階段有不同的特征(比如內(nèi)存操作的行為、CPU使用的 行為等),根據(jù)不同階段間各自的特征進(jìn)行功耗優(yōu)化可以更有效地提升優(yōu)化效果,識(shí)別應(yīng)用 程序的啟動(dòng)階段和非啟動(dòng)階段正式這類優(yōu)化方案的基礎(chǔ)。
[0020] 從內(nèi)存需求量的角度,可以將應(yīng)用程序的生命周期劃分為三個(gè)階段:對(duì)內(nèi)存需求 的爆發(fā)期、對(duì)內(nèi)存需求的穩(wěn)定期以及對(duì)內(nèi)存需求的驟降期。而這三個(gè)階段分別對(duì)應(yīng)應(yīng)用程 序的啟動(dòng)、運(yùn)行和退出三個(gè)階段(如圖1所示)。因此,可以依據(jù)"應(yīng)用程序啟動(dòng)過程中對(duì)內(nèi) 存的需求存在'爆發(fā)式'增長(zhǎng)"這一性質(zhì)將應(yīng)用程序的啟動(dòng)階段同正常運(yùn)行階段區(qū)別開來。 如果某一時(shí)段應(yīng)用程序大量請(qǐng)求分配內(nèi)存,則可以判定為此時(shí)某一應(yīng)用程序正處于啟動(dòng)階 段。
[0021] 為了識(shí)別應(yīng)用程序的啟動(dòng)階段,可以對(duì)內(nèi)核中內(nèi)存分配函數(shù)進(jìn)行監(jiān)控,對(duì)某一時(shí) 段內(nèi)存分配請(qǐng)求數(shù)量進(jìn)行統(tǒng)計(jì),從而判斷系統(tǒng)中是否有應(yīng)用程序正處于啟動(dòng)階段。
[0022] 本發(fā)明識(shí)別應(yīng)用程序啟動(dòng)過程的方法主要通過以下技術(shù)問題的解決來獲得的: (1)根據(jù)Linux內(nèi)存管理系統(tǒng)正確統(tǒng)計(jì)應(yīng)用程序?qū)ξ锢韮?nèi)存的請(qǐng)求數(shù)量;(2)通過對(duì) Android系統(tǒng)中的垃圾回收算法進(jìn)行分析,排除GC進(jìn)程對(duì)應(yīng)用程序啟動(dòng)過程辨識(shí)的干擾; (3)使用平滑處理的方法保證應(yīng)用程序啟動(dòng)階段辨識(shí)的正確性。
[0023] 以下將對(duì)應(yīng)用程序啟動(dòng)階段的辨識(shí)過程進(jìn)行詳細(xì)描述:
[0024] (1)Linux內(nèi)存管理系統(tǒng)
[0025] Linux操作系統(tǒng)采用虛擬內(nèi)存管理技術(shù),使得每個(gè)進(jìn)程都有各自互不干涉的進(jìn)程 地址空間。該空間是塊大小為4G的線性虛擬空間,用戶所看到和接觸到的都是該虛擬內(nèi)存 地址,無法看到實(shí)際的物理內(nèi)存地址。
[0026] 在Linux系統(tǒng)中,應(yīng)用程序?qū)?nèi)存的請(qǐng)求分為兩個(gè)步驟。其中第一步是申請(qǐng)?zhí)摂M 內(nèi)存。創(chuàng)建進(jìn)程f〇rk()、程序載入execve ()