现在的位置: 首页 > 综合 > 正文

Linux内核:for_each_possible_cpu()/for_each_present_cpu()/for_each_online_cpu()区别

2018年10月02日 ⁄ 综合 ⁄ 共 1236字 ⁄ 字号 评论关闭

一、介绍

假设一太机器上有8个CPU:

1.1 cpu_possible_map

        机器上最多有多少个CPU,包括本机的CPU,以及可以热插拔的CPU。

        1. 假设cpu_possible_map为10,本机CPU个数为8个,则最多可以再添加2个可插拔CPU。

1.2 cpu_present_map

        当前有多少个CPU。

        1. 本机CPU个数为8个,都是online的,则cpu_present_map为8;

        2. 再插入1个可插拔CPU,则cpu_present_map为9。

1.3 cpu_online_map

        在当前的CPU中,有多少个可用的CPU。

        1. 本机CPU个数为8个,都是online的,则cpu_online_map为8;

        2. 将其中一个设置为offline,则cpu_online_map变为7。

1.4 for_each_possible_cpu()/for_each_present_cpu()/for_each_online_cpu()

        for_each_present_cpu()        - Iterate over cpu_possible_map

        for_each_online_cpu()           - Iterate over cpu_online_map

        for_each_possible_cpu()      - Iterate over cpu_present_map

二、实例

2.1 代码

#include <linux/module.h>
#include <linux/kernel.h>


static int __init init_marker(void)
{
        int i;

        printk("init marker.\n");

        for_each_possible_cpu(i)
        {
                printk("possible cpu :%d\n", i);
        }

        for_each_online_cpu(i)
        {
                printk("online cpu :%d\n", i);
        }

        for_each_present_cpu(i)
        {
                printk("present cpu :%d\n", i);
        }
        return 0;
}

static void __exit exit_marker(void)
{
        printk("exit marker.\n");
}

module_init(init_marker);
module_exit(exit_marker);

MODULE_AUTHOR("gwy");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0.0");

2.2 结果

1. 插入模块,卸载模块

2. 将cpu1设置为offline,再插入模块,卸载模块

        echo 0 > /sys/devices/system/cpu/cpu1/online

参考资料:

        Linux内核源码中文档:documentation/cpu-hotplug.txt

抱歉!评论已关闭.