Linux 内核中的模式
Linux 内核经过 30 多年打磨,这些模式经受住了数十年在数百万设备上的真实考验。
| 模式 | Linux 中的位置 | 作用 |
|---|---|---|
| 位掩码 | include/uapi/linux/stat.h | 文件权限位 (rwxrwxrwx) |
| 最小堆 | kernel/sched/fair.c (CFS) | 完全公平调度器——选择最低 vruntime 的任务 |
| 环形缓冲区 | include/linux/ring_buffer.h | ftrace 事件记录,per-CPU 无锁缓冲区 |
| 状态机 | net/ipv4/tcp_input.c | TCP 连接状态机 |
| 信号量 | include/linux/semaphore.h | 内核计数信号量 down()/up() |
| 背压 | net/ipv4/tcp_output.c | TCP 拥塞窗口(cwnd)— 流控背压 |
| 空闲链表 | mm/slub.c | SLUB slab 分配器——侵入式空闲链表,带 XOR 加固指针 |
| Trie 前缀树 | net/ipv4/fib_trie.c | IP 路由表实现为压缩 trie(LC-trie) |
| 虚函数表 | include/linux/fs.h | file_operations 结构体——VFS 分发的函数指针虚表(.read、.write、.open) |
| 批处理 | block/blk-merge.c | 块层合并相邻 I/O 请求以均摊寻道时间 |
| 限流器 | net/sched/sch_tbf.c | 内核流量控制的令牌桶过滤器 |
| 引用计数 | lib/kobject.c | kref 为内核对象提供引用计数 |
模式如何组合:读取文件
当进程调用 read() 时,多个模式在同一个系统调用中协同工作:
read(fd, buf, count)▼"一切皆文件"的抽象之所以有效,是因为虚函数表分发让内核可以统一处理 ext4 文件、网络套接字和 /proc 条目。位掩码权限检查无论文件系统类型如何都只执行一次。而引用计数确保没有资源在使用中被释放——即使另一个进程删除了该文件。