新闻详情

新闻详情

首页 / 资讯中心 / 详情

从基本链表到侵入式链表,体会内核设计思路

发布时间:2026/10/1 7:20:55来源:尧图网络
从基本链表到侵入式链表,体会内核设计思路
1. 引言链表是计算机科学中最基础的数据结构之一几乎每一位开发者都曾亲手实现过。然而当我们从应用层走向内核从用户态走向内核态链表的设计思路会发生一次深刻的转变——从「数据持有节点」到「节点嵌入数据」。这一转变的核心就是侵入式链表Intrusive Linked List。本文将从最基本的链表实现出发逐步推导出侵入式链表的设计动机与内核中的典型应用帮助读者体会内核开发者面对资源受限、性能敏感场景时的设计哲学。2. 基本链表数据持有节点在应用层编程中我们最常见的链表实现方式是「数据持有节点」。也就是说链表节点是数据结构的一部分节点内部保存指向数据的指针。以 C 语言为例一个典型的单向链表节点定义如下struct list_node { void *data; /* 指向实际数据 */ struct list_node *next; /* 指向下一个节点 */ }; struct my_data { int id; char name[32]; /* 其他业务字段 */ };使用时我们需要为每个数据对象额外分配一个节点对象并将数据指针挂到节点上struct list_node *node malloc(sizeof(struct list_node)); node-data malloc(sizeof(struct my_data)); ((struct my_data *)node-data)-id 1;这种设计直观、易用但存在几个明显的弊端两次内存分配节点和数据分别分配增加了内存碎片和分配开销。缓存不友好节点和数据在内存中不连续遍历时频繁发生缓存未命中。类型不安全void *指针需要手动转换容易出错。无法静态初始化节点必须动态分配无法在编译期嵌入到结构体中。3. 侵入式链表节点嵌入数据侵入式链表彻底改变了上述思路不再是「数据持有节点」而是「节点嵌入数据」。链表节点直接作为结构体的一个成员数据对象本身就包含节点。以 Linux 内核的list_head为例struct list_head { struct list_head *next; struct list_head *prev; }; struct my_data { int id; char name[32]; struct list_head list; /* 节点嵌入数据 */ };此时链表操作不再需要关心数据的具体类型只需要操作嵌入的list_head成员即可struct my_data a, b; struct list_head head LIST_HEAD_INIT(head); list_add(a.list, head); list_add(b.list, head);这种设计带来了几个关键优势零额外分配节点随数据一起分配无需单独 malloc。缓存友好节点与数据在内存中连续遍历时缓存命中率高。类型安全通过container_of宏可以从节点指针反推出数据对象指针。支持静态初始化节点可以嵌入到全局或静态结构体中无需运行时分配。4. container_of从节点到数据的桥梁侵入式链表的核心难点在于当我们拿到一个list_head指针时如何反推出它所属的数据结构指针答案就是container_of宏。在 Linux 内核中它的经典实现如下#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)-member) *__mptr (ptr); \ (type *)((char *)__mptr - offsetof(type, member)); \ })其原理非常巧妙利用offsetof计算出成员在结构体中的偏移量然后用成员指针减去偏移量即可得到结构体的起始地址。这一宏是侵入式链表能够工作的基石也是内核中大量「从成员找对象」操作的通用工具。有了container_of遍历侵入式链表就变得非常自然struct list_head *pos; struct my_data *entry; list_for_each(pos, head) { entry container_of(pos, struct my_data, list); printf(id %d\n, entry-id); }5. 内核中的典型应用侵入式链表在 Linux 内核中无处不在几乎每个子系统都在使用。以下列举几个典型场景5.1 进程链表内核通过task_struct中的tasks成员将所有进程串成双向循环链表配合for_each_process宏即可遍历全部进程struct task_struct { /* ... */ struct list_head tasks; /* ... */ };5.2 文件系统缓存页缓存Page Cache中的每个页描述符struct page通过lru成员挂入 LRU 链表用于内存回收时的最近最少使用淘汰struct page { /* ... */ struct list_head lru; /* ... */ };5.3 设备驱动设备模型中的struct device通过kobj成员挂入内核对象链表实现设备与驱动、总线之间的关联管理。6. 设计思路的升华从基本链表到侵入式链表表面上看只是「节点位置」的变化背后却折射出内核设计的几个核心思想资源最小化内核运行在资源受限的环境任何多余的内存分配和间接寻址都是不可接受的。性能优先缓存局部性、零拷贝、零分配是内核性能优化的永恒主题。通用性与类型安全的平衡通过宏和编译期计算在保持通用链表操作的同时兼顾类型安全。组合优于继承侵入式链表体现了「组合」思想——数据结构通过嵌入而非继承来获得链表能力这在 C 语言中尤为自然。理解侵入式链表不仅是掌握一种数据结构更是理解内核开发者如何在极端约束下做出优雅设计的一次绝佳窗口。7. 总结本文从最基本的「数据持有节点」链表出发分析了其内存分配、缓存局部性和类型安全方面的不足进而引出「节点嵌入数据」的侵入式链表设计。通过container_of宏我们实现了从节点到数据对象的反向定位并列举了进程链表、页缓存 LRU 等内核典型应用。最后我们总结了侵入式链表背后蕴含的资源最小化、性能优先、通用性与类型安全平衡等内核设计思想。希望读者通过这一对比能够更深刻地体会内核设计的精妙之处。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

网盘直链下载助手LinkSwift新手教程:3步完成首次下载,支持9大网盘免费上手 2026/10/1 8:23:51

网盘直链下载助手LinkSwift新手教程:3步完成首次下载,支持9大网盘免费上手

网盘直链下载助手LinkSwift新手教程:3步完成首次下载,支持9大网盘免费上手 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / …

阅读更多 →
463个AI视频提示语模版:结构化Skill体系开源,提升提示语复用效率 2026/10/1 8:23:45

463个AI视频提示语模版:结构化Skill体系开源,提升提示语复用效率

1. 463个AI视频提示语模版,到底在解决什么问题先说说我为什么要干这件事。过去大半年,我几乎每天都在跟AI视频生成工具打交道,从文生视频到图生视频,从几秒的短片到十几秒的连续镜头,踩过的坑比做出来的成品多得多。最…

阅读更多 →
Awesome Python Applications 按平台组织:Desktop、Server、Mobile 与 Browser 维度全解析 2026/10/1 8:23:44

Awesome Python Applications 按平台组织:Desktop、Server、Mobile 与 Browser 维度全解析

文档知识库 【免费下载链接】awesome-python-applications 💿 Free software that works great, and also happens to be open-source Python. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-python-applications 点击查看 免费下载 Awes…

阅读更多 →
机加工报价系统哪个更专业?内行人只透露这三个判断标准 2026/10/1 8:23:32

机加工报价系统哪个更专业?内行人只透露这三个判断标准

核心结论: 判断机加工报价系统是否专业,不看宣传标语,只看三个硬指标:能不能看懂图纸风险、算工时颗粒度够不够细、有没有“越用越准”的复盘闭环。满足这三点,系统才能真正帮企业守住利润底线。这三条标准并非我凭空总…

阅读更多 →
看A股市场最新更新的网站 2026/10/1 8:23:32

看A股市场最新更新的网站

看 A 股市场最新更新的网站 看 A 股「最新更新」要分清你要哪一种新:是快讯刚发出来的「新消息」,还是指数刚走的「新点位」,还是某个行业刚刚冒出来的「新热度」。每日财经(https://findailys.com/),英文名…

阅读更多 →
气体检测管市场分析:2025年全球销售额达1.27亿美元,2032年有望增至1.73亿美元 2026/10/1 8:23:32

气体检测管市场分析:2025年全球销售额达1.27亿美元,2032年有望增至1.73亿美元

根据QYResearch的统计及预测,2025年全球气体检测管市场销售额达到1.27亿美元,预计2032年将增长至1.73亿美元,2026—2032年年复合增长率(CAGR)为4.5%。从整体市场表现来看,气体检测管作为一种成熟的现场气体…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉