如圖 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 供用戶選擇使用,它們?cè)谶x擇 CPU 合適的運(yùn)行頻率時(shí)使用的是各自不同的標(biāo)準(zhǔn)并分別適用于不同的應(yīng)用場(chǎng)景。用戶在同一時(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)用提供了用戶接口,對(duì)于系統(tǒng)中的每一個(gè) CPU 而言,其 cpufreq 的 sysfs 用戶接口位于 /sys/devices/system/cpu/cpuX/cpufreq/ 目錄下,其中 X 代表 processor id ,與 /proc/cpuinfo 中的信息相對(duì)應(yīng)。以 cpu0 為例,用戶一般會(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)合下用戶可以只選擇使用其中的一個(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ì)告訴用戶當(dāng)前有哪些 governors 可供用戶使用,而 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 提供的用戶接口已經(jīng)有了大致的了解,但是對(duì)于絕大部分用戶而言,逐一操作這些文件既費(fèi)力又耗時(shí)。因此 Dominik 等人開(kāi)發(fā)了 cpufrequtils 工具包[2],為用戶提供了更加簡(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, 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è)?nbsp;cpufreq-info 的輸出中可以看到 cpufreq 子系統(tǒng)一共提供了五種 governors 供用戶選擇使用,它們分別是 userspace,conservative,ondemand,powersave 和 performance。在最新的內(nèi)核中如果用戶不進(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)用戶選擇使用 performance governor 時(shí),CPU會(huì)固定工作在其支持的最高運(yùn)行頻率上;當(dāng)用戶選擇使用 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ù)用戶在大部分時(shí)間里需要的是更加靈活的變頻策略。最早的 cpufreq 子系統(tǒng)通過(guò) userspace governor 為用戶提供了這種靈活性。正如它的名字一樣,使用 userspace governor 時(shí),系統(tǒng)將變頻策略的決策權(quán)交給了用戶態(tài)應(yīng)用程序,并提供了相應(yīng)的接口供用戶態(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 所提供的特殊用戶接口。用戶可以通過(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)交給了用戶態(tài)應(yīng)用程序。該用戶態(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 加用戶態(tài) daemon 程序的變頻方法雖然為用戶提供了一定的靈活性,但通過(guò)開(kāi)源社區(qū)的廣泛使用所得到的意見(jiàn)反饋逐漸暴露了這種方法的兩個(gè)嚴(yán)重缺陷。第一個(gè)是性能方面的問(wèn)題。例如 powersaved 每隔五秒鐘進(jìn)行一次系統(tǒng)負(fù)載情況的采樣分析的話,我們可以分析一下在下面給出的應(yīng)用場(chǎng)景中的用戶體驗(yàn)。假設(shè) powersaved 的采樣分析剛剛結(jié)束,而且由于在剛剛結(jié)束的采樣周期內(nèi)系統(tǒng)負(fù)載很低,CPU 被設(shè)置在最低頻率上運(yùn)行。這時(shí)用戶如果打開(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ì)使用戶體驗(yàn)大打折扣。第二個(gè)是系統(tǒng)負(fù)載情況的采樣分析的準(zhǔn)確性問(wèn)題。將監(jiān)控系統(tǒng)負(fù)載情況并對(duì)未來(lái) CPU 的性能需求做出判斷的任務(wù)交給一個(gè)用戶態(tài)程序完成實(shí)際上并不合理,一方面是由于一個(gè)用戶態(tài)程序很難完整的收集到所有需要的信息,因?yàn)檫@些信息大部分都保存在內(nèi)核空間;另一方面一個(gè)用戶態(tài)程序如果想要收集這些系統(tǒng)信息,必然需要進(jìn)行用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互,而頻繁的用戶態(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á)成一致,既然在用戶態(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)題,一方面這意味著更加頻繁的用戶態(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 及其向用戶提供了哪些操作接口。通過(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ō)明用戶當(dāng)前需要 CPU 提供更強(qiáng)大的處理能力,因此 ondemand governor 會(huì)將CPU設(shè)置在最高頻率上運(yùn)行,這一點(diǎn)社區(qū)中的開(kāi)發(fā)人員和廣大用戶都沒(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)迅速降低以影響用戶體驗(yàn)。但是在 ondemand governor 的這種最初實(shí)現(xiàn)版本在社區(qū)發(fā)布后,大量用戶的使用結(jié)果表明這種擔(dān)心實(shí)際上是多余的, ondemand governor 在降頻時(shí)對(duì)于目標(biāo)頻率的選擇完全可以更加激進(jìn)。因此最新的 ondemand governor 在降頻時(shí)會(huì)在所有可選頻率中一次性選擇出可以保證 CPU 工作在 80% 以上負(fù)荷的頻率,當(dāng)然如果沒(méi)有任何一個(gè)可選頻率滿足要求的話則會(huì)選擇 CPU 支持的最低運(yùn)行頻率。大量用戶的測(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ù)的處理器為用戶提供了非常簡(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)用戶需要對(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 能夠在一定程度下滿足用戶的需要并且提供了一定的靈活性,但是由于受到當(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ì)用戶真正“有用”的時(shí)間周期才會(huì)遞增,這樣 CPU 硬件就可以為 cpufreq 模塊所使用的 governor 提供比以前更加準(zhǔn)確的系統(tǒng)負(fù)載統(tǒng)計(jì)信息。
北京2022年10月18日 /美通社/ -- 10月14日,國(guó)際數(shù)據(jù)公司(IDC)發(fā)布《2022Q2中國(guó)軟件定義存儲(chǔ)及超融合市場(chǎng)研究報(bào)告》,報(bào)告顯示:2022年上半年浪潮超融合銷售額同比增長(zhǎng)59.4%,近5倍于...
關(guān)鍵字: IDC BSP 數(shù)字化 數(shù)據(jù)中心東京2022年10月18日 /美通社/ -- NIPPON EXPRESS HOLDINGS株式會(huì)社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團(tuán)公司上海通運(yùn)國(guó)際物流有限公司(Nipp...
關(guān)鍵字: 溫控 精密儀器 半導(dǎo)體制造 BSP要問(wèn)機(jī)器人公司哪家強(qiáng),波士頓動(dòng)力絕對(duì)是其中的佼佼者。近來(lái)年該公司在機(jī)器人研發(fā)方面獲得的一些成果令人印象深刻,比如其開(kāi)發(fā)的機(jī)器人會(huì)后空翻,自主爬樓梯等。這不,波士頓動(dòng)力又發(fā)布了其機(jī)器人組團(tuán)跳男團(tuán)舞的新視頻,表演的機(jī)器人包括...
關(guān)鍵字: 機(jī)器人 BSP 工業(yè)機(jī)器人 現(xiàn)代汽車