Linux内核设计与实现 - 第6章 内核数据结构
目录
- 1. 链表 (Linked Lists)
- 2. 队列 (Queues)
- 3. 映射 (Maps)
- 4. 二叉树 (Binary Trees)
- 5. 位图 (Bitmaps)
- 6. 其他数据结构
- 性能考量
1. 链表 (Linked Lists)
- 单向链表 vs 双向链表
struct list_head
标准实现- 内核链表API:
LIST_HEAD()
,list_add()
,list_del()
- 环形链表
- 通过
list_head
自动形成环状结构
- 通过
- 安全考虑
- 并发访问保护(自旋锁/RCU)
2. 队列 (Queues)
- kfifo实现
- 无锁环形缓冲区
- 生产者-消费者模型
- API示例:
DECLARE_KFIFO(name, size); kfifo_put(fifo, data); kfifo_get(fifo, &data);
3. 映射 (Maps)
- IDR机制
- 整数ID到指针的映射
- 替代方案:XArray(新内核)
- 红黑树
struct rb_root
实现- O(log n) 查找复杂度
4. 二叉树 (Binary Trees)
- 红黑树特性:
- 自平衡二叉树
- 内核实现:
lib/rbtree.c
- 使用场景:
- 虚拟内存区域管理
- 调度器deadline队列
5. 位图 (Bitmaps)
- 内核位操作:
set_bit()
,clear_bit()
- 原子位操作版本
- 应用场景:
- CPU掩码(cpumask)
- 内存页管理
6. 其他数据结构
- 哈希表:
hlist_head
实现- 网络协议栈大量使用
- 基数树(radix tree):
- 页缓存核心数据结构
- 已被XArray逐步替代
性能考量
- 缓存友好性(局部性原理)
- 锁粒度优化
- 内存预分配策略
- 算法复杂度分析