linux每处理器内存分配

news2024/11/23 11:47:29

一、每处理器

在多处理器系统中,每处理器变量为每个处理器生成一个变量副本,每个处理器访问自己的副本;

优点:避免处理器之间和处理器缓存之间的同步,提高程序的执行速度。

二、编程接口

1、静态


	DEFINE_PER_CPU(type,name);//定义
	DECLARE_PER_CPU(type,name);//声明
	宏定义展开
	_ attribute ((section(".data .. percpu"))) _ typeof_ (type) name 
	
	每处理器变量放在.data..percpu中
	
	DEFINE_PER_CPU_FIRST(type, name) ;//定义必须出现在每处理器变量集合中最先出现的每处理器变量
	DEFINE_PER_CPU_SHARED_ALLGNED(type,name);//定义和处理器缓存行对齐的每处理器变量,仅在SMP系统中需要
	DEFINE_PER_CPU_ALLGNED(type,name);//定义和处理器缓存行对齐的每处理器变量,都需要对齐
	DEFINE_PER_CPU_PAGE_ALIGNED(type,name);//定义和页长度对齐的每处理器变量;
	DEFINE_PER_CPU_READ_MOSTLY(type,name)定义以读为主的每处理器变量;
	
	允许任何模块引用 EXPORT_PER_CPU_SYMBOL(var);把静态每处理器变量导出到符号表;
	只允许使用GPL许可的内核模块引用,使用EXPORT_PER_CPU_SYMBOL_GPL(var)

2、动态

void _percpu•_ alloc_percpu_gfp (size  size, size_t align, gfp t gfp); 
       宏 alloc_percpu_gfp(type,gfp),是上一个的简化形式,参数size取sizeof(type);
_alloc_percpu 
       宏 alloc_percpu(type)是函数__alloc_percpu 的简化形式 

//常用
alloc__percpu(type) 
//释放
void free_percpu(void _percpu *_pdata); 

3、访问每处理器变量 


宏 this_cpu_ptr(ptr)用来得到当前处理器的变量副本的地址,展开如下;
	unsigned long _ ptr;
	_ptr = (unsigned long) (ptr);
	(typeof (ptr)) (_ptr + percpu_offset (raw_smp_processor_id ())); 
	当前处理器的变量副本的地址等于基准地址加上当前处理器的偏移;
宏 get_cpu_var(var)用来得到当前处理器的变量副本的值;

per_cpu_ptr(ptr, cpu) 用来得到指定处理器的变量副本的地址;
per_cpu(var,cpu)用来得到指定处理器的变量副本的值;

get_cpu_ptr(var) 禁止内核抢占并且返回当前处理器的变量副本的地址;
 put_cpu_ptr(var)开启内核抢占;与上一个成对使用,确保当前进程在内核模式下访问当前处理器的变量副本的时候不会被其他进程抢占

 get_cpu_var(var) 禁止内核抢占并且返回当前处理器的变量副本的值,
 pur_cpu_var(var) 开启内核抢占;与上一个成对使用,确保当前访问处理器变量副本的时候不会被其他进程抢占

三、每处理器的内存如何分配的

每处理器区域是按块分配的,每个分为多个长度相同的单元(unit,每个处理器对应一个单元;

在NUMA系统上,把单元按内存节点分组,同一个内存节点的所有处理器对应的单元属于同一组;

块分配

1、vmalloc;从虚拟地址空间分配虚拟内存区域,然后映射到物理页;适用于 多处理器系统

2、基于内核内存的块分配。直接从页分配器分配,使用直接映射的内核虚拟地址;适用于单处理器系统

this_cpu_ptr(ptr)访问每处理器变量,ptr是每处理器变量分配内存时返回的虚拟地址;
this_cpu_ptr (ptr)
= ptr + __per_cpu offset[cpu] ;• cpu是当前处理器的编号*/
= ptr +(delta+ pcpu_unit_offsets[cpu])
= (ptr + delta) + pcpu unit offsets[cpu]
= (chunk->base addr + offset) + pcpu_unit_offse 七 s[cpu]
= (chunk->base_addr + pcpu_unit_offsets[cpu]) + offset 

pcpu_unit_offsets[cpu]是处理器对应的单元的偏移;
chunk->base_addr + pcpu_unit_offsets[cpu] 处理器对应单元的起始地址
offset 内部单元的偏移,就是变量副本的地址

分配图,放在每个小块的偏移和分配状态,使用最低位表示小块的分配状态;

 

假设系统有4个处理器,一个块分为4个单元,

分配图的初始状态,第一项存放第一个小块的偏移0,空闲,第二项存放单元的结束标记,偏移单元长度pcpu_unit_size,最低位被设置;块的初始状态,空

分配一个长度32字节的动态每处理器变量以后,

分配图使用三项:第一项存放第一个小块的偏移0,已分配;第二块存放第二个小块的偏移32,空闲;第三项存放单元的结束标记,偏移是单元长度pcpu_uint_size,最低被设置。

块的状态,每个单元中偏移0,长度32字节的小块被分配出去;

分配器根据空闲长度把块组织成链表,把每条链表称为块插槽,插槽数量是pcpu_nr_slots,

1、根据长度n计算插槽号的方法

 

  • 1如果空闲长度小于整数长度,或者最大的连续空闲字节数小于整数长度,那么插槽号是0;

2、如果块全部空闲,那么取最后一个插槽号,即pcpu_nr_slots - 1

3、其他情况:插槽号 = fln(n) - 3,并且不能小于1,fls(n)取n被设置的最高位。减3的目的是让空闲长度是1~15字节的块共享插槽1

2、确定块的参数

start_kernel -> setup__per_cpu_areas -> pcpu_embed_first_chunk -> pcpu_build_alloc i nfo

pcpu_build_alloc_info 计算分组信息和单元长度

  •  静态长度:内核中所有静态每处理器变量的长度总和;数据段结束地址 - 起始地址 即(__per_cpu_end  - __per_cpu_start)
  • 保留长度:为内核模块的静态每处理器变量保留,使用宏PERCPU_MODULE_RESERVE定义,值是8KB
  • 动态长度:为动态每处理器准备,使用宏PERCPU_DYNAMIC_RESERVE定义,在64位系统中值是28KB

 size_sum = 静态长度 + 保留长度 + 动态长度

 

最小单元长度 min_unit_size = size_sum,并且不允许小于宏PCPU_MIN_UNIT_SIZE 值是32KB
分配长度 alloc_size = min_unit_size向上对齐到原子长度的整数倍,原子长度是页长度;
最大倍数 max = alloc_size /  min_unit_size
单元长度 = alloc_size  / 倍数 n,需要从最大倍数max到最小倍数1中找到一个最优的倍数n 


 学习链接:

kernel学习链接

 参考

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中如何进行数据请求拦截与错误处理

当你在Vue.js中开发应用程序时,数据请求拦截和错误处理是不可或缺的一部分。通过拦截请求,你可以在发送请求之前对其进行修改,而通过错误处理,你可以有效地处理来自服务器的错误响应。本文将介绍如何在Vue.js中进行数据请求拦截和…

马铃薯甲虫的成虫和幼虫数据集(YOLO检测)

数据集下载(不要积分):https://download.csdn.net/download/qq_40840797/88389331 这是一个包含1810张图像的数据集,图像中展示了马铃薯甲虫的成虫和幼虫。这个数据集是专门为了用于农业机器人的点对点喷洒而设计的。这些图像是在…

云原生数据库TDSQL-C

数据库系统核心模块 云原生数据库要解决什么问题? HTAP 云数据库VS云原生数据库

Debezium日常分享系列之:使用数据库中的数据流进行在线机器学习

Debezium日常分享系列之:使用数据库中的数据流进行在线机器学习 一、背景介绍二、数据集准备三、使用 Apache Flink 进行分类四、使用 Debezium 和 Kafka 作为源数据流五、构建 Flink 流 k-means六、评估模型七、使用 Apache Spark 进行分类八、定义数据流九、定义和…

JAVA在线电子病历编辑器源码 B/S架构

电子病历在线制作、管理和使用的一体化电子病历解决方案,通过一体化的设计,提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心,以临床诊疗信息为主线…

开源白板工具 Excalidraw 架构解读

本文讲解开源白板工具 Excalidraw 的架构设计。 版本 0.16.1 技术栈 Vite React TypeScript Yarn Husky。 脚手架原来是用的是 Create React App,但这个脚手架已经不维护了,一年多没发布新版本了。 目前市面上比较流行的 React 脚手架是 Vite&…

pycharm一直没显示运行步骤,只是出现waiting for process detach

pycharm一直没显示运行步骤,只是出现waiting for process detach;各类音乐免费软件;最棒的下载torch-geometric-CSDN博客(不太推荐)我强烈推荐这个:_waiting for process detachhttps://blog.csdn.net/weix…

APScheduler框架使用

目录 概述架构重要概念Job 作业Trigger 触发器Executor 执行器JobstoreEvent 事件调度器 工作流程使用 概述 APScheduler(advanceded python scheduler)基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分…

网络层常见协议——IPV4、IPV6、ARP、ICMP、QoS

目录 1、IPV4 协议 IPV4 地址的组成: IPV4地址的分类: 关于多播和组播: 常见组播地址分类: 特殊的 IPV4 地址: 私有地址和公有地址: 私有地址的范围: 子网划分: 子网掩码&…

Codeforces Round 665 (Div. 2) (A-F)

A.Problem - A - Codeforces (1)题意 给你个X轴,初始A点在n这个位置,O在源点0,问你要把B放在哪才能让|AB-BO| k,最小化A需要移动多少次。 (2)思路 直接分情况套路即可。 &#xff0…

uwb人员定位系统:人员轨迹实时定位

UWB定位系统是一种基于超宽带技术的定位系统。它与传统的通信技术不同,不需要使用载波,而是通过发送和接收具有纳秒或微妙级以下的极窄脉冲来实现无线传输。这种系统的优势包括低功耗、对信道衰落不敏感、抗环境能力强、不会对同一环境下的其他设备造成影…

LINUX 基本命令

​ 一 展示当前目录下的内容 $ ls查看当前目录 pwd // /home/winnie二 mkdir 三 touch-cat-more 进入翻页后 通过键盘 q 退出翻页 b 翻上一页 四 cp mv rm mv 如果 mv 2.txt 5.txt (因为5.txt不存在,或者说他是个文件不是路径),故此操作将2.txt更名…

openfire 4.7.5 Web插件开发

文章目录 1、openfire服务端下载安装1.1、openfire解压运行1.2、Spark安装和登录 2、openfire插件开发2.1、基于servlet开发http接口2.2、基于Jersey开发http接口2.3、WEB UI页面开发2.4、上传插件2.4.1、访问servlet接口效果2.4.2、访问Jersey接口效果2.4.3、访问页面效果 Ope…

撰写博客的工具记录

文章目录 前言TyporaPicgoGitee 免费图床ScreenToGifPointofix和Snipaste墨滴社区小结 前言 本文主要目的是记录和分析自己在写博客和相关文档时所用到的工具,单纯记录。按照一篇文章从0到发布的场景进行叙述。 Typora Typora是一款Markdown编辑器。Markdown的优…

游戏制作资源推荐

教程 创建僵尸第一人称射击游戏 | 虚幻引擎 5 初学者教程https://www.youtube.com/watch?vqOam3QjGE8g ​​​​​​​ 虚幻商城免费资产 人物资产 各种角色应有尽有 关键词:paragon ;推荐程度:三颗星

C. MEX Repetition

题目:样例: 输入 5 1 2 1 3 1 0 1 3 2 2 0 2 5 5 1 2 3 4 5 10 100 5 3 0 4 2 1 6 9 10 8输出 1 2 0 1 2 1 2 3 4 5 0 7 5 3 0 4 2 1 6 9 10 思路: 从题目和样例中,我们可以知道,从一个数组中,按照包括0的自…

leetCode 121. 买卖股票的最佳时机 贪心算法

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

2023年汉字小达人市级比赛在线模拟题来了,四种练习助力好成绩

2023年第十届汉字小达人比赛区级自由报名活动已于9月30日结束,尽管最终晋级市级比赛的名单还需要在11月初发布(有一些学校的校级选拔还没结束),但是许多小朋友已经开始准备市级比赛了。 根据往年的经验,实际比赛也是在…

软断言你也学不会

断言是测试用例的一部分,也是测试工程师开发测试用例的核心。断言通常集成在单元测试和集成测试中,断言分为硬断言和软断言。 硬断言是我们狭义上听到的普通断言:当用例运行后得到的[实际]结果与预期结果不匹配时,测试框架将停止测试执行并抛…

华为云云耀云服务器L实例评测|ClickHouse部署及压测

文章目录 前言📣 1.前言概述📣 2.安全设置📣 3.ClickHouse安装✨ 3.1 申请服务器✨ 3.2 安装前准备✨ 3.3 RPM安装包✨ 3.4 配置文件✨ 3.5 使用ClickHouse 📣 4.ClickHouse压测✨ 4.1 下载数据✨ 4.2 解压数据✨ 4.3 创建数据库和…