Linux cpumask分析
首先我们来分析一下定义在cpumask.h中 结构体cpumask_t
- typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
- #define DECLARE_BITMAP(name,bits) \
unsigned long name[BITS_TO_LONGS(bits)] - #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
- #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分析相关推荐
- Linux内核分析——可执行程序的装载
链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...
- Linux性能分析命令工具汇总
转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
- linux文本分析利器awk
转 快速理解linux文本分析利器awk 原文链接 杜亦舒 性能与架构 awk是什么 如果工作中需要操作linux比较多,那么awk是非常值得学习的 awk是一个极其强大的文本分析工具,把文件逐行的读 ...
- 【转】一文掌握 Linux 性能分析之网络篇(续)
[转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...
- Linux 性能分析的前 60 秒
Linux 性能分析的前 60 秒 为了解决性能问题,你登入了一台 Linux 服务器,在最开始的一分钟内需要查看什么? 在 Netflix 我们有一个庞大的 EC2 Linux 集群,还有非常多的性 ...
- Linux性能分析和调整的基本原则
Linux性能分析和调整的基本原则 优化linux系统需要考虑多方面的因素,因为各个因素之间相互关联,因此遇到性能问题以及性能的调节需要综合考虑,基本要素考虑与分析: 1,那些措施能确实×××能? ...
- 自学linux指令分析-cat
自学linux指令分析-cat 1·命令格式 cat [OPTION]... [FILE]... cat [参数][文件名] 2·命令参数 -n --number ...
- LINUX内核分析第二周学习总结——操作系统是如何工作的
LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- 《Linux内核分析》实验一
陈智威,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课堂学习笔记: 作业截图: 汇编代码堆栈分析: ...
- Linux 内核分析 之一:How Computer Works 实验
说明 欧长坤 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操 ...
最新文章
- (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
- matlab实现id3,MATLAB简单实现ID3
- CAICT:2015年全球云计算市场规模522亿美元
- js模拟select控件
- WinForm公共控件
- 网易云短信接口(验证码类短信||通知类短信)
- pyltp python具体使用
- win10系统使用自带的win7图片查看器
- 1 10000用计算机计算,2019新个税计算器 工资一万要交多少税
- 统计不及格人数(PTA-武理-C实验)
- 【论文精读】Robust Alignment for Panoramic Stitching Via an Exact Rank Constraint
- 程序员的桌面是什么样的?美工:那...不是我的桌面吗?
- LEAP模型能源与碳排放模型
- 什么是Galil(加利尔)运动控制卡,它是用来干嘛的呢?galil开发文件dmc32.dll,动态链接库,API
- 什么是TLB ?(转载)
- 阿里二面:RocketMQ 集群 Broker 挂了,会造成什么影响?
- IOS正弦Sin,余弦Cos,正切Tan的计算
- OpenCV学习笔记(十一)——图像噪声的生成(椒盐噪声、高斯噪声)
- 使用PyTorch构建的“感知器”网络
- Ubuntu18.04安装gup+cuda11.0+cudnn8.0.5
热门文章
- SAP License:FI/CO模块常用表及事务代码
- 牛客寒假算法基础集训营1
- 如何把扫描的PDF文件转换为Word文档?
- 200行代码实现N子棋(以五子棋为例)
- android 仿QQ表情,长按查看动图,移动手指可切换图片
- HTML制作水波纹,怎样制作水波纹
- 09年高考零分作文:兔子,你就是一个牛B
- .NET反编译:使用NET.Reflector+Reflexil插件相结合实现对DLL文件的修改操作
- EndNoteX9保姆级基础功能使用教程(够用!!)
- 拼多多“超级农货节”收官 阳光玫瑰、琯溪蜜柚上榜“超级水果”