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

一、介绍

假设一太机器上有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值