<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux 2.6 內(nèi)核中的電源管理技術(shù)

          Linux 2.6 內(nèi)核中的電源管理技術(shù)

          作者: 時(shí)間:2012-12-06 來(lái)源:網(wǎng)絡(luò) 收藏

          前言

          本文引用地址:http://www.ex-cimer.com/article/148223.htm

          本系列文章將結(jié)合近年來(lái)不斷在各種硬件(包括 CPU、芯片組、PCI Express 等各種最新總線標(biāo)準(zhǔn)以及外設(shè))上新增的節(jié)能.

          ? 及整個(gè) software stack (包括 kernel、middleware 以及各種用戶(hù)態(tài) utility)如何添加對(duì)這些創(chuàng)新的節(jié)能的支持這一角度,為讀者介紹 操作系統(tǒng)近幾年來(lái)在方面所取得的長(zhǎng)足進(jìn)步以及未來(lái)的發(fā)展方向.

          作為本系列文章的開(kāi)篇之作,首先要向大家介紹的是 cpufreq,它是 為了更好的支持近年來(lái)在各款主流CPU 處理器中出現(xiàn)的變頻而新增的一個(gè)子系統(tǒng).

          Cpufreq 的由來(lái)

          隨著 energy efficient computing 和 performance per watt 等概念的推廣以及高級(jí)配置與接口ACPI(Advanced Configuration and Power Interface)標(biāo)準(zhǔn)的發(fā)展,目前市場(chǎng)上的主流 CPU 都提供了對(duì)變頻(frequency scaling)技術(shù)的支持.例如Intel?處理器所支持的 Enhanced SpeedStep? 技術(shù)和 AMD? 處理器所支持的 PowerNow! ? 技術(shù),另外像最新的PowerPC?、arm?、SPARC? 和 SuperH? 等處理器中也提供了類(lèi)似的支持.參考資料中列出了當(dāng)前 Linux 內(nèi)核所支持的具備變頻技術(shù)的處理器.需要注意的是,這里要討論的變頻技術(shù)與大家以前所熟知的超頻是兩個(gè)不同的概念.超頻是指通過(guò)提高核心電壓等手段讓處理器工作在非標(biāo)準(zhǔn)頻率下的行為,這往往會(huì)造成 CPU 使用壽命縮短以及系統(tǒng)穩(wěn)定性下降等嚴(yán)重后果.

          而變頻技術(shù)是指CPU硬件本身支持在不同的頻率下運(yùn)行,系統(tǒng)在運(yùn)行過(guò)程中可以根據(jù)隨時(shí)可能發(fā)生變化的系統(tǒng)負(fù)載情況動(dòng)態(tài)在這些不同的運(yùn)行頻率之間進(jìn)行切換,從而達(dá)到對(duì)性能和功耗做到二者兼顧的目的.

          雖然多個(gè)處理器生產(chǎn)廠家都提供了對(duì)變頻技術(shù)的支持,但是其硬件實(shí)現(xiàn)和使用方法必然存在著細(xì)微甚至巨大的差別.這就使得每個(gè)處理器生產(chǎn)廠家都需要按照其特殊的硬件實(shí)現(xiàn)和使用方法向內(nèi)核中添加代碼,從而讓自己產(chǎn)品中的變頻技術(shù)在 Linux 中得到支持和使用.然而,這種內(nèi)核開(kāi)發(fā)模式所導(dǎo)致的后果是各個(gè)廠家的實(shí)現(xiàn)代碼散落在 Linux 內(nèi)核代碼樹(shù)的各個(gè)角落里,各種不同的實(shí)現(xiàn)之間沒(méi)有任何代碼是共享的,這給內(nèi)核的維護(hù)以及將來(lái)添加對(duì)新的產(chǎn)品的支持都帶來(lái)了巨大的開(kāi)銷(xiāo),并直接導(dǎo)致了 cpufreq 內(nèi)核子系統(tǒng)的誕生.實(shí)際上,正如前文所說(shuō),發(fā)明變頻技術(shù)的目的是為了能夠讓系統(tǒng)在運(yùn)行過(guò)程中隨時(shí)根據(jù)系統(tǒng)負(fù)載的變化動(dòng)態(tài)調(diào)整 CPU 的運(yùn)行頻率.這件事情可以分為兩個(gè)部分,一部分是“做什么”的問(wèn)題,另一部分是“怎么做”的問(wèn)題.“做什么”是指如何根據(jù)系統(tǒng)負(fù)載的動(dòng)態(tài)變化挑選出 CPU 合適的運(yùn)行頻率,而“怎么做”就是要按照選定的運(yùn)行頻率在選定的時(shí)間對(duì) CPU 進(jìn)行設(shè)置,使之真正工作在這一頻率上.這也就是我們?cè)谲浖O(shè)計(jì)中經(jīng)常會(huì)遇到的機(jī)制 mechanism 與策略 policy 的問(wèn)題,而設(shè)計(jì)良好的軟件會(huì)在架構(gòu)上保證二者是被清晰的隔離開(kāi)的并通過(guò)規(guī)范定義的接口進(jìn)行通信.

          Cpufreq 的設(shè)計(jì)和使用

          為了解決前文所提到的問(wèn)題,一個(gè)新的內(nèi)核子系統(tǒng)-- cpufreq 應(yīng)運(yùn)而生了.Cpufreq 為在Linux 內(nèi)核中更好的支持不同 CPU 的變頻技術(shù)提供了一個(gè)統(tǒng)一的設(shè)計(jì)框架,其軟件結(jié)構(gòu)如圖 1 所示.

          圖 1. Cpufreq 的軟件結(jié)構(gòu)

          如圖 1 所示,cpufreq 在設(shè)計(jì)上主要分為以下三個(gè)模塊:

          Cpufreq 模塊(cpufreq module)對(duì)如何在底層控制各種不同CPU 所支持的變頻技術(shù)以及如何在上層根據(jù)系統(tǒng)負(fù)載動(dòng)態(tài)選擇合適的運(yùn)行頻率進(jìn)行了封裝和抽象,并在二者之間定義了清晰的接口,從而在設(shè)計(jì)上完成了前文所提到的對(duì) mechanism 與policy 的分離.

          在 cpufreq 模塊的底層,各個(gè)CPU 生產(chǎn)廠商只需根據(jù)其變頻技術(shù)的硬件實(shí)現(xiàn)和使用方法提供與其 CPU 相關(guān)的變頻驅(qū)動(dòng)程序(CPU-specific drivers),例如 Intel 需要提供支持Enhanced SpeedStep 技術(shù)的 CPU 驅(qū)動(dòng)程序,而 AMD 則需要提供支持 PowerNow! 技術(shù)的 CPU 驅(qū)動(dòng)程序.

          在 cpufreq 模塊的上層,governor 作為選擇合適的目標(biāo)運(yùn)行頻率的決策者,根據(jù)一定的標(biāo)準(zhǔn)在適當(dāng)?shù)臅r(shí)刻選擇出 CPU 適合的運(yùn)行頻率,并通過(guò) cpufreq 模塊定義的接口操作底層與 CPU 相關(guān)的變頻驅(qū)動(dòng)程序,將 CPU 設(shè)置運(yùn)行在選定的運(yùn)行頻率上.

          目前最新的 Linux 內(nèi)核中提供了 performance 、powersave 、userspace、conservative 和 ondemand 五種 governors 供用戶(hù)選擇使用,它們?cè)谶x擇 CPU 合適的運(yùn)行頻率時(shí)使用的是各自不同的標(biāo)準(zhǔn)并分別適用于不同的應(yīng)用場(chǎng)景.用戶(hù)在同一時(shí)間只能選擇其中一個(gè) governor 使用,但是可以在系統(tǒng)運(yùn)行過(guò)程中根據(jù)應(yīng)用需求的變化而切換使用另一個(gè) governor .

          這種設(shè)計(jì)帶來(lái)的好處是使得 governor 和 CPU 相關(guān)的變頻驅(qū)動(dòng)程序的開(kāi)發(fā)可以相互獨(dú)立進(jìn)行,并在最大限度上實(shí)現(xiàn)代碼重用,內(nèi)核開(kāi)發(fā)人員在編寫(xiě)和試驗(yàn)新的 governor 時(shí)不會(huì)再陷入到某款特定 CPU 的變頻技術(shù)的硬件實(shí)現(xiàn)細(xì)節(jié)中去,而 CPU 生產(chǎn)廠商在向 Linux 內(nèi)核中添加支持其特定的 CPU 變頻技術(shù)的代碼時(shí)只需提供一個(gè)相對(duì)來(lái)說(shuō)簡(jiǎn)單了很多的驅(qū)動(dòng)程序,而不必考慮在各種不同的應(yīng)用場(chǎng)景中如何選擇合適的運(yùn)行頻率這些復(fù)雜的問(wèn)題.

          內(nèi)核中的 cpufreq 子系統(tǒng)通過(guò) sysfs 文件系統(tǒng)向上層應(yīng)用提供了用戶(hù)接口,對(duì)于系統(tǒng)中的每一個(gè) CPU 而言,其 cpufreq 的 sysfs 用戶(hù)接口位于 /sys/devices/system/cpu/cpuX/cpufreq/ 目錄下,其中 X 代表 processor id ,與 /proc/cpuinfo 中的信息相對(duì)應(yīng).以cpu0 為例,用戶(hù)一般會(huì)在該目錄下觀察到以下文件:

          $ ls -F /sys/devices/system/cpu/cpu0/cpufreq/

          affected_cpus

          cpuinfo_cur_freq

          cpuinfo_max_freq

          cpuinfo_min_freq

          ondemand/

          scaling_available_frequencies

          scaling_available_governors

          scaling_cur_freq

          scaling_driver

          scaling_governor

          scaling_max_freq

          scaling_min_freq

          stats/

          這其中的所有可讀文件都可以使用 cat 命令進(jìn)行讀操作,另外所有可寫(xiě)文件都可以使用 echo 命令進(jìn)行寫(xiě)操作.其中cpuinfo_max_freq 和 cpuinfo_min_freq 分別給出了CPU 硬件所支持的最高運(yùn)行頻率及最低運(yùn)行頻率, cpuinfo_cur_freq 則會(huì)從 CPU 硬件寄存器中讀取 CPU 當(dāng)前所處的運(yùn)行頻率.雖然 CPU 硬件支持多種不同的運(yùn)行頻率,但是在有些場(chǎng)合下用戶(hù)可以只選擇使用其中的一個(gè)子集,這種控制是通過(guò)scaling_max_freq 和 scaling_min_freq 進(jìn)行的.Governor在選擇合適的運(yùn)行頻率時(shí)只會(huì)在 scaling_max_freq 和scaling_min_freq 所確定的頻率范圍內(nèi)進(jìn)行選擇,這也就是scaling_available_frequencies 所顯示的內(nèi)容.與cpuinfo_cur_freq 不同, scaling_cur_freq 返回的是cpufreq 模塊緩存的 CPU 當(dāng)前運(yùn)行頻率,而不會(huì)對(duì) CPU 硬件寄存器進(jìn)行檢查. scaling_available_governors 會(huì)告訴用戶(hù)當(dāng)前有哪些 governors 可供用戶(hù)使用,而 scaling_driver 則會(huì)顯示該 CPU 所使用的變頻驅(qū)動(dòng)程序. Stats 目錄下給出了對(duì) CPU 各種運(yùn)行頻率的使用統(tǒng)計(jì)情況,例如 CPU 在各種頻率下的運(yùn)行時(shí)間以及在各種頻率之間的變頻次數(shù). Ondemand 目錄則與 ondemand governor 相關(guān),在后文會(huì)進(jìn)行相應(yīng)的介紹.

          通過(guò)以上的介紹,大家對(duì)如何使用 cpufreq 通過(guò) sysfs 提供的用戶(hù)接口已經(jīng)有了大致的了解,但是對(duì)于絕大部分用戶(hù)而言,逐一操作這些文件既費(fèi)力又耗時(shí).因此 Dominik 等人開(kāi)發(fā)了cpufrequtils 工具包[2],為用戶(hù)提供了更加簡(jiǎn)便的對(duì)內(nèi)核cpufreq 子系統(tǒng)的操作接口.通過(guò) cpufreq-info 的輸出,讀者可以很清楚的看到剛剛在上面介紹過(guò)的/sys/devices/system/cpu/cpuX/cpufreq/ 目錄下各個(gè)文件的內(nèi)容.

          $ cpufreq-info

          cpufrequtils 002: cpufreq-info (C) Dominik Brodowski

          2004-2006

          Report errors and bugs to linux@brodo.de>linux@brodo.de, please.

          analyzing CPU 0:

          driver: acpi-cpufreq

          CPUs which need to switch frequency at the same time:

          0 1

          hardware limits: 1000 MHz - 1.67 GHz

          available frequency steps: 1.67 GHz, 1.33 GHz, 1000

          MHz

          available cpufreq governors: userspace, conservative,

          ondemand, powersave, performance

          current policy: frequency should be within 1000 MHz

          and 1.67 GHz.

          The governor “ondemand” may decide which

          speed to use

          within this range.

          current CPU frequency is 1000 MHz.

          analyzing CPU 1:

          driver: acpi-cpufreq

          CPUs which need to switch frequency at the same time:

          0 1

          hardware limits: 1000 MHz - 1.67 GHz

          available frequency steps: 1.67 GHz, 1.33 GHz, 1000

          MHz

          available cpufreq governors: userspace, conservative,

          ondemand, powersave, performance

          current policy: frequency should be within 1000 MHz

          and 1.67 GHz.

          The governor “ondemand” may decide which

          speed to use

          within this range.

          current CPU frequency is 1000 MHz.

          Ondemand governor 的由來(lái)及其實(shí)現(xiàn)剛剛我們?cè)?cpufreq-info 的輸出中可以看到 cpufreq 子系統(tǒng)一共提供了五種 governors 供用戶(hù)選擇使用,它們分別是 userspace,conservative,ondemand,powersave 和performance.在最新的內(nèi)核中如果用戶(hù)不進(jìn)行額外設(shè)置的話,ondemand 會(huì)被作為默認(rèn)的 governor 使用.為了理解是什么原因造成了這種現(xiàn)狀,我們?cè)谶@里帶領(lǐng)讀者回顧一下 cpufreq 子系統(tǒng)中的governor在內(nèi)核中的開(kāi)發(fā)歷史.

          Cpufreq 作為一個(gè)子系統(tǒng)最早被加入到 Linux 內(nèi)核中時(shí)只配備了三個(gè)governors ,分別是performance、powersave 和userspace.當(dāng)用戶(hù)選擇使用 performance governor 時(shí),CPU會(huì)固定工作在其支持的最高運(yùn)行頻率上;當(dāng)用戶(hù)選擇使用powersave governor 時(shí),CPU會(huì)固定工作在其支持的最低運(yùn)行頻率上.因此這兩種 governors 都屬于靜態(tài) governor ,即在使用它們時(shí) CPU 的運(yùn)行頻率不會(huì)根據(jù)系統(tǒng)運(yùn)行時(shí)負(fù)載的變化動(dòng)態(tài)作出調(diào)整.這兩種 governors 對(duì)應(yīng)的是兩種極端的應(yīng)用場(chǎng)景,使用 performance governor 體現(xiàn)的是對(duì)系統(tǒng)高性能的最大追求,而使用 powersave governor 則是對(duì)系統(tǒng)低功耗的最大追求.雖然這兩種應(yīng)用需求確實(shí)存在,但大多數(shù)用戶(hù)在大部分時(shí)間里需要的是更加靈活的變頻策略.最早的 cpufreq 子系統(tǒng)通過(guò) userspace governor 為用戶(hù)提供了這種靈活性.正如它的名字一樣,使用 userspace governor 時(shí),系統(tǒng)將變頻策略的決策權(quán)交給了用戶(hù)態(tài)應(yīng)用程序,并提供了相應(yīng)的接口供用戶(hù)態(tài)應(yīng)用程序調(diào)節(jié) CPU 運(yùn)行頻率使用.通過(guò)使用 cpufrequtils 工具包中的 cpufreq-set 將 userspace 設(shè)置為 cpufreq 子系統(tǒng)所使用的 governor 后,我們可以看到與之前相比在 /sys/devices/system/cpu/cpuX/cpufreq/ 目錄下多出了一個(gè)名為 scaling_setspeed 的文件,這正是 userspace governor 所提供的特殊用戶(hù)接口.用戶(hù)可以通過(guò)向該文件寫(xiě)入任何一個(gè) scaling_available_frequencies 中所支持的運(yùn)行頻率,從而將 CPU 設(shè)置在該頻率下運(yùn)行.

          # cpufreq-set -g userspace

          # cat cpuinfo_cur_freq

          1000000

          # cat scaling_available_frequencies

          1667000 1333000 1000000

          # echo 1333000 >scaling_setspeed

          # cat cpuinfo_cur_freq

          1333000

          剛剛提到在使用 userspace governor 時(shí),系統(tǒng)將變頻策略的決策權(quán)交給了用戶(hù)態(tài)應(yīng)用程序.該用戶(hù)態(tài)應(yīng)用程序一般是一個(gè) daemon 程序,每隔一定的時(shí)間間隔收集一次系統(tǒng)信息并根據(jù)系統(tǒng)的負(fù)載情況使用 userspace governor 提供的 scaling_setspeed 接口動(dòng)態(tài)調(diào)整 CPU 的運(yùn)行頻率.作為這個(gè)daemon 程序,當(dāng)時(shí)在幾個(gè)主要的 Linux 發(fā)行版中使用的一般是 powersaved 或者 cpuspeed.這兩個(gè) daemon 程序一般每隔幾秒鐘統(tǒng)計(jì)一次 CPU 在這個(gè)采樣周期內(nèi)的負(fù)載情況,并根據(jù)統(tǒng)計(jì)結(jié)果調(diào)整 CPU 的運(yùn)行頻率.這種 userspace governor 加用戶(hù)態(tài) daemon 程序的變頻方法雖然為用戶(hù)提供了一定的靈活性,但通過(guò)開(kāi)源社區(qū)的廣泛使用所得到的意見(jiàn)反饋逐漸暴露了這種方法的兩個(gè)嚴(yán)重缺陷.第一個(gè)是性能方面的問(wèn)題.例如powersaved 每隔五秒鐘進(jìn)行一次系統(tǒng)負(fù)載情況的采樣分析的話,我們可以分析一下在下面給出的應(yīng)用場(chǎng)景中的用戶(hù)體驗(yàn).假設(shè) powersaved 的采樣分析剛剛結(jié)束,而且由于在剛剛結(jié)束的采樣周期內(nèi)系統(tǒng)負(fù)載很低,CPU 被設(shè)置在最低頻率上運(yùn)行.這時(shí)用戶(hù)如果打開(kāi) Firefox? 等對(duì) CPU 運(yùn)算能力要求相當(dāng)高的程序的話,powersaved 要在下一個(gè)采樣點(diǎn)--大約五秒鐘之后才有機(jī)會(huì)觀察到這種提高 CPU 運(yùn)行頻率的需求.也就是說(shuō),在Firefox 啟動(dòng)之初的五秒鐘內(nèi) CPU 的計(jì)算能力并沒(méi)有被充分發(fā)揮出來(lái),這無(wú)疑會(huì)使用戶(hù)體驗(yàn)大打折扣.第二個(gè)是系統(tǒng)負(fù)載情況的采樣分析的準(zhǔn)確性問(wèn)題.將監(jiān)控系統(tǒng)負(fù)載情況并對(duì)未來(lái) CPU 的性能需求做出判斷的任務(wù)交給一個(gè)用戶(hù)態(tài)程序完成實(shí)際上并不合理,一方面是由于一個(gè)用戶(hù)態(tài)程序很難完整的收集到所有需要的信息,因?yàn)檫@些信息大部分都保存在內(nèi)核空間;另一方面一個(gè)用戶(hù)態(tài)程序如果想要收集這些系統(tǒng)信息,必然需要進(jìn)行用戶(hù)態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互,而頻繁的用戶(hù)態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互又會(huì)給系統(tǒng)性能帶來(lái)負(fù)面影響.

          那么這兩個(gè)問(wèn)題有沒(méi)有解決的方法呢?應(yīng)該講社區(qū)中的開(kāi)發(fā)人員就第二個(gè)問(wèn)題比較容易達(dá)成一致,既然在用戶(hù)態(tài)對(duì)系統(tǒng)的負(fù)載情況進(jìn)行采集和分析存在這樣那樣的問(wèn)題,那么更加合理的做法就是應(yīng)該將這部分工作交由內(nèi)核負(fù)責(zé).但是第一個(gè)問(wèn)題呢?第一個(gè)問(wèn)題最直觀的解決方案就是降低對(duì)系統(tǒng)負(fù)載進(jìn)行采樣分析的時(shí)間間隔,這樣 powersaved 就能盡早的對(duì)系統(tǒng)負(fù)載的變化做出及時(shí)的響應(yīng).然而這種簡(jiǎn)單的降低采樣分析的時(shí)間間隔的方案同樣存在著兩方面的問(wèn)題,一方面這意味著更加頻繁的用戶(hù)態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互,因此必然也就意味著對(duì)系統(tǒng)性能帶來(lái)更大的負(fù)面影響;另一方面的主要原因在于當(dāng)時(shí)各個(gè) CPU 生產(chǎn)廠家的變頻技術(shù)在硬件上仍不完善,具體體現(xiàn)就是在對(duì) CPU 進(jìn)行變頻設(shè)置時(shí)所需的操作時(shí)間過(guò)長(zhǎng),例如 Intel 早期的 Speedstep 技術(shù)在對(duì) CPU 進(jìn)行變頻設(shè)置時(shí)需要耗時(shí) 250 微秒,在此過(guò)程中 CPU 無(wú)法正常執(zhí)行指令.讀者如果簡(jiǎn)單的計(jì)算一下不難發(fā)現(xiàn),即使對(duì)于一個(gè)主頻為 1GHz 的 CPU 而言, 250 微秒也意味著 250,000 個(gè)時(shí)鐘周期,在這期間 CPU 完全可以執(zhí)行完上萬(wàn)條指令.因此從這個(gè)角度而言,簡(jiǎn)單的降低采樣分析的時(shí)間間隔對(duì)系統(tǒng)性能帶來(lái)的負(fù)面影響更加嚴(yán)重.幸運(yùn)的是隨著硬件技術(shù)的不斷完善和改進(jìn),對(duì) CPU 進(jìn)行變頻設(shè)置所需的操作時(shí)間已經(jīng)顯著降低,例如 Intel 最新的 Enhanced Speedstep 技術(shù)在對(duì) CPU 進(jìn)行變頻設(shè)置時(shí)耗時(shí)已降至 10 微秒,下降了不止一個(gè)數(shù)量級(jí).正是這種 CPU 硬件技術(shù)的發(fā)展為內(nèi)核開(kāi)發(fā)人員解決這些早期的遺留問(wèn)題提供了契機(jī),Venkatesh 等人提出并設(shè)計(jì)實(shí)現(xiàn)了一個(gè)新的名為 ondemand 的 governor ,它正是人們長(zhǎng)期以來(lái)希望看到的一個(gè)完全在內(nèi)核態(tài)下工作并且能夠以更加細(xì)粒度的時(shí)間間隔對(duì)系統(tǒng)負(fù)載情況進(jìn)行采樣分析的 governor.在介紹 ondemand governor 的具體實(shí)現(xiàn)之前,我們先來(lái)看一下如何使用 ondemand governor 及其向用戶(hù)提供了哪些操作接口.通過(guò) cpufreq-set 將 ondemand 設(shè)置為當(dāng)前所使用的 governor 之后,在 /sys/devices/system/cpu/cpuX/cpufreq 目錄下會(huì)出現(xiàn)一個(gè)名為 ondemand 的子目錄

          $ sudo cpufreq-set -g ondemand

          $ ls /sys/devices/system/cpu/cpu0/cpufreq/ondemand/

          ignore_nice_load

          powersave_bias

          sampling_rate

          sampling_rate_max

          sampling_rate_min

          up_threshold

          $ sudo cat sampling_rate_min sampling_rate

          sampling_rate_max

          40000

          80000

          40000000

          $ sudo cat up_threshold

          30

          在這個(gè)子目錄下名字以 sampling 打頭的三個(gè)文件分別給出了ondemand governor 允許使用的最短采樣間隔,當(dāng)前使用的采樣間隔以及允許使用的最長(zhǎng)采樣間隔,三者均以微秒為單位.

          以筆者的電腦為例, ondemand governor 每隔 80 毫秒進(jìn)行一次采樣.另外比較重要的一個(gè)文件是 up_threshold ,它表明了系統(tǒng)負(fù)載超過(guò)什么百分比時(shí)ondemand governor 會(huì)自動(dòng)提高CPU 的運(yùn)行頻率.以筆者的電腦為例,這個(gè)數(shù)值為 30% .那么這個(gè)表明系統(tǒng)負(fù)載的百分比數(shù)值是如何得到的呢?在支持Intel 最新的 Enhanced Speedstep 技術(shù)的 CPU 中,在處理器硬件中直接提供了兩個(gè) MSR 寄存器(Model Specific Register)供 ondemand governor 采樣分析系統(tǒng)負(fù)載情況使用.這兩個(gè) MSR 寄存器的 名字分別為 IA32_MPERF 和 IA32_APERF[5] ,其中 IA32_MPERF MSR 中的 MPERF 代表Maximum Performance , IA32_APERF MSR 中的 APERF 代表Actual Performance .就像這兩個(gè) MSR 的名字一樣, IA32_MPERF MSR 寄存器是一個(gè)當(dāng) CPU 處在 ACPI C0 狀態(tài)下時(shí)按照 CPU 硬件支持的最高運(yùn)行頻率每隔一個(gè)時(shí)鐘周期加一的計(jì)數(shù)器;IA32_APERF MSR 寄存器是一個(gè)當(dāng) CPU 處在 ACPI C0 狀態(tài)下時(shí)按照 CPU 硬件當(dāng)前的實(shí)際運(yùn)行頻率每隔一個(gè)時(shí)鐘周期加一的計(jì)數(shù)器.有了這兩個(gè)寄存器的存在,再考慮上 CPU 處于ACPI C0 和處于 ACPI C1、C2、C3 三種狀態(tài)下的時(shí)間比例,也就是 CPU 處于工作狀態(tài)和休眠狀態(tài)的時(shí)間比例, ondemand governor 就可以準(zhǔn)確的計(jì)算出 CPU 的負(fù)載情況了.

          得到了 CPU 的負(fù)載情況,接下來(lái)的問(wèn)題就是如何選擇 CPU 合適的運(yùn)行頻率了.剛剛在前面提到,當(dāng)系統(tǒng)負(fù)載超過(guò)up_threshold 所設(shè)定的百分比時(shí), ondemand governor 將會(huì)自動(dòng)提高 CPU 的運(yùn)行頻率,但是具體提高到哪個(gè)頻率上運(yùn)行呢?在 ondemand governor 監(jiān)測(cè)到系統(tǒng)負(fù)載超過(guò) up_threshold所設(shè)定的百分比時(shí),說(shuō)明用戶(hù)當(dāng)前需要 CPU 提供更強(qiáng)大的處理能力,因此 ondemand governor 會(huì)將CPU設(shè)置在最高頻率上運(yùn)行,這一點(diǎn)社區(qū)中的開(kāi)發(fā)人員和廣大用戶(hù)都沒(méi)有任何異議.但是當(dāng) ondemand governor 監(jiān)測(cè)到系統(tǒng)負(fù)載下降,可以降低 CPU 的運(yùn)行頻率時(shí),到底應(yīng)該降低到哪個(gè)頻率呢? 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)頻率.這種降頻策略的主導(dǎo)思想是盡量減小對(duì)系統(tǒng)性能的負(fù)面影響,從而不會(huì)使得系統(tǒng)性能在短時(shí)間內(nèi)迅速降低以影響用戶(hù)體驗(yàn).但是在 ondemand governor 的這種最初實(shí)現(xiàn)版本在社區(qū)發(fā)布后,大量用戶(hù)的使用結(jié)果表明這種擔(dān)心實(shí)際上是多余的, ondemand governor 在降頻時(shí)對(duì)于目標(biāo)頻率的選擇完全可以更加激進(jìn).因此最新的 ondemand governor 在降頻時(shí)會(huì)在所有可選頻率中一次性選擇出可以保證 CPU 工作在 80% 以上負(fù)荷的頻率,當(dāng)然如果沒(méi)有任何一個(gè)可選頻率滿(mǎn)足要求的話則會(huì)選擇 CPU 支持的最低運(yùn)行頻率.大量用戶(hù)的測(cè)試結(jié)果表明這種新的算法可以在不影響系統(tǒng)性能的前提下做到更高效的節(jié)能.在算法改進(jìn)后, ondemand governor 的名字并沒(méi)有改變,而 ondemand governor 最初的實(shí)現(xiàn)也保存了下來(lái),并且由于其算法的保守性而得名conservative .

          支持 Intel Enhanced Speedstep 技術(shù)的 CPU 驅(qū)動(dòng)程序的實(shí)現(xiàn)前文在討論cpufreq 的軟件結(jié)構(gòu)時(shí)已經(jīng)指出, cpufreq 從設(shè)計(jì)上將 CPU 變頻的 policy 與mechanism 分離開(kāi)來(lái)并由上層的governor 負(fù)責(zé)決定 CPU 合適的工作頻率.但是在governor根據(jù)系統(tǒng)負(fù)載的變化決定調(diào)整 CPU 的運(yùn)行頻率時(shí),最終還是需要底層與 CPU 相關(guān)的特定驅(qū)動(dòng)程序完成設(shè)置 CPU 運(yùn)行頻率的任務(wù).這里向讀者介紹一下支持 Intel 最新的Enhanced Speedstep 技術(shù)的 CPU 驅(qū)動(dòng)程序的實(shí)現(xiàn)原理,關(guān)注的重點(diǎn)是如何對(duì) CPU 進(jìn)行變頻設(shè)置.實(shí)際上支持 Intel Enhanced Speedstep 技術(shù)的處理器為用戶(hù)提供了非常簡(jiǎn)單的編程接口,對(duì) CPU 運(yùn)行頻率進(jìn)行設(shè)置是通過(guò)一個(gè)名為 IA32_PERF_CTL 的MSR 寄存器進(jìn)行的,另外還有一個(gè)名為 IA32_PERF_STATUS 的MSR 寄存器可供檢查 CPU 當(dāng)前所處的運(yùn)行頻率.當(dāng)用戶(hù)需要對(duì)CPU 運(yùn)行頻率進(jìn)行設(shè)置時(shí)只需按照 Intel 開(kāi)發(fā)手冊(cè)的說(shuō)明向IA32_PERF_CTL MSR 寄存器中寫(xiě)入規(guī)定的數(shù)值即可.

          總結(jié)及未來(lái)的發(fā)展方向

          本文為讀者介紹了變頻技術(shù)在 CPU 硬件上的出現(xiàn)以及 Linux 內(nèi)核中最初的實(shí)現(xiàn)存在的各種問(wèn)題,并由此導(dǎo)致了 cpufreq 這一新的內(nèi)核子系統(tǒng)的誕生.雖然早期的cpufreq模塊所提供的三種 governors 能夠在一定程度下滿(mǎn)足用戶(hù)的需要并且提供了一定的靈活性,但是由于受到當(dāng)時(shí) CPU 硬件技術(shù)水平的限制,仍然有很多不盡如人意的地方.之后隨著 CPU 變頻硬件技術(shù)的不斷發(fā)展,尤其是 Intel Enhanced Speedstep 技術(shù)的出現(xiàn),原有的技術(shù)障礙被打破,隨之而來(lái)的是 cpufreq 內(nèi)核子系統(tǒng)有了一個(gè)全新的更加完善而高效的 ondemand governor .

          由此不難看出,內(nèi)核中的 cpufreq 子系統(tǒng)是由于 CPU 硬件變頻技術(shù)的出現(xiàn)而出現(xiàn),同時(shí)也在隨著 CPU 硬件變頻技術(shù)的發(fā)展而發(fā)展.這其實(shí)也預(yù)示著內(nèi)核中 cpufreq 子系統(tǒng)未來(lái)的發(fā)展方向,即繼續(xù)跟隨 CPU 硬件變頻技術(shù)的發(fā)展腳步與時(shí)俱進(jìn).在本文的最后簡(jiǎn)單為讀者介紹一下在 Intel 最新的 CPU 中針對(duì)硬件變頻支持的一項(xiàng)新技術(shù).前文提到在支持 Intel 最新的Enhanced Speedstep 技術(shù)的 CPU 中提供了名字分別為IA32_MPERF 和 IA32_APERF 的兩個(gè) MSR 寄存器,以便為cpufreq 模塊所使用的 governor 動(dòng)態(tài)收集系統(tǒng)的負(fù)載情況提供直接的硬件支持.其中 IA32_APERF MSR 寄存器當(dāng) CPU 處在ACPI C0 狀態(tài)下時(shí)按照 CPU 硬件當(dāng)前的實(shí)際運(yùn)行頻率每隔一個(gè)時(shí)鐘周期加一. Intel 最新的處理器中進(jìn)一步考慮了CPU 在運(yùn)行過(guò)程中由于訪問(wèn)內(nèi)存或 IO 等原因可能會(huì)出現(xiàn)流水線停擺的狀況時(shí), IA32_APERF 以前這種簡(jiǎn)單的按照 CPU 當(dāng)前實(shí)際運(yùn)行頻率每隔一個(gè)時(shí)鐘周期加一的做法并不能完全準(zhǔn)確的反映CPU 的負(fù)載情況.在 Intel 最新的處理器中如果出現(xiàn)流水線停擺的情況, IA32_APERF 將暫時(shí)停止累加,而是在對(duì)用戶(hù)真正“有用”的時(shí)間周期才會(huì)遞增,這樣 CPU 硬件就可以為cpufreq 模塊所使用的 governor 提供比以前更加準(zhǔn)確的系統(tǒng)負(fù)載統(tǒng)計(jì)信息.

          linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();