您好,登錄后才能下訂單哦!
小編給大家分享一下Linux中cpufreq機制的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
從 2.6.0 Linux 內核開始,您可以通過 CPUfreq 子系統動態調整處理器頻率。當處理器以較低的時鐘速度運行時,它們消耗的電能和產生的熱量也相對較少。時鐘速度的這種縮放可以控制系統在未全力運行時消耗較少電能。
cpufreq的核心功能,是通過調整CPU的電壓和頻率,來兼顧系統的性能和功耗。在不需要高性能時,降低電壓和頻率,以降低功耗;在需要高性能時,提高電壓和頻率,以提高性能。
對下,cpufreq基于clock、regulator、pmu等模塊實現頻率和電壓的控制。對上,cpufreq通過cpufreq core、cpufreq governor、cpufreq stats等模塊以sysfs的形式向用戶空間提供頻率的查詢、控制等接口。內部,cpufreq內部分為core、governor、drivers等模塊。
性能優先,CPU固定工作在其支持的最高頻率。
功耗優先,CPU固定工作在其支持的最低頻率。
系統將變頻策略的決策權交給用戶態應用程序,并提供了相應的接口供用戶態程序設置CPU 頻率。
按需動態調整CPU頻率, 只要CPU負載超過閾值up_threshold就會立即設置為最大頻率,其他時候根據負載計算出合適的頻率。
與ondemand不同,Conservative不是一味追求最高頻率,而是平滑地調整CPU頻率,頻率的升降是漸變式的。
基于內核任務調度觸發調頻callback。在callback函數中統計兩次調度之間CPU處于idle和busy的時間,計算出CPU負載調頻然后調頻。
schedutil也是基于內核任務調度觸發調頻callback,與interactive不同的是,schedutil使用的負載來自于內核使用任務負載跟蹤技術(PELT/WALT)估計出來的負載。
以下文件節點均可通過cat命令顯示
# ls /sys/devices/system/cpu/cpu0/cpufreq/
affected_cpus //當前策略作用于哪些online corecpuinfo_cur_freq //當前CPU硬件頻率cpuinfo_max_freq //CPU硬件支持的最低頻率cpuinfo_min_freq //CPU硬件支持的最高頻率cpuinfo_transition_latency //硬件支持的切換頻率最小間隔related_cpus //online和offline corescaling_available_frequencies //軟件支持的頻率列表scaling_available_governors //支持的策略列表scaling_cur_freq //軟件設置的當前頻率,通常與cpuinfo_cpus相同,如果出現硬件問題可能導致不一致scaling_driver //當前使用的driverscaling_governor //當前使用的governorscaling_max_freq //軟件governor設置的最高頻率scaling_min_freq //軟件governor設置的最低頻率scaling_setspeed //需將governor類型切換為userspace,才會出現,通過echo修改數值,會切換主頻
可以通過 echo配置scaling_governor,scaling_max_freq,scaling_min_freq 例如:echo 1400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
#CPU Frequency scalingCONFIG_CPU_FREQ=y #主開關#CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y #default gov任選某個宏打開即可,決定了cpufreq初始化使用的governor,后續可在init.rc修改文件結點#CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y#CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=yCONFIG_CPU_FREQ_STAT=y #維測開關,查看cpufreq統計信息:/sys/devices/system/cpu/cpu0/cpufreq/stats
cpufreq的初始化分為3大階段,依次是core層、governor層和drivers層。
初始化調頻通知鏈表,pure_initcall(init_cpufreq_transition_notifier_list)創建cpufreq文件結點,core_initcall(cpufreq_core_init)
使用cpufreq_register_governor接口注冊各個governor到鏈表中,,例如:
fs_initcall(cpufreq_gov_performance_init);fs_initcall(cpufreq_gov_powersave_init);fs_initcall(cpufreq_gov_userspace_init);fs_initcall(cpufreq_gov_dbs_init);fs_initcall(sugov_register);
drivers層的初始化在device_initcall或者late_initcall階段。需要完成以下主要任務:
以上是“Linux中cpufreq機制的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。