操作系统

Deep Dive · Beyond 408

内核机制
深读

图谱给速查卡,全书给 408 主线。本页是纵深:某一代 Linux 为什么这样拆。全程进阶 / 超出 408,不要把函数名默进统考。

01调度器演化

408 停在 FCFS / RR / 优先级 / 多级反馈。ULK 第 3 版对应 2.6.11,写的是 O(1) 调度器;CFS 在 2.6.23 合入,已超出该书。EEVDF 属于更晚的主线,本页只写动机。

进阶 / 超出 408下面三行是设计动机,不是统考模型。
阶段动机不要写成
O(1)用位图在固定步数里挑下一个,避免随就绪进程数线性扫描「408 的 RR 就是 O(1) 调度器」
CFS按已跑时间(vruntime)找「最亏」的进程,追求公平份额把红黑树当成 408 必答结构
EEVDF以 lag/virtual lag 判断实体是否 eligible,再从 eligible 实体中选虚拟截止期最早者,兼顾公平与延迟;概念层,不绑定小版本号默写某一提交的参数名

进程与线程都由 task_struct 表示;clone 标志决定资源共享与线程组关系,CLONE_VM 只是地址空间这一维(files/fs/sighand/线程组归属由其他标志决定)。陷入返回用户态前仍可能调度。

02内存子系统全景

进阶 / 超出 408职责分工。统考仍用连续分配 / 分页 / 缺页 / 置换。
伙伴·页框→slab·小对象→页缓存→回收
  • 伙伴:按 2 的幂拆合空闲页框,主要减轻外部碎片。
  • slab / slub:内核小对象缓存,避免每次向伙伴要整页。
  • 页缓存:普通缓冲文件 I/O 通常经页缓存;direct I/O 等路径可绕过。脏页回写不是「换入」。
  • 回收:内存紧时选页写回或丢弃。P=0 仍只是状态,合法访问才缺页。

03VFS 与路径解析

进阶 / 超出 408路径怎么走到 inode。408 要目录与分配方式,不要 dentry 缓存细节。

VFS 把超级块、inode、目录项、打开文件收成一套与具体文件系统无关的对象。路径解析按 dentry 到 inode;随后普通缓冲 read/write 或 mmap 的数据访问才涉及页缓存。

用户仍只看见 fd。短读合法;dup2 关闭并复用目标是内部原子操作。

04中断下半部

进阶 / 超出 408上半部尽快应答硬件;推迟的工作用不同延迟与睡眠能力。
机制大致约束
softirq软中断上下文,不能睡眠
tasklet建在 softirq 上;同一 tasklet 实例不会在多个 CPU 上并发执行,不同 tasklet 实例仍可并行;不能睡眠
workqueue进程上下文,可以睡眠

持有自旋锁期间 / 原子上下文不能睡眠;持锁区外可以。这与 LKD 口径一致。