graph TB
A["Linux 内核"] --> B["1500万行 C 代码"]
A --> C["覆盖所有子系统"]
A --> D["性能优化的天花板"]
A --> E["开源软件的金标准"]
B -.->|FOSS| F["自由使用"]
C -.->|覆盖面| G["一站式学习"]
D -.->|调优| H["理解瓶颈"]
E -.->|参考| I["学习 C + 数据结构"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#333
style F fill:#FFF9C4,stroke:#F9A825,color:#333
style G fill:#FFF9C4,stroke:#F9A825,color:#333
style H fill:#FFF9C4,stroke:#F9A825,color:#333
style I fill:#FFF9C4,stroke:#F9A825,color:#333
数据(截至 2026 年):
Linux 6.0:约 3500 万行代码(包括工具、文档)
内核本身:约 1500 万行
贡献者:超过 5000 人
发布历史:1991 年至今 30+ 年
一、第 1 章:简介与概述
1.1 内核态 vs 用户态
graph LR
subgraph "用户态 ring 3"
U["用户进程"]
GLIBC["glibc"]
end
subgraph "内核态 ring 0"
K["内核代码"]
SYSCALL["系统调用接口"]
end
U -->|"int 0x80 / syscall"| GLIBC --> SYSCALL --> K
K -.->|"iret / sysret"| U
style U fill:#C7CEEA,stroke:#9FA8DA,color:#333
style GLIBC fill:#E8D5F5,stroke:#CE93D8,color:#333
style SYSCALL fill:#FFDAB9,stroke:#FFAB76,color:#333
style K fill:#FFB3C6,stroke:#F48FB1,color:#333
graph LR
A["O(n) 调度器\n2.4 前"] --> B["O(1) 调度器\n2.6 早期"]
B --> C["CFS\n2.6.23+"]
A -->|"慢\noverhead 大"| A1["❌"]
B -->|"不均衡\n交互性差"| A2["❌"]
C -->|"公平\n红黑树"| A3["✅"]
style A fill:#FFB3C6,stroke:#F48FB1,color:#333
style B fill:#FFDAB9,stroke:#FFAB76,color:#333
style C fill:#B5EAD7,stroke:#80CBC4,color:#333
style A1 fill:#FFF9C4,stroke:#F9A825,color:#333
style A2 fill:#FFF9C4,stroke:#F9A825,color:#333
style A3 fill:#FFF9C4,stroke:#F9A825,color:#333
// 选择下一个进程:O(1) next = active->queue[highest_priority].first;
优势:调度决策 O(1),与进程数无关。 缺点:交互性差——长任务”饿死”短任务。
2.6 CFS(Completely Fair Scheduler)
graph TB
A["CFS"] --> B["红黑树\n(rbtree)"]
A --> C["虚拟运行时间\nvruntime"]
A --> D["调度延迟\nsched_latency"]
B --> B1["O(log n) 插入/删除"]
C --> C1["公平性度量"]
D --> D1["周期长度"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#333
style B1 fill:#FFF9C4,stroke:#F9A825,color:#333
style C1 fill:#FFF9C4,stroke:#F9A825,color:#333
style D1 fill:#FFF9C4,stroke:#F9A825,color:#333
graph LR
A["调度器"] --> B["普通调度\nCFS"]
A --> C["实时调度\nRT"]
B --> B1["nice 范围"]
B --> B2["vruntime"]
C --> C1["SCHED_FIFO"]
C --> C2["SCHED_RR"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style B1 fill:#FFF9C4,stroke:#F9A825,color:#333
style B2 fill:#FFF9C4,stroke:#F9A825,color:#333
style C1 fill:#FFF9C4,stroke:#F9A825,color:#333
style C2 fill:#FFF9C4,stroke:#F9A825,color:#333
优先级(数字越小优先级越高):
优先级
调度策略
0
保留
1-99
实时(SCHED_FIFO/RR)
100-139
普通(CFS)
2.8 进程创建:fork()、vfork()、clone()
sequenceDiagram
participant User as 用户进程
participant Lib as glibc
participant Kern as 内核
participant New as 新进程
User->>Lib: fork()
Lib->>Kern: sys_clone()
Kern->>New: copy_process()
New->>Kern: 等待调度
Kern-->>User: 返回子进程 PID
Kern-->>New: 返回 0
graph TB
A["exit()"] --> B["释放资源\nfiles/signal/mm"]
A --> C["设置状态\nEXIT_ZOMBIE"]
A --> D["通知父进程\nSIGCHLD"]
A --> E["调度器回收\nrelease_task"]
style A fill:#FFB3C6,stroke:#F48FB1,color:#333
style B fill:#FFDAB9,stroke:#FFAB76,color:#333
style C fill:#E8D5F5,stroke:#CE93D8,color:#333
style D fill:#C7CEEA,stroke:#9FA8DA,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#333
graph TB
A["进程管理核心"] --> B["task_struct\n进程描述符"]
A --> C["调度器\nCFS 红黑树"]
A --> D["fork/clone\n进程创建"]
A --> E["exec/exit\n进程生命周期"]
style A fill:#C7CEEA,stroke:#9FA8DA,color:#333
style B fill:#E8D5F5,stroke:#CE93D8,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFB3C6,stroke:#F48FB1,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#333