新闻资讯
Group news
青岛广盛源肥业有限公司    您的位置: 首页  >  新闻资讯  >  正文

了解Linux动态频率调节系统CPUFreq等问题

2019年10月12日 文章来源:网络整理 热度:60℃ 作者:刘英

随着技术的发展,我们对CPU的处理能力提出了越来越高的需求,芯片厂家也对制造工艺不断地提升。现在的主流PC处理器的主频已经在3GHz左右,就算是智能手机的处理器也已经可以工作在1.5GHz以上,可是我们并不是时时刻刻都需要让CPU工作在最高的主频上,尤其是移动设备和笔记本电脑,大部分时间里,CPU其实工作在轻负载状态下,我们知道:主频越高,功耗也越高。为了节省CPU的功耗和减少发热,我们有必要根据当前CPU的负载状态,动态地提供刚好足够的主频给CPU。在Linux中,内核的开发者定义了一套框架模型来完成这一目的,它就是CPUFreq系统。

1.  sysfs接口

我们先从CPUFreq提供的sysfs接口入手,直观地看看它提供了那些功能。以下是我的电脑输出的结果:

[plain] view plain copy

droidphone@990:~$ cd /sys/devices/system/cpu  

droidphone@990:/sys/devices/system/cpu$ ls  

cpu0  cpu3  cpu6     cpuidle     offline   power    release  

cpu1  cpu4  cpu7     kernel_max  online    present  uevent  

cpu2  cpu5  cpufreq  modalias    possible  probe  

所有与CPUFreq相关的sysfs接口都位于:/sys/devices/system/cpu下面,我们可以看到,8个cpu分别建立了一个自己的目录,从cpu0到cpu7,我们再看看offline和online以及present的内容:

[plain] view plain copy

droidphone@990:/sys/devices/system/cpu$ cat online  

0-7  

droidphone@990:/sys/devices/system/cpu$ cat offline  

8-15  

droidphone@990:/sys/devices/system/cpu$ cat present  

0-7  

droidphone@990:/sys/devices/system/cpu$  

online代表目前正在工作的cpu,输出显示编号为0-7这8个cpu在工作,offline代表目前被关掉的cpu,present则表示主板上已经安装的cpu,由输出可以看到,我的主板可以安装16个cpu(因为intel的超线程技术,其实物理上只是8个),第8-15号cpu处于关闭状态(实际上不存在,因为present只有0-7)。

接着往下看:

[plain] view plain copy

droidphone@990:/sys/devices/system/cpu/cpu0$ ls  

cache    cpuidle      microcode  power      thermal_throttle  uevent  

cpufreq  crash_notes  node0      subsystem  topology  

droidphone@990:/sys/devices/system/cpu/cpu0$ cd cpufreq/  

droidphone@990:/sys/devices/system/cpu/cpu0/cpufreq$ ls  

affected_cpus               related_cpus                   scaling_max_freq  

bios_limit                  scaling_available_frequencies  scaling_min_freq  

cpuinfo_cur_freq            scaling_available_governors    scaling_setspeed  

cpuinfo_max_freq            scaling_cur_freq               stats  

cpuinfo_min_freq            scaling_driver  

cpuinfo_transition_latency  scaling_governor  

droidphone@990:/sys/devices/system/cpu/cpu0/cpufreq$   

在我的电脑上,部分的值如下:

cpuinfo_cur_freq:   1600000

cpuinfo_max_freq:  3401000

cpuinfo_min_freq:   1600000

scaling_cur_freq:    1600000

scaling_max_freq:  3401000

scaling_min_freq:   1600000
所以,我的cpu0的最低运行频率是1.6GHz,最高是3.4GHz,目前正在运行的频率是1.6GHz,前缀cpuinfo代表的是cpu硬件上支持的频率,而scaling前缀代表的是可以通过CPUFreq系统用软件进行调节时所支持的频率。cpuinfo_cur_freq代表通过硬件实际上读到的频率值,而scaling_cur_freq则是软件当前的设置值,多数情况下这两个值是一致的,但是也有可能因为硬件的原因,有微小的差异。scaling_available_frequencies会输出当前软件支持的频率值,看看我的cpu支持那些频率:

[plain] view plain copy

droidphone@990:/sys/devices/system/cpu/cpu0/cpufreq$ cat scaling_available_frequencies   

3401000 3400000 3000000 2800000 2600000 2400000 2200000 2000000 1800000 1600000   

droidphone@990:/sys/devices/system/cpu/cpu0/cpufreq$   

Oh,从1.6GHz到3.4GHz,一共支持10挡的频率可供选择。scaling_available_governors则会输出当前可供选择的频率调节策略:

[plain] view plain copy

conservaTIve ondemand userspace powersave performance  

一共有5中策略供我们选择,那么当前系统选用那种策略?让我们看看:

[plain] view plain copy

dong@dong-990:/sys/devices/system/cpu/cpu0/cpufreq$ cat scaling_governor  

ondemand  

OK,我的系统当前选择ondemand这种策略,这种策略的主要思想是:只要cpu的负载超过某一个阀值,cpu的频率会立刻提升至最高,然后再根据实际情况降到合适的水平。详细的情况我们留在后面的章节中讨论。scaling_driver则会输出当前使用哪一个驱动来设置cpu的工作频率。

上一篇:Linux时间子系统中低分辨率定时器的原理和实现


下一篇:Linux ALSA声卡驱动之一:ALSA架构简介

友情链接
Links