Skip to content

Linux 内核中的模式

Linux 内核经过 30 多年打磨,这些模式经受住了数十年在数百万设备上的真实考验。

模式Linux 中的位置作用
位掩码include/uapi/linux/stat.h文件权限位 (rwxrwxrwx)
最小堆kernel/sched/fair.c (CFS)完全公平调度器——选择最低 vruntime 的任务
环形缓冲区include/linux/ring_buffer.hftrace 事件记录,per-CPU 无锁缓冲区
状态机net/ipv4/tcp_input.cTCP 连接状态机
信号量include/linux/semaphore.h内核计数信号量 down()/up()
背压net/ipv4/tcp_output.cTCP 拥塞窗口(cwnd)— 流控背压
空闲链表mm/slub.cSLUB slab 分配器——侵入式空闲链表,带 XOR 加固指针
Trie 前缀树net/ipv4/fib_trie.cIP 路由表实现为压缩 trie(LC-trie)
虚函数表include/linux/fs.hfile_operations 结构体——VFS 分发的函数指针虚表(.read.write.open
批处理block/blk-merge.c块层合并相邻 I/O 请求以均摊寻道时间
限流器net/sched/sch_tbf.c内核流量控制的令牌桶过滤器
引用计数lib/kobject.ckref 为内核对象提供引用计数

模式如何组合:读取文件

当进程调用 read() 时,多个模式在同一个系统调用中协同工作:

read(fd, buf, count)
1
虚函数表

VFS 层查找文件的 file_operations 结构体并调用 .read()。ext4、NFS、procfs 各自在相同接口后提供自己的实现。

2
位掩码

内核检查文件权限位(rwxrwxrwx)与进程的 UID/GID。单次 AND 运算决定访问权限。

3
引用计数

打开文件会增加其 inode 引用计数。只要有 fd 引用,内核就不会释放 inode。

4
批处理

若读取触发磁盘 I/O,块层合并相邻请求以减少寻道时间。

5
环形缓冲区

ftrace 将系统调用的进入/退出记录到 per-CPU 环形缓冲区用于追踪。

"一切皆文件"的抽象之所以有效,是因为虚函数表分发让内核可以统一处理 ext4 文件、网络套接字和 /proc 条目。位掩码权限检查无论文件系统类型如何都只执行一次。而引用计数确保没有资源在使用中被释放——即使另一个进程删除了该文件。

延伸阅读

基于 MIT 许可证发布。