Linux内核xarray数据结构采用
Linux 内核的 xarray(eXtensible Array)是一种灵活、高性能的键值存储数据结构,核心功能是将 64 位整数 ID 与指针(内核对象)关联,支持 ID 分配、查找、插入、删除等操作,适用于需要管理大范围 ID 映射的场景(如进程 ID、文件句柄、设备资源等)。以下是其详细用法:
一、核心特性
- ID 范围:支持全 64 位整数 ID(
-2^63 ~ 2^63-1),包括负数、零和大整数。 - 功能丰富:支持自动分配 ID、手动指定 ID 插入、范围操作(批量删除)、原子操作等。
- 并发安全:通过 RCU 机制支持无锁读操作,写操作需配合锁(如自旋锁)保证线程安全。
- 高效性能:基于优化的树结构实现,查找、插入、删除的时间复杂度接近 O (log n),适合大规模数据。
二、使用步骤
1. 头文件与数据结构
需包含头文件 <linux/xarray.h>,核心结构体为 struct xarray:
#include
struct xarray my_xa; // 定义一个 xarray 实例
2. 初始化与销毁
- 初始化:使用
xa_init()初始化xarray(必须在使用前调用)。 - 销毁:使用
xa_destroy()释放资源(需确保所有元素已删除)。
// 初始化
xa_init(&my_xa);
// 销毁(模块退出或不再使用时)
xa_destroy(&my_xa);
3. 核心操作 API
(1)ID 分配(自动分配唯一ID 并关联指针)
自动分配一个未使用的 ID,并将其与指针关联:
// 从 [min_id, max_id) 范围内分配最小可用 ID,关联到 ptr
int xa_alloc(struct xarray *xa, void *ptr, unsigned long min_id, unsigned long max_id, gfp_t gfp);
// 循环分配(超过 max_id 后从 min_id 重新开始)
int xa_alloc_cyclic(struct xarray *xa, void *ptr, unsigned long min_id, unsigned long max_id, gfp_t gfp);
- 参数:
min_id/max_id:ID 范围(max_id=0表示无上限)。ptr:要关联的内核对象指针(如struct my_obj *)。gfp:内存分配标志(GFP_KERNEL允许睡眠,GFP_ATOMIC用于中断上下文)。
- 返回值:成功返回分配的 ID(非负整数),失败返回负数(
-ENOMEM内存不足,-ENOSPC无可用 ID)。
(2)手动插入(指定 ID 关联指针)
直接指定 ID 并关联指针(若 ID 已被使用,返回错误):
int xa_store(struct xarray *xa, unsigned long id, void *ptr, gfp_t gfp);
- 返回值:成功返回 0,失败返回
-ENOMEM(内存不足)或其他错误。 - 示例:将 ID=100 与
obj关联:
struct my_obj *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
int ret = xa_store(&my_xa, 100, obj, GFP_KERNEL);
(3)查找(通过 ID 获取关联的指针)
根据 ID 查找对应的指针,支持无锁并发读(依赖 RCU):
void *xa_load(const struct xarray *xa, unsigned long id);
- 返回值:成功返回关联的指针,失败返回
NULL(ID 未分配或已删除)。 - 示例(RCU 保护的无锁读):
struct my_obj *obj;
rcu_read_lock(); // 进入 RCU 读临界区
obj = xa_load(&my_xa, 100); // 查找 ID=100 关联的对象
rcu_read_unlock(); // 退出读临界区
(4)删除(释放 ID 并解除关联)
删除指定 ID 及其关联的指针(指针指向的对象需手动释放):
void *xa_erase(struct xarray *xa, unsigned long id);
- 返回值:返回被删除的指针(可用于手动释放对象),若 ID 不存在返回
NULL。 - 示例:
struct my_obj *obj = xa_erase(&my_xa, 100); // 删除 ID=100
kfree(obj); // 释放对象内存
(5)范围操作(批量删除一个区间的 ID)
删除 [start, end) 范围内的所有 ID:
void xa_erase_range(struct xarray *xa, unsigned long start, unsigned long end);
示例:删除 ID=100 到 ID=200(不含 200)的所有条目:
xa_erase_range(&my_xa, 100, 200);
(6)遍历所有 ID 与指针
使用 xa_for_each() 遍历所有已分配的 ID 及其关联的指针:
// 回调函数:每个 ID 触发一次调用(id 为当前 ID,p 为关联的指针,data 为用户数据)
typedef int (*xa_visitor_t)(unsigned long id, void *p, void *data);
// 遍历所有 ID,调用 visitor 回调
int xa_for_each(struct xarray *xa, xa_visitor_t visitor, void *data);
示例:遍历并打印所有 ID 和对象值:
static int print_xa_entry(unsigned long id, void *p, void *data) {struct my_obj *obj = p;printk("ID: %lu, value: %d\n", id, obj->value);return 0; // 返回 0 继续遍历,非 0 终止
}
xa_for_each(&my_xa, print_xa_entry, NULL); // 启动遍历
三、并发安全处理
xarray 依赖 RCU 和锁机制保证并发安全:
- 读操作(
xa_load):需在rcu_read_lock()/rcu_read_unlock()保护下执行(无锁,高效)。 - 写操作(分配 / 插入 / 删除):需通过自旋锁保护(避免并发修改导致数据不一致)。
示例:
#include
static DEFINE_SPINLOCK(xa_lock); // 保护写操作的自旋锁
// 安全分配 ID
int safe_alloc_xa(struct my_obj *obj) {int id;unsigned long flags;spin_lock_irqsave(&xa_lock, flags); // 加锁(禁止中断)id = xa_alloc(&my_xa, obj, 1, 0, GFP_ATOMIC); // 从 ID=1 开始分配spin_unlock_irqrestore(&xa_lock, flags); // 解锁return id;
}
// 安全删除 ID
void safe_erase_xa(unsigned long id) {struct my_obj *obj;unsigned long flags;spin_lock_irqsave(&xa_lock, flags);obj = xa_erase(&my_xa, id); // 删除 IDspin_unlock_irqrestore(&xa_lock, flags);kfree(obj); // 释放对象(在锁外执行,避免长时间持有锁)
}
四、完整示例(模块中使用)
#include
#include
#include
#include
// 定义要关联的对象
struct my_obj {int value;
};
static struct xarray my_xa;
static DEFINE_SPINLOCK(xa_lock);
static int __init xa_demo_init(void) {int id1, id2;struct my_obj *obj1, *obj2;struct my_obj *found_obj;// 初始化 xarrayxa_init(&my_xa);// 创建对象obj1 = kzalloc(sizeof(*obj1), GFP_KERNEL);obj2 = kzalloc(sizeof(*obj2), GFP_KERNEL);if (!obj1 || !obj2)return -ENOMEM;obj1->value = 100;obj2->value = 200;// 自动分配 ID 并关联对象spin_lock_irq(&xa_lock);id1 = xa_alloc(&my_xa, obj1, 10, 0, GFP_ATOMIC); // 从 ID=10 开始分配id2 = xa_alloc(&my_xa, obj2, 10, 0, GFP_ATOMIC);spin_unlock_irq(&xa_lock);printk("Allocated IDs: %d, %d\n", id1, id2);// 手动插入 ID=100spin_lock_irq(&xa_lock);xa_store(&my_xa, 100, obj1, GFP_ATOMIC); // ID=100 关联 obj1spin_unlock_irq(&xa_lock);// 查找 ID=100 关联的对象rcu_read_lock();found_obj = xa_load(&my_xa, 100);if (found_obj)printk("Found ID=100, value: %d\n", found_obj->value);rcu_read_unlock();// 遍历所有条目xa_for_each(&my_xa, print_xa_entry, NULL);return 0;
}
static void __exit xa_demo_exit(void) {// 释放所有 ID 和对象(简化示例,实际需遍历释放)spin_lock_irq(&xa_lock);xa_erase(&my_xa, id1);xa_erase(&my_xa, id2);xa_erase(&my_xa, 100);spin_unlock_irq(&xa_lock);// 销毁 xarrayxa_destroy(&my_xa);printk("XArray demo exited\n");
}
module_init(xa_demo_init);
module_exit(xa_demo_exit);
MODULE_LICENSE("GPL");
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965506.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
2025年通风气楼厂家权威推荐榜单:钢结构厂房气楼/顺坡气楼/排烟通风气楼源头厂家精选
在工业建筑绿色转型与安全生产要求不断提升的背景下,通风气楼作为工业厂房的“呼吸系统”,其技术含量与产品质量直接关系到生产环境的安全和能源消耗效率。
据QYResearch最新研究报告显示,2031年全球通风装置市场销…
楼宇间网络拓扑测绘 从原理到精准部署
楼宇间拓扑测绘的核心,是将网络连接关系精确定位到建筑物级别,为校园、园区等单位的网络规划与运维提供“高清地图”。
通过精准的楼宇级拓扑测绘,网络管理员能快速定位故障点、优化数据流路径,并为网络扩容提供决…
IP种子技术:构建全球P2P网络实时监测方案
BT下载作为一种点对点文件共享技术,因其高效分发大体积文件的能力而广受欢迎。在该技术体系中,BT种子文件作为关键索引,不仅记录了目标文件的存储位置、大小等元数据,更包含了下载服务器与种子发布者的IP地址等关键…
IP应用场景全图谱:你的IP属于哪一类?
IP地理位置定位技术是当今互联网领域的关键技术之一,它通过分析IP地址的网络特征来确定设备的地理位置。本文介绍的超高精度IP实时定位系统实现了街道级别的定位精度,该系统采用网络测量与大数据挖掘相结合的技术路线…
windows下配置cmake+opencv报错
windows下配置cmake+opencv报错:
find_package(OpenCV 4.3.0 REQUIRED)报错:
CMake Error at CMakeLists.txt:8 (find_package): By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this projec…
编译lazarus时,可能出现Makefile:3520: recipe for target fcllaz.ppu failed的处理方法
编译lazarus时,可能出现Makefile:3520: recipe for target fcllaz.ppu failed的处理方法如果编译lazarus出现以下错误信息:[2025-11-13 23:37:45.224 Info] (10028) Recompiling DB, checksum changed for /home/lbz…
破局代码思维:软件开发公司的体验式竞争力进化
破局代码思维:软件开发公司的体验式竞争力进化软件开发行业的现状剖析
数字化浪潮下,全球软件开发市场规模预计2025年将达1.6万亿美元,竞争日趋白热化。当前多数软件公司仍聚焦"代码交付"传统模式,将功能…
IP定位面积揭秘:为什么你的IP归属地会不准确?
你是否曾注意到,当你在社交媒体发布内容时,显示的IP属地有时与你实际所在地不符?或者在使用某些网络服务时,系统识别的位置与你真实位置相差甚远?这背后涉及的是IP地址定位技术中的一个关键概念—IP定位面积。
一…
无需人工奖励!Meta FAIR华人团队提出「早期经验学习范式」,AI智能体像人类一样“从错误中成长”
01 论文概述
论文标题: Agent Learning via Early Experience: Bridging Imitation and Reinforcement Learning Without Explicit Rewards
作者团队: 由Meta AI FAIR实验室(Facebook人工智能研究院)主导,华人研究…
嵌入式PWRKEY多功能使用攻略与设计要点探讨!
PWRKEY在嵌入式设备中承担着核心的电源管理功能,而多功能PWRKEY的引入则进一步提升了系统灵活性。本文将探讨其多功能使用攻略和设计环节中的要点。
在嵌入式项目开发中,无论是简单的用户按键,还是复杂的MCU联动,又…
2025年广东儿子不学习沉迷网络公司权威推荐榜单:青少年戒掉网瘾/初中生沉迷网络游戏/孩子沉迷网络游戏源头公司精选
随着数字化时代的深入发展,青少年网络沉迷问题日益凸显。据相关研究数据显示,部分城市中学生网络游戏过度使用筛查出率呈现波动变化,这一问题已成为众多家庭面临的严峻挑战。
网络沉迷不仅影响青少年的学业成绩,更…
打造景区“视觉中枢”:视频融合平台EasyCVR助力智慧景区安防智能化升级
随着旅游业的复苏,景区面临着客流管理、安全防控、服务质量提升等多重挑战。传统烟囱式、异构化的视频监控系统已难以满足现代化智慧景区的管理需求。本文将深入探讨基于视频融合技术的EasyCVR平台,如何作为景区的“…
[books]Love, Money, and Parenting: How Economics Explains the Way We Raise Our Kids 5 Febrero 2019
Love, Money, and Parenting: How Economics Explains the Way We Raise Our Kids Tapa dura – 5 Febrero 2019
Love, Money, and Parenting: How Economics Explains the Way We Raise Our KidsMatthias Doepke and …
一个小白的YOLOv10(MindYOLO)推理初尝试
前情提要
环境:笔记本、MindSpore、mindyolo、Jupyter Notebook
资源:mindyolo github、智能厨房 gitcode
小白工程师学习到了较繁琐的YOLOv10的新检测目标训练(非COCO数据集中已有目标),从github将mindyolo项目下…
Proxmox VE创建Linux虚拟机、相关设置分析
本文介绍了Proxmox VE创建Linux虚拟机、相关设置详细分析,以及相关机制分析参考:PVE 9.0 快速上手:一台物理机搞定虚拟化系统!
[[20251028-安装Ubuntu Server]] 下载镜像
官网下载| Ubuntu
上传镜像
上传安装镜像,…
2025年AI数字人企业排名大揭秘:前十强出炉,ai排行榜/ai排名/视频矩阵/短视频矩阵/ai和数字人/抖音短视频矩阵/GEO公司口碑推荐
AI数字人行业格局深度解析
随着人工智能技术的快速发展,AI数字人行业正迎来爆发式增长。据最新行业数据显示,2025年全球AI数字人市场规模预计将达到千亿级别,各细分领域企业纷纷布局。本文基于企业技术实力、市场表…
文本生成器(AC自动机上DP)
#include<bits/stdc++.h>
using namespace std;
const int L = 105;
const int mod = 1e4 + 7;
int n, m, cnt, ans = 1, tr[L * 60][30], fail[L * 60], dp[L][L * 60], flag[L * 60];
char s[L];
vector<in…
ICLR2026 !SAM3重磅来袭:能“听懂人话”的分割模型,性能狂飙2倍
Part one :论文概述
论文标题: SAM3: Segment Anything with Concepts
作者团队: Anonymous authors
发布时间: ICLR2026
👉一键直达论文
👉Lab4AI大模型实验室论文阅读
01 摘要解析
SAM3(SegmentAnythingMod…
mysql连接数查看常用sql语句;
SHOW VARIABLES LIKE max_connections; SHOW STATUS LIKE Threads_connected; SHOW STATUS LIKE Max_used_connections;
SHOW VARIABLES LIKE wait_timeout;SHOW VARIABLES LIKE interactive_timeout
2025 年升降机械厂家最新推荐榜:液压升降机械,解析供货厂家服务质量与产品性能
在现代物流与工业生产体系中,升降机械作为核心设备,其性能与安全直接影响运营效率与人员安全。当前市场品牌繁杂,劣质设备引发的故障与安全隐患频发,定制响应滞后、售后缺位等问题凸显。为精准筛选优质品牌,本次榜…