首先我们来分析一下定义在cpumask.h中 结构体cpumask_t

  1. typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
  2. #define DECLARE_BITMAP(name,bits) \
    unsigned long name[BITS_TO_LONGS(bits)]
  3. #define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
  4. #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))

假设我们当前使用的cpu核数为24,即NR_CPUS=24,sizeof(long)=8,BITS_PER_BYTE=8,则在DIV_ROUND_UP(n,d)中, n = 24,d=64,宏的展开结果为(24+64-1)/64 = 1,DECLARE_BITMAP(name,bits) 展开后即为 unsigned long name[1],最后cpumask即为:

struct cpumask{

unsigned long bits[1];

};

绕了好大一个圈,就定义了一个unsigned long bits[1],想想就明白了,64位机器上,一个long有64个bit,而只有24个核,所以一个long足够表示了。在linux内核中,cpu_possible_mask 位图,用来表示系统中的CPU,每颗处理器对应其中一位,
cpu_online_mask 位图,用来当前处于工作状态的CPU,每颗处理器对应其中一位

接下来,分析cpu_bit_map

/*
 * cpu_bit_bitmap[] is a special, "compressed" data structure that
 * represents all NR_CPUS bits binary values of 1<<nr.
 *
 * It is used by cpumask_of() to get a constant address to a CPU
 * mask value that has a single bit set only.
 */

/* cpu_bit_bitmap[0] is empty - so we can back into it */
#define MASK_DECLARE_1(x) [x+1][0] = (1UL << (x))
#define MASK_DECLARE_2(x) MASK_DECLARE_1(x), MASK_DECLARE_1(x+1)
#define MASK_DECLARE_4(x) MASK_DECLARE_2(x), MASK_DECLARE_2(x+2)
#define MASK_DECLARE_8(x) MASK_DECLARE_4(x), MASK_DECLARE_4(x+4)

const unsigned long cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)] = {

MASK_DECLARE_8(0), MASK_DECLARE_8(8),
MASK_DECLARE_8(16), MASK_DECLARE_8(24),
#if BITS_PER_LONG > 32
MASK_DECLARE_8(32), MASK_DECLARE_8(40),
MASK_DECLARE_8(48), MASK_DECLARE_8(56),
#endif
};
EXPORT_SYMBOL_GPL(cpu_bit_bitmap);

const DECLARE_BITMAP(cpu_all_bits, NR_CPUS) = CPU_BITS_ALL;
EXPORT_SYMBOL(cpu_all_bits);

#ifdef CONFIG_INIT_ALL_POSSIBLE
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly
= CPU_BITS_ALL;
#else
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly;
#endif
const struct cpumask *const cpu_possible_mask = to_cpumask(cpu_possible_bits);
EXPORT_SYMBOL(cpu_possible_mask);

static DECLARE_BITMAP(cpu_online_bits, CONFIG_NR_CPUS) __read_mostly;
const struct cpumask *const cpu_online_mask = to_cpumask(cpu_online_bits);
EXPORT_SYMBOL(cpu_online_mask);

static DECLARE_BITMAP(cpu_present_bits, CONFIG_NR_CPUS) __read_mostly;
const struct cpumask *const cpu_present_mask = to_cpumask(cpu_present_bits);
EXPORT_SYMBOL(cpu_present_mask);

static DECLARE_BITMAP(cpu_active_bits, CONFIG_NR_CPUS) __read_mostly;
const struct cpumask *const cpu_active_mask = to_cpumask(cpu_active_bits);
EXPORT_SYMBOL(cpu_active_mask);

Linux cpumask分析相关推荐

  1. Linux内核分析——可执行程序的装载

    链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...

  2. Linux性能分析命令工具汇总

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

  3. linux文本分析利器awk

    转 快速理解linux文本分析利器awk 原文链接 杜亦舒 性能与架构 awk是什么 如果工作中需要操作linux比较多,那么awk是非常值得学习的 awk是一个极其强大的文本分析工具,把文件逐行的读 ...

  4. 【转】一文掌握 Linux 性能分析之网络篇(续)

    [转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...

  5. Linux 性能分析的前 60 秒

    Linux 性能分析的前 60 秒 为了解决性能问题,你登入了一台 Linux 服务器,在最开始的一分钟内需要查看什么? 在 Netflix 我们有一个庞大的 EC2 Linux 集群,还有非常多的性 ...

  6. Linux性能分析和调整的基本原则

    Linux性能分析和调整的基本原则 优化linux系统需要考虑多方面的因素,因为各个因素之间相互关联,因此遇到性能问题以及性能的调节需要综合考虑,基本要素考虑与分析:   1,那些措施能确实×××能? ...

  7. 自学linux指令分析-cat

    自学linux指令分析-cat 1·命令格式 cat [OPTION]... [FILE]... cat [参数][文件名] 2·命令参数 -n                    --number ...

  8. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  9. 《Linux内核分析》实验一

    陈智威,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课堂学习笔记: 作业截图: 汇编代码堆栈分析: ...

  10. Linux 内核分析 之一:How Computer Works 实验

    说明 欧长坤 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操 ...

最新文章

  1. (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
  2. matlab实现id3,MATLAB简单实现ID3
  3. CAICT:2015年全球云计算市场规模522亿美元
  4. js模拟select控件
  5. WinForm公共控件
  6. 网易云短信接口(验证码类短信||通知类短信)
  7. pyltp python具体使用
  8. win10系统使用自带的win7图片查看器
  9. 1 10000用计算机计算,2019新个税计算器 工资一万要交多少税
  10. 统计不及格人数(PTA-武理-C实验)
  11. 【论文精读】Robust Alignment for Panoramic Stitching Via an Exact Rank Constraint
  12. 程序员的桌面是什么样的?美工:那...不是我的桌面吗?
  13. LEAP模型能源与碳排放模型
  14. 什么是Galil(加利尔)运动控制卡,它是用来干嘛的呢?galil开发文件dmc32.dll,动态链接库,API
  15. 什么是TLB ?(转载)
  16. 阿里二面:RocketMQ 集群 Broker 挂了,会造成什么影响?
  17. IOS正弦Sin,余弦Cos,正切Tan的计算
  18. OpenCV学习笔记(十一)——图像噪声的生成(椒盐噪声、高斯噪声)
  19. 使用PyTorch构建的“感知器”网络
  20. Ubuntu18.04安装gup+cuda11.0+cudnn8.0.5

热门文章

  1. SAP License:FI/CO模块常用表及事务代码
  2. 牛客寒假算法基础集训营1
  3. 如何把扫描的PDF文件转换为Word文档?
  4. 200行代码实现N子棋(以五子棋为例)
  5. android 仿QQ表情,长按查看动图,移动手指可切换图片
  6. HTML制作水波纹,怎样制作水波纹
  7. 09年高考零分作文:兔子,你就是一个牛B
  8. .NET反编译:使用NET.Reflector+Reflexil插件相结合实现对DLL文件的修改操作
  9. EndNoteX9保姆级基础功能使用教程(够用!!)
  10. 拼多多“超级农货节”收官 阳光玫瑰、琯溪蜜柚上榜“超级水果”