<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux 2.6 內核中的電源管理技術(shù)

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

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

前言

本文引用地址:http://dyxdggzs.com/article/148223.htm

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

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

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

Cpufreq 的由來(lái)

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

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

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

Cpufreq 的設計和使用

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

圖 1. Cpufreq 的軟件結構

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


關(guān)鍵詞: 管理 技術(shù) 電源 內核 2.6 Linux

評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>