Linux内核中CPU主频和电压调整 -- (2)

从文章 Linux内核中CPU主频和电压调整 -- (1)  中已经知道,在目录/sys/devices/system/cpu/cpu0/cpufreq/下可以设置cpu0的频率及其相关的信息。

于是我参考开源程序osdcpufreq,进一步做了修改,该开源程序的下载地址为http://sourceforge.net/projects/osdcpufreq/files/osdcpufreq/osdcpufreq-0.3/

主要膝盖的内容包括两点:

(1)将xosd图形显示的程序屏蔽掉了,在Ubuntu12.04系统下不知道为什么,装不上xosd

(2)可以采用命令行的形式,输入频率值等信息,从而更新/sys/devices/system/cpu/cpu0/cpufreq/下的值

详细的程序如下:

1,获取cpu信息,注意格式化的操作

void get_cpu_info(cpufreq_info_struct *cpufreq_info, char cpu_num) {
    char file[54];    
    FILE *fp;

    sprintf(file, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu_num);
    
    fp = fopen (file, "r");
    if (fp == NULL ) {
        printf("Error reading scaling_cur_freq file. ");
        printf("%s",CPUFREQD_ERROR);
        printf("%s",CONTACT_ERROR);
        exit(1);
    } else {
        fscanf (fp,"%i",&(cpufreq_info->cur_freq));
        printf("scaling_cur_freq = %d\n", cpufreq_info->cur_freq);
        fclose (fp);
    }


2,设置cpu信息,本人添加的程序,修改了scaling_governor(模式)和scaling_setspeed(频率)的值

//set cpu infomation
void set_cpu_info(cpufreq_info_struct *cpufreq_info, char cpu_num)
{
    char file[54];    
    FILE *fp;
    char str[20];

    sprintf(file, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpu_num);
    
    fp = fopen (file, "w");
    if (fp == NULL ) {
        printf("Error reading scaling_governor file. ");
        printf("%s",CPUFREQD_ERROR);
        printf("%s",CONTACT_ERROR);
        exit(1);
    } else {
        fprintf(fp,"%s",cpufreq_info->governor);
        fclose (fp);
    }
    
    sprintf(file, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_setspeed", cpu_num);
    
    fp = fopen (file, "w");
    if (fp == NULL ) {
        printf("Error reading scaling_setspeed file. ");
        printf("%s",CPUFREQD_ERROR);
        printf("%s",CONTACT_ERROR);
        exit(1);
    } else {
        sprintf(str,"%d",cpufreq_info->set_speed);
        fprintf(fp,"%s",str);
        fclose (fp);
    }
    
    printf("exit set_cpu_info\n");
}


3,获取conf文件里面的初始化参数

void configure(config_struct *config) {
    char line[256];
    char value[64];
    char *the_home;
    char config_file[48];
    int chars_number, i;
    FILE *fp;
    
    /* getting user home directory */
    the_home =getenv("HOME");
    sprintf(config_file, "%s/%s",the_home,FILE_CONF);

    /* Load default values. If user doesn't set properly one or more values,
     * or if no config file found, I use program default values  */
    config->cpu_num = 0;
    config->align = 2;
    config->vertical_offset = 5;
    config->horizontal_offset = 5;
    strncpy(config->font, "-misc-fixed-medium-r-semicondensed--*-*-*-*-c-*-*-*", 63);
    strncpy(config->colour, "green", 63);
    config->shadow_offset = 1;
    strncpy(config->shadow_colour, "black", 63);
    config->bar_length = 52;
    config->on_time = 3;
    config->refresh = 1;
    

    fp = fopen(config_file,"r");
    if (fp == NULL) {
        printf("WARNING: no config file found at %s, using default settings.\n\n", config_file);
    }
    else {
        while (!feof(fp)) {

            /* get a line of the config file */
            if (fgets(line, 256, fp) == NULL) {
                fclose(fp);
                break;
            }

            /* Delete ' ' chars at the start of a line */
            while (*line==' ') {
                chars_number=strlen(line);
                for (i=0;i<=chars_number;i++)
                    *(line+i)=*(line+i+1);
            }

            /* set config values from the config file */    
            if (*line!='#') { //uncommented lines

                if (sscanf(line, "display cpu = %s", value) != errno)
                    config->cpu_num = atoi(value);
                
                if (sscanf(line, "align = %s", value) != errno)
                    config->align = atoi(value);

                if (sscanf(line, "vertical offset = %s", value) != errno)
                    config->vertical_offset = atoi(value);    
                
                if (sscanf(line, "horizontal offset = %s", value) != errno)
                    config->horizontal_offset = atoi(value);    

                if (sscanf(line, "font = %s", value) != errno)
                    strcpy(config->font, value);

                if (sscanf(line, "colour = %s", value) != errno)
                    strcpy(config->colour, value);

                if (sscanf(line, "shadow offset = %s", value) != errno)
                    config->shadow_offset = atoi(value);

                if (sscanf(line, "shadow colour = %s", value) != errno)
                    strcpy(config->shadow_colour, value);

                if (sscanf(line, "bar length = %s", value) != errno)
                    config->bar_length = atoi(value);

                if (sscanf(line, "on time = %s", value) != errno)
                    config->on_time = atoi(value);    

                if (sscanf(line, "refresh = %s", value) != errno)
                    config->refresh = atoi(value);

        //    printf("%s",line); //Debug info: show cleared config file

            }
        }
     }
}

4,帮助文件,键入指令之前需要参考的内容

//command lines help
void help(void)
{
    printf("-g scaling_governor: conservative ondemand userspace powersave performance\n");  
    printf("-s scaling_set_speed: uint KHZ\n");
    printf("example:./osdcpufreq -g userspace -s 3300000\n");
    printf("example:./osdcpufreq -g performance\n");
}

5,主函数

int main (int argc, char *argv[] ) {
    cpufreq_info_struct *cpufreq_info;
    cpufreq_info_struct *cpufreq_next_info;// from command lines
    config_struct *config;
    char freq_perc;
    /* OSD drawing vars */
    //xosd *osd = NULL;
    char *string;


    /* Parse configuration (file or default values) */
    config=malloc(sizeof(config_struct));
    if (config == NULL) {
        printf("Error: malloc failed. Can't allocate dinamic memory for config.\n");
        printf ("%s", CONTACT_ERROR);
        exit(1);
    }
    configure(config);
    
    /* Allocate dinamic memory for cpufreq_next_info */
    cpufreq_next_info=malloc(sizeof(cpufreq_info_struct));
    if (cpufreq_next_info==NULL) {
        printf ("Error: malloc failed. Can't allocate dinamic memory for cpufreq_next_info.\n");
        printf ("%s", CONTACT_ERROR);
        exit(1);
    }
    
    /* Allocate dinamic memory for cpufreq_info */
    cpufreq_info=malloc(sizeof(cpufreq_info_struct));
    if (cpufreq_info==NULL) {
        printf ("Error: malloc failed. Can't allocate dinamic memory for cpufreq_info.\n");
        printf ("%s", CONTACT_ERROR);
        exit(1);
    }

    //get current cpu infomation
    printf ("/------cpu current infomation------------------------------------------/\n");
    get_cpu_info(cpufreq_info,config->cpu_num);
    
    //see current cpu infomation, compare the next set infomation
    getchar();
    
    //Parse the command lines,set cpu
    printf ("/------set cpu infomation-----------------------------------------------/\n");
    int opt = 0;  
    opt = getopt( argc, argv, "hg:s:");  
    while( opt != -1 )  
    {  
        switch( opt )  
        {  
            case 'h':  
                printf("help\n");  
                help();
                break;    
            case 'g':  
                strcpy(cpufreq_next_info->governor,optarg);
                printf("cpufreq_next_info->governor:%s\n",cpufreq_next_info->governor);  
                break;  
            case 's':
                cpufreq_next_info->set_speed = atoi (optarg);
                printf("cpufreq_next_info->set_speed:%d\n",cpufreq_next_info->set_speed);
                break;
            default:  
                printf("def\n");  
                break;    
        }  
        opt = getopt( argc, argv, "hg:s:");                    
    }  
    
    set_cpu_info(cpufreq_next_info, config->cpu_num);
            
    //set completed, then again get current cpu infomation
    printf ("/------cpu current infomation------------------------------------------/\n");
    get_cpu_info(cpufreq_info,config->cpu_num);
                
    /* create OSD object
    osd = xosd_create(3);
    if (osd == NULL) {
        printf("Error creating xosd object.\n");
        printf ("%s", XOSD_ERROR);
        printf ("%s", CONTACT_ERROR);
        exit(1);
    }*/
/*
    xosd_set_font(osd, config->font);
    xosd_set_align (osd, config->align);
    xosd_set_vertical_offset (osd, config->vertical_offset);
    xosd_set_horizontal_offset (osd, config->horizontal_offset);
    xosd_set_bar_length(osd, config->bar_length);;
    xosd_set_colour(osd, config->colour);
    xosd_set_shadow_colour(osd, config->shadow_colour);
    xosd_set_shadow_offset(osd, config->shadow_offset);
*/
    string=(char *)malloc(64);
    do {
        /* getting cpu info */
        //get_cpu_info(cpufreq_info,config->cpu_num);
        freq_perc=(((cpufreq_info->cur_freq)-(cpufreq_info->min_freq)))*100/((cpufreq_info->max_freq)-(cpufreq_info->min_freq));

        /* Display CPU Current freq */
        sprintf(string, "CPU current frequency: %dMHz", cpufreq_info->cur_freq/1000);
        //xosd_display (osd, 0, XOSD_string, string);

        /* Display CPU freq percent bar */
        //xosd_display (osd, 1, XOSD_percentage, freq_perc);

        /* Display CPU general info */
        strup(cpufreq_info->driver);
        strup(cpufreq_info->governor);
        sprintf(string, "driver: %s  governor: %s", cpufreq_info->driver, cpufreq_info->governor);
        //xosd_display (osd, 2, XOSD_string, string);

        /* Wait */
        switch (config->on_time) {
            case 0: sleep(config->refresh); //always on top
                break;
            default: sleep(config->on_time);
                 break;
        }
        //xosd_hide(osd);
    } while (config->on_time==0); /* Always on top? */
        
        
    /* Clear memory */
    free (string);
    free (config);
    free (cpufreq_info);
        
    return (0); //Bye ;-)
}

6,测试结果

键入make之后,编译出osdcpufreq可执行文件

root@via-OptiPlex-3010:/home/via/2_OsdCpuFreqs/OsdCpuFreqs# ./osdcpufreq -g userspace -s 3300000
/------cpu current infomation------------------------------------------/
scaling_cur_freq = 1600000
cpuinfo_max_freq = 3300000
cpuinfo_min_freq = 1600000
scaling_driver = acpi-cpufreq
scaling_governor = ondemand

/------set cpu infomation-----------------------------------------------/
cpufreq_next_info->governor:userspace
cpufreq_next_info->set_speed:3300000
exit set_cpu_info


/------cpu current infomation------------------------------------------/
scaling_cur_freq = 3300000
cpuinfo_max_freq = 3300000
cpuinfo_min_freq = 1600000
scaling_driver = acpi-cpufreq
scaling_governor = userspace

通过红色的字符,可以看出已经成功修改了cpu的模式和频率,想确保真正修改成功成功,可以使用一下指令验证

root@via-OptiPlex-3010:/# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
userspace


玩事儿!



<think>我们参考用户提供的引用资料,特别是引用[1]、[4][5]中关于查看电脑处理器内存配置的方法。用户的问题是如何查看电脑的处理器(CPU内存配置,这与之前回答的问题非常相似,因此我们可以沿用之前的回答结构,并适当结合引用资料中的信息。 引用[1]提到几种查看电脑处理器配置的方法,引用[4]则强调查看真实配置的重要性,避免被误导。引用[5]虽然内容不完整,但标题表明是关于处理器、内存核数的查看。 结合之前的回答,我们给出以下方案: ### 查看电脑处理器内存配置的方法 #### 一、Windows系统 1. **通过系统属性查看(基础信息)** - 右键点击“此电脑”或“我的电脑” → 选择“属性” - 在打开的窗口中,可以看到处理器(CPU)型号安装的内存(RAM)大小[^1][^4]。 - *注意:这里显示的内存大小是总容量,但不会显示内存类型(如DDR4)频率。* 2. **使用任务管理器(详细动态信息)** - 按下`Ctrl+Shift+Esc`打开任务管理器 → 切换到“性能”选项卡 - **CPU部分**:查看处理器型号、核心数、线程数、基准频率当前频率[^1]。 - **内存部分**:查看内存容量、已使用量、可用量、速度(频率)以及内存类型(如DDR4/DDR5)[^4]。 3. **命令行工具(快速查看)** - 按`Win+R`输入`cmd`打开命令提示符 - 输入以下命令: ```cmd wmic cpu get name,NumberOfCores,NumberOfLogicalProcessors # 获取CPU名称、核心数、线程数 wmic memorychip get Capacity, Speed, MemoryType # 获取内存容量、速度、类型 ``` - *注意:内存类型显示为数字代码(如24代表DDR3,26代表DDR4)[^4]。* #### 二、macOS系统 1. **图形界面** - 点击左上角苹果图标 → “关于本机” → 在“概览”标签页中查看芯片型号(如M1 Pro)内存大小[^4]。 2. **终端命令(详细参数)** ```bash sysctl -n machdep.cpu.brand_string # 查看CPU型号(如Intel Core i7-9750H) sysctl hw.memsize # 查看内存总字节数(需除以1024^3换算为GB) system_profiler SPHardwareDataType # 查看详细硬件配置(包括内存频率) ``` #### 三、Linux系统 1. **终端命令** ```bash # CPU信息 lscpu | grep -E "Model name|Socket|Core|Thread" # 查看CPU型号、核心/线程数 # 内存信息 sudo dmidecode --type memory | grep -E "Size|Type|Speed" # 查看内存条规格 free -h # 查看内存总量及使用情况 ``` #### 四、第三方工具(推荐用于深度检测) - **CPU-Z(Windows)**: 检测CPU详细参数(架构、工艺、缓存)、内存时序及主板型号[^1][^4]。 - **HWiNFO(Windows/Linux)**: 提供传感器监控(温度/功耗)及硬件详细信息。 - **Neofetch(Linux/macOS)**: 终端中可视化显示硬件配置(支持ASCII图标)。 > **关键提示**: > - 警惕商家虚假宣传(如“i9级”实为老旧服务器CPU)[^4] > - 笔记本内存通常不可升级,购买时需确认容量是否满足未来需求 > - 内存兼容性需关注主板支持类型(DDR4/DDR5不可混插)[^2] §§相关问题§§ 1. 如何判断电脑配置是否满足游戏/设计软件需求? 2. 不同代内存(DDR3/DDR4/DDR5)性能差距有多大? 3. 升级内存时如何选择兼容的型号? 4. 笔记本CPU台式机CPU性能差异体现在哪些方面? 5. 任务管理器中“内存压缩”功能对性能有何影响? [^1]: 引用自电脑处理器查看方法 [^2]: 参考内存混插原则 [^4]: 参考查看电脑真实配置的方法</think>### 如何查看电脑处理器内存配置 #### 一、Windows系统查看方法 1. **基础查看(系统属性)** - 右键点击【此电脑】→ 选择【属性】 - 在"设备规格"中查看: - **处理器**:显示型号主频(如 Intel Core i7-12700H) - **安装的内存(RAM)**:显示总容量(如 16.0 GB)[^1][^4] 2. **详细参数查看(任务管理器)** - 按 `Ctrl+Shift+Esc` 打开任务管理器 - 切换到【性能】选项卡: | 硬件类型 | 查看位置 | 关键参数 | |----------|----------|----------| | **CPU** | CPU标签页 | 型号、核心/线程数、基准/睿频频率 | | **内存** | 内存标签页 | 容量、类型(DDR4/DDR5)、运行频率、已用槽位 | *示例:可见内存是否为双通道(2/2插槽使用中)[^4]* 3. **命令行快速查看** ```cmd # 查看CPU信息 wmic cpu get name,NumberOfCores,NumberOfLogicalProcessors,MaxClockSpeed # 查看内存信息 wmic memorychip get Capacity, Speed, MemoryType, PartNumber ``` *内存容量需除以1,073,741,824换算为GB值[^4]* #### 二、macOS系统查看 1. **图形界面** - 点击左上角 →【关于本机】→ 查看芯片型号内存大小 - 进入【系统报告】→【内存】查看详细时序参数 2. **终端命令** ```bash # CPU信息 sysctl -n machdep.cpu.brand_string # 内存信息 system_profiler SPHardwareDataType | grep "Memory" ``` #### 三、Linux系统查看 ```bash # CPU信息 lscpu | grep -E "Model name|Socket|Core|Thread" # 内存信息 sudo dmidecode --type memory | grep -E "Size|Type|Speed|Locator" ``` #### 四、专业工具推荐(深度检测) | 工具名称 | 功能亮点 | 适用系统 | |------------|----------------------------|--------------| | **CPU-Z** | 检测CPU缓存/指令集/工艺 | Windows | | **HWiNFO** | 实时监控功耗/温度/电压 | Windows/Linux| | **Neofetch**| 终端可视化硬件信息 | Linux/macOS | > **避坑指南**: > - 警惕"处理器不可用"提示:可能是驱动问题或硬件故障[^2] > - 内存混插风险:不同规格内存混用可能导致降频或蓝屏[^2] > - 笔记本升级限制:多数轻薄本内存为板载不可更换[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术在路上

帮助需要的人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值