Appearance
计算机体系结构与 C/C++ 低延时知识体系
这个仓库是一份系统性的底层知识库,覆盖从 CPU 微架构 到 C/C++ 低延时编程 的全链条——50+ 篇文档,按五层金字塔组织。
- 想按工具查用法 → tools/README.md(可观测工具索引)
- 想按原理查文档 → concepts/README.md(底层原理索引)
- 想动手验证 → demos/README.md(可跑示例)
- 想跟着实战走 → README.md(cpu_demo 手册)
- 想看知识版图 → 本篇
顶层布局:tools/(可观测工具)· concepts/(底层原理,含 13 个子域)· crash/(崩溃排查)· demos/(可跑示例)· parameter/(内核参数速查)· ai-tools/(AI 编程工具) · fe/(前端技术) · seo/(SEO 技术)
0. AI 编程工具域
本仓库新增了一个独立顶层主题域 ai-tools/,与传统性能/可观测工具定位不同——它关注的是AI 如何参与代码生产过程:
- 总纲 —— 工具选型、四级演化、场景矩阵
- Agent vs Skill 深度解析 —— AI 编程工具最核心的两个扩展概念
- MCP 协议深度解析 —— AI 世界的"TCP/IP",一次编写所有 AI 工具通用
- CLAUDE.md 编写指南 —— 项目记忆文件的最佳实践与反例
- Prompt Engineering 方法论 —— Context-Task-Constraint 三要素
- AI 编程效率量化 —— 哪些任务提效 15-30×,哪些反而拖慢
- Claude Code CLI 教程 —— 终端 AI 编程 Agent 一站式手册(16 章)
- GitHub Copilot 使用指南 —— 最普及的 AI 编程工具
- Cursor / Windsurf 使用指南 —— AI-Native IDE 的两种路线
- CodeGraph —— 本地代码知识图谱引擎,工具调用 ↓88%
传统工具(perf/strace)回答"系统哪里慢了",AI 工具回答"代码该怎么写/改"——两者互补。
0.5 前端技术域
本仓库新增了一个独立顶层主题域 fe/,按时间主线梳理前端技术与架构的演进——从早期静态网页到最近的 VitePress/微前端,每个时代/子主题单独成文:
- 总纲 —— 演进主线全景 + 文档索引
- 演进总纲 —— 一条主线、四个驱动力:渲染位置与交互粒度的摆动
- 静态网页时代 —— HTML/CSS/JS 原生时代的能力边界与遗产
- 服务端渲染时代 —— CGI → PHP/JSP/ASP → 模板引擎
- AJAX 与前后端分离 —— 局部更新革命与 SPA 的得与失
- MVC / MVVM 架构模式 —— 从命令式 DOM 操作到数据驱动
- 前端框架全景 —— 从 jQuery 到 React/Vue 生态:四代框架族谱与选型
- 虚拟 DOM 与响应式 —— React 虚拟 DOM / Vue 响应式 / Svelte 编译期三条路线
- 构建工具演进 —— Grunt → Gulp → Webpack → Vite
- SSR / SSG 与元框架 —— 全栈化与同构:Next.js/Nuxt/Astro
- 微前端架构 —— iframe → single-spa → qiankun → 模块联邦
- VitePress 专篇 —— 本站正在使用的文档站点方案(构建期渲染 + Vite 生态)
该主题与本仓库主线(性能/底层原理)互补:它回答"软件怎么组织",仓库主线回答"系统怎么跑得快"。
0.6 SEO 技术域
本仓库新增了一个独立顶层主题域 seo/,系统讲解搜索引擎优化技术——从搜索引擎工作原理到技术 SEO、内容 SEO、前端框架对 SEO 的影响,并含本站迁移到 VitePress 的真实案例:
- 总纲 —— SEO 概念体系全景 + 文档索引
- 搜索引擎工作原理 —— 抓取 → 索引 → 排名三段流水线
- 技术 SEO:可索引性与页面结构 —— robots/canonical/结构化数据/URL 结构
- 核心指标与工具 —— 指标漏斗、Core Web Vitals、工具链
- 内容与关键词 SEO —— 关键词研究、搜索意图、E-E-A-T、主题集群
- 前端框架与 SEO —— SPA 为什么 SEO 差、SSR/SSG 如何解决
- 本站的 SEO 落地实践 —— 从 Docsify 迁到 VitePress 的 SEO 改造实录
该主题与 前端技术域 紧密互补:前端技术回答"怎么组织页面",SEO 回答"怎么让页面被搜索到"。
1. 知识版图:五层金字塔
把全部文档按抽象层次摞起来,是一座金字塔——越往上越贴近日常排查,越往下越接近硬件本质:

两层辅助翼(挂在金字塔两侧):
- 左侧翼:崩溃排查(crash/):core dump · 信号 · ASan · TSan · Valgrind
- 右侧翼:可跑示例(demos/):cpu-demo · 编译器重排 · 崩溃信号 · TLB 抖动
L5 是 L1-L4 的共同地基——perf 读符号、GDB 解析 core、strip 分离调试信息,本质都在操作 ELF。
2. 各层文档清单
2.1 L1 实时工具层 —— 排查从这里开始
完整索引见 tools/README.md;工具定位对比与互补关系见 tools/compare.md;深度对比与综合使用见 tool-perf-comprehensive-guide.md。标准流程:vmstat 定大方向 → 按维度展开。
- CPU / 进程:top · pidstat · mpstat · vmstat
- 调度观测:chrt(实时优先级)· scheduling-observation(调度全貌)
- 代码级定位:perf(火焰图)· perf-internals(原理)· strace(系统调用)· gdb(崩溃还原/死锁定位)
- 磁盘:iostat · iotop
- 内存:free
- 网络:ss · lsof · rdma
- NUMA:numactl · numastat
- 历史复盘:sar
- 数据总枢纽:procfs · kernel-tuning(sysctl / /sys / 启动参数)· tuned(tuned profile)
2.2 L2 系统与资源层
2.2.1 进程与线程(内核视角)
工具速查:mpstat · pidstat · chrt · strace
2.2.1.1 内核身份证(task_struct)—— 先读这篇建立全局观
- task-struct ——
task_struct私有字段 + 可共享资源对象全套图谱 - 子目录 task-resources/ —— 9 篇逐资源展开:
- task-private —— 私有字段:pid/tgid、状态机、调度、寄存器
- mm-struct —— 地址空间
mm_struct - files-struct —— 打开文件表
- fs-struct —— 文件系统上下文
- signals-kernel —— 信号内核机制
- signals-user —— 信号用户态编程
- signals-alternatives —— 信号性能替代方案:signalfd/eventfd/timerfd/futex 为什么快 ~10×
- cred —— 凭证与权限
- namespaces-cgroups —— 容器底座
- io-context —— AIO / seccomp / rseq / Futex
- vfs-binding.md —— 进程与VFS文件系统的完整绑定机制:task_struct的fs_struct/files_struct如何关联全局VFS挂载树、路径解析流程、fork时的写时复制
2.2.1.2 调度与切换
- scheduling —— 调度类分层 / CFS / EEVDF / 抢占 / 负载均衡
- context-switch —— 触发场景 /
switch_to实现 / FPU 惰性切换 / 代价分析 / 瓶颈排查 - thread-affinity —— 线程绑核:三层接口 / NUMA /
isolcpus - real-time-scheduling —— POSIX 实时调度:
SCHED_FIFO/SCHED_RR/SCHED_DEADLINE、延迟量化、isolcpus/nohz_full - scheduling-interrupts.md —— 调度与中断的深入交互:主动调度vs被动抢占、内核抢占配置差异、上下文切换现场保存机制、内核栈分层原理
2.2.1.3 创建与生命周期
- process-creation ——
fork/exec/ CoW(写时复制) - thread-creation ——
pthread/std::thread→clone - thread-startup ——
execve→_start→main与clone→ret_from_fork→ 线程入口 - fork-and-threads —— 多线程 fork 的锁死陷阱、async-signal-safe
- vfork —— vfork 深度分析:fork 卡死四类根因 / vfork 规避原理 / 根治方案
2.2.1.4 陷入内核
- syscall —— 执行过程与开销:陷入 /
sysret/ vDSO - syscall-details —— 24 步时序图 / 特权级切换 / KPTI
- segment-management —— 段管理:GDT 逐位拆解 / CPL-RPL-DPL
- interrupts —— 中断分类体系 / 五大矛盾 / 完整流程 / 开销量化 / 上下半部
- irq-affinity —— IRQ 亲和性:IO-APIC / MSI-X /
smp_affinity/irqbalance/ RSS
2.2.1.5 信号机制
- signal-multithread —— 多线程信号处理:掩码继承 / 实时排队 /
tgkill/signalfd
2.2.1.6 进程组与子进程回收
- process-group-and-child-reap —— PGID / SID / 会话 / 控制终端、六种回收策略(
wait/SIGCHLD/SA_NOCLDWAIT/ Double Fork /signalfd/ subreaper)、低延时实践 - waitpid-kernel-internals ——
waitpid内核内部实现:完整调用链 / 3 幅时序图 / 等待队列机制 / 选项位详解 - zombie-case —— 反面案例:四个致命 BUG 逐层拆解 / 3 幅时序图 / 修复与监控
2.2.1.7 内核调试
- kernel-stack-snapshot ——
/proc/pid/stack/sysrq/perf sched
2.2.1.8 前置知识
- x86-64-registers —— 通用 / 段 / 控制 / MSR / SIMD / APIC 寄存器速查
2.2.1.9 进程持久化:检查点与重启
- dmtcp —— DMTCP 透明检查点/重启:coordinator+libdmtcp 架构、LD_PRELOAD 劫持、全局静止点、内存/FD/线程/socket 保存恢复、与 CRIU 对比
2.2.1.10 进程追踪与控制
- ptrace —— ptrace 原理:tracer/tracee 模型、ptrace-stop 状态、四大类操作(执行控制/内存寄存器读写/事件获取/选项设置)、内核 task_struct 实现与 signal/wait 复用、一次 PTRACE_SYSCALL 完整流程与时序图、strace 与 gdb 使用差异、ptrace_scope 安全控制、与 BPF 对比
2.2.2 NUMA(多路机内存亲和)
- numa —— 概念详解
- numa-optimization —— CPU 绑定 / 内存绑定 / 感知编程 / 跨节点开销量化
- paper —— NUMA 论文精读
2.2.3 I/O 子系统 —— 数据怎么在外设和内存之间流动
2.2.3.1 DMA(直接内存访问)
- dma-8237 —— Intel 8237:所有 DMA 引擎的"祖宗"(寄存器/时序/demo)
- dma —— 现代 Bus Mastering + SG-DMA + DDIO
- dma-cpu-interaction —— CPU 与 DMA 控制器完整交互(请求→授权→传输→同步)
- dma-multi-channel —— 多通道架构(FSM/仲裁/工程价值)
2.2.3.2 中断控制器进化
- 8259 —— Intel 8259A PIC:"祖宗"(IRR/ISR/IMR / ICW/OCW / INTA 握手 / 级联)
- 中断投递 → irq-affinity §二(APIC/xAPIC/x2APIC/MSI-X)
- 内核处理 → interrupts
2.2.3.3 PCIe
总纲:concepts/io/pcie/README.md(四阶段全景时间线 + 推荐阅读路径)
- pcie —— 物理基础:树形拓扑 / Lane 带宽 / 三层协议 / MMIO / BAR
- pcie-link-training —— 阶段①:硬件链路训练(LTSSM 11状态 / Width & Speed 协商 / 失败排查)
- pcie-firmware-enum —— 阶段②:固件枚举(MCFG/ECAM窗口 / Bus 0扫描 / 第一笔Config TLP / ACPI交接)
- pcie-pre-enumeration —— 横向机制:树构建前通信原理(RC/BDF/BAR 硬件工作机制)
- pcie-enumeration —— 阶段③:内核枚举(深度优先建树 / BAR探测与分配 / ID路由 & 地址路由)
- pcie-bar-activation —— 阶段④:BAR激活与驱动(地址解码器 / MMIO读写路径 / 驱动probe / 设备上线)
2.2.3.4 I/O 编址
- io-addressing —— PMIO vs MMIO:IN/OUT vs mov、BAR、Store Buffer→TLP 全过程、Posted Write 延迟
2.2.3.5 read/write 完整链路
- read-write-process —— syscall → VFS → page cache → 块层 → 驱动 → DMA
- cpp-io-separation —— C++ I/O 设计的"分离"思想:streambuf 缓冲与设备分离、格式化与传输分离、同步与异步分离、协议与传输分离
2.2.3.6 FPGA 通信
- fpga-communication —— Linux 与 FPGA 六种通信方式
2.2.4 虚拟内存
- mmap —— 映射文件/匿名内存进地址空间:四象限 / 惰性缺页 / malloc 大块 / 加载 .so / 共享内存
- shared-memory —— System V IPC vs POSIX 共享内存接口对比
2.2.5 VFS(虚拟文件系统)—— "一切皆文件"的内核多态层
- vfs-overview —— VFS 架构全景:四大对象(super_block/inode/dentry/file)、多态分发机制、各 FS 能力矩阵
- vfs-from-process —— 进程视角:从
task_struct到f_op的五跳链路、open()/read()/close()全时序、fork 共享语义 - vfs-file-operations ——
file_operationsvtable 逐字段拆解:~30 个函数指针的签名/语义/ext4-pipe-socket-procfs-eventfd 对比 - vfs-and-socket —— socket 与 VFS 深度融合:两套 vtable、
read()3 层分发链、close()引用计数、三大好处 - fuse —— FUSE 用户态文件系统:代理架构(VFS→/dev/fuse→用户态)、多挂载点隔离、三层分层设计
- special-filesystems —— 内核伪文件系统全景:六大分类 12 种伪文件系统(procfs/sysfs/debugfs/tracefs/cgroupfs/tmpfs 等)、与 VFS 的对接、性能数据源速查
VFS 是 fd 表的下游、syscall 的下一站、read/write 的必经之路——
file->f_op->read()这个跳转让 ext4/pipe/socket/procfs 共享同一套系统调用。内核自己提供了十几种伪文件系统作为运行时接口,它们各自实现file_operations,挂在同一个 VFS 框架下,让用户态用cat/echo就能读写内核数据。
2.3 L3 内存子系统层
总纲:concepts/cache/README.md —— 四条线全景
2.3.1 缓存组织
- cache-organization —— 地址三段 / 组相联 / 命中判定
- i-cache —— I-Cache 指令缓存:哈佛结构 / L1 I-D 拆分 / iTLB
- tlb —— 地址翻译缓存,"改步长性能暴跌"之谜
- page-table-translation —— 虚拟→物理地址完整转换 / 多级页表 / page walk
- memory-alignment —— 内存对齐对性能的影响 / 结构体布局
- cache-friendly-code —— 怎么写缓存友好的代码
2.3.2 缓存一致性协议族
2.3.3 原子操作与内存模型
- atomic
- memory-model —— C/C++ 内存模型:
std::atomic、内存序、屏障、x86/ARM 架构差异、性能量化
2.3.4 编译优化
- compile-options —— GCC 编译选项性能差异、汇编分析、优化陷阱、量化分析
2.4 L4 CPU 微架构 + 内存序层
最硬核的一层,三条正交的线:
2.4.1 微架构线 —— 单核怎么跑得快
📌 子目录总纲:concepts/microarch/README.md
总纲:cpu-microarch-overview —— 标量→流水线→超标量→乱序→投机演进链
- cisc-risc —— ★ CISC→µop 分界线:x86 是 CISC 的壳、RISC 的芯
- pipelining-superscalar —— 流水线 vs 超标量
- data-hazards —— 数据冒险:RAW/WAW/WAR 三种依赖与硬件解法
- cpu-out-of-order —— 乱序执行(交汇点!)
- branch-prediction —— 分支预测
- indirect-branch-prediction —— 间接分支预测:虚函数/函数指针/switch 跳转表的目标地址预测
超标量关键部件独立剖析:
- reservation-station —— 保留站:解耦译码与执行,乱序发射的发生地
- rob —— ROB:顺序退休、精确异常、对头阻塞
- lsu —— LSU:AGU、store buffer、store→load forwarding
- register-renaming —— 寄存器重命名:消除假依赖
- uop-pipeline-walkthrough —— ★ µop 级流水线走读(纵切面):三条指令逐拍穿过全部部件
2.4.2 内存序线 —— 多核看得对不对
总纲:reordering-overview —— 编译器重排 ≠ CPU 乱序 ≠ 内存重排
- compiler-reordering —— 编译器重排
- memory-reordering —— 内存重排全景
- store-buffer + invalidate-queue —— 硬件成因
- memory-order —— C++ 语义视角
2.4.3 系统架构线 —— CPU 内部怎么拼装、总线怎么连
📌 子目录总纲:concepts/cpu/README.md
- cpu-physical-hierarchy —— Socket→Chiplet + Intel/AMD/Apple 三路线
- core-and-uncore —— 核心三段式 + SMT + Uncore
- pmu —— PMU 性能监控单元:硬件计数器架构、事件选择、PEBS/IBS 精确采样、PMI/NMI 机制
- on-die-interconnect —— 片内 Ring/Mesh/IFOP 深度对比
- off-chip-buses —— 片外总线:DDR/PCIe/UPI
- cxl —— CXL 缓存一致性总线 + UCIe + 统一内存架构
- system-diagnosis-tools ——
lstopo/lscpu/lspci/dmidecode观测诊断 - numa-optimization —— NUMA 优化实践
2.5 L5 二进制基础层
总纲:concepts/elf/README.md —— ELF 格式→加载→地址空间→工具 四块全景
2.5.1 ELF 与工具
- elf-format —— 格式详解
- symbol-table —— 符号表深度剖析(Elf64_Sym 结构、.symtab vs .dynsym、结合 gdb/perf/DWARF)
- Section 专题:
- text-data-bss —— .text/rodata/data/bss(代码与数据四节,NOBITS 原理)
- plt-got —— .plt/.got/.interp/.dynamic(动态链接基础设施,延迟绑定)
- relocation —— .rela.*(重定位表结构、链接时/加载时/PLT 三种重定位)
- init-fini —— .init/.fini/.init_array/.fini_array(构造/析构的 ELF 层实现)
- eh-frame —— .eh_frame/.gcc_except_table(异常处理帧与零成本栈展开)
- meta-sections —— .comment/.note.*/.shstrtab/.gnu_debuglink(元数据与调试辅助节)
- compile-link-load —— 从源码到运行
- memory-layout —— 进程地址空间布局
- library-injection —— 用户态动态库注入:LD_PRELOAD/LD_AUDIT、运行期 dlopen、ptrace 注入、/proc/pid/mem 改写、gdb 注入
- readelf · objdump · nm · ldd · misc
2.5.2 ABI
- c-abi —— C ABI:传参 / 返回值 / 栈帧 / 红区 / 对齐 / 系统调用 ABI
- c++-abi —— C++ ABI:mangling / 虚表 / this / 异常 / RTTI /
dynamic_cast/ 成员函数指针
2.5.3 崩溃排查
- core-dump —— core dump 机制 + GDB 全流程
- core-dump-performance —— core dump 性能开销
- symbol-separation —— 生产环境符号分离
- signals —— 导致 crash 的信号及根因
- double-free —— double free 为什么会 crash:glibc ptmalloc 空闲链表不变量 + C++ 锁相关误用模式
- asan · tsan · valgrind —— 内存/线程错误检测器原理与选型
3. 应用域 —— 跨层综合场景
这些主题横跨金字塔多层,从 L1 工具 → L2 系统配置 → L3 内核机制,是"把原理用起来"的实战入口。
3.1 网络低延时与高并发
子索引:concepts/network/README.md
- 总纲:overview(C10K→C10M)
- IO 模型:io-models(五种 IO 模型 / io_uring)· select/poll/epoll 对比(序列图深度对比 / 选型速查)· io-model-latency(量化分析)
- Epoll:epoll(红黑树+就绪链表 / LT/ET / 惊群)
- 线程模型:thread-models(Reactor/Proactor / SO_REUSEPORT)· accept-bottleneck(单点 Accept 瓶颈)
- 内核调用链:socket-kernel-internals(socket+bind:双层结构 / vtable / VFS 分发 / hash 注册)· listen-kernel-internals(listen:两队列创建 / backlog 三种语义)· accept-kernel-internals(accept:生产者-消费者 / 阻塞唤醒 / SO_REUSEPORT)
- 内核调优:kernel-tuning-net(backlog / 缓冲区 / 多队列 / conntrack)· kernel-stack-optimization(队列长度 / 中断绑定 / RPS/RFS)
- 零拷贝:zero-copy(sendfile/splice)· zero-copy-deep(mmap/sendfile/splice/io_uring)
- TCP 控制:tcp-flow-congestion-control(rwnd/cwnd / CUBIC vs BBR)· tcp-nodelay(NODELAY/CORK)· tcp-timewait(TIME_WAIT / 端口耗尽 / tcp_tw_reuse / 连接池)
- 硬件分流:rss(Toeplitz 哈希/间接表 / RPS-RFS-XPS-FDir 全线对比)
- RDMA:rdma
3.2 存储优化
子索引:concepts/storage/README.md
- storage-performance —— HDD/SSD/NVMe 性能差异与选型、随机/顺序读写量化、IO 队列深度与 IOPS
- direct-io-vs-pagecache —— Direct IO vs 页缓存深度对比:两种 IO 路径全景、预读/回写/回收机制、性能量化、场景决策树
- io-uring-deep —— io_uring 框架深入:SQ/CQ 环形缓冲区、三种操作模式、零拷贝/buffer 注册、与 SPDK 对比
3.3 容器
子索引:concepts/container/README.md
- overview —— 三大支柱 namespace/cgroup/overlayfs / runc 启动流程
- container-vs-vm —— 容器 vs 虚拟机 / KVM / Kata / gVisor
- performance —— 性能损耗:网络/存储/cgroup 限流
- 内核底座:namespaces-cgroups
3.4 低延时设计模式
子索引:concepts/latency/README.md
- low-latency-patterns —— 总纲:忙等待 vs 睡眠调度、无锁编程与 RCU 原理、高并发队列设计、量化分析
- shm-vs-network —— 共享内存 vs 本机 TCP:为什么同机共享内存比网络快 2~3 个数量级("直达"vs"绕行"逐段拆解、量化对比表、适用边界)
- lockfree-deep —— 无锁编程深入:分级定义、CAS/FAA/Michael-Scott Queue/Treiber Stack、内存回收四方案、ABA 问题
- rcu-internals —— RCU 内核实现:宽限期/静默态、Tree RCU/SRCU、synchronize_rcu 开销分析、链表/计数器应用模式
- concurrency-benchmarking —— 基准测试方法论:干扰源消除、rdtsc/HdrHistogram、Little's Law、框架设计、统计与可视化
配套工具链:
- perf 工具指南(perf 子命令系统指南:stat/top/record/report/annotate/trace/probe/c2c/lock/sched,每个子命令独立成篇)
- perf-advanced(perf 导航页:案例、方法论、最佳实践汇总)
- perf-version-evolution(perf 版本能力差异:perf 版本=内核版本,3.10/4.x/5.x/6.x 在子命令/probe 语法/事件计数三主线差异与排查)
- perf-multithread-io-analysis(perf 三步分析法:多线程+IO 程序初步诊断,宏观体检→拆线程→异常模式深入)→ 配套实验 mt-io-demo)
- perf-probe 基础实验(uprobe/USDT 动态插桩)→ 进阶 C++ 成员函数探针实验(mangled 名 / 重载 / 模板 / 虚函数 /
this抓取 / 符号可见性) - ftrace-guide(ftrace 内核追踪:调度/中断/系统调用延迟)
- latencytop-guide(latencytop/sysstat 系统级性能工具)
- latency-measurement(精准测量延迟:tsc/rdtsc、clock_gettime)
3.5 量化交易中的 FPGA 应用架构
子索引:concepts/quant-fpga/README.md
- quant-fpga-architecture —— 总纲:tick-to-trade 延迟预算分解、CPU+FPGA 混合架构哲学、四种典型架构模式对比
- feed-handler —— 行情解码子系统:沪深 FAST/STEP 协议五级流水线、乒乓缓存、部分重配置、量化基准 380ns @200MHz
- order-execution —— 订单执行子系统:模板填充引擎、硬件化风控(仓位/速率/自成交)、PIO/CTPIO 发送、FPGA TCP 卸载
- hardware-integration —— 硬件集成与部署:板卡选型、Colocation 拓扑、PTP 时钟同步(±50ns)、双机热备、运维监控
已有基础:fpga-communication(Linux 与 FPGA 六种通信方式)· dma · pcie
4. 调试与调优工具链
- kernel-debug —— 内核调试:sysctl 调优、内核崩溃 panic 分析
- pmu —— PMU 性能监控单元:CPU 硬件计数器架构、PEBS/IBS、vPMU
- cpp-debug —— C/C++ 高级调试:GDB 断点/观测点/汇编调试、Core dump 高级分析、内存泄漏与碎片量化
5. 可运行示例 + 内核参数速查
demos/ —— 把原理跑起来(总纲)
- cpu-demo —— 核心靶子程序:三场景 CPU 性能演示(用户态计算 / syscall 风暴 / 空闲),本仓库所有工具文档和 perf 案例的"实验对象"
- compiler-reordering —— 编译器重排:亲眼看到编译器怎么改你的代码顺序
- branch-predict —— 分支预测实验:有序 vs 随机数据 + if vs 无分支,perf stat/report/annotate 三层定位,核心发现「无分支比完美预测还快 32.5%」
- indirect-branch —— 间接分支预测实验:虚函数单态/双态/巨态、函数指针、switch 跳转表,
branch-loads/branch-load-misses对比 - crash-signals —— 崩溃信号:实际触发 SIGSEGV/abort 并分析 core dump
- tlb-thrashing —— TLB 抖动:固定迭代、增大步长,亲眼看到 L2 STLB 触顶的断崖
- echo —— 百万QPS TCP 长连接实战项目:30-60天碎片化学习,覆盖 NUMA 进程/中断绑核、网卡 RSS 多队列、TCP 内核参数全链路调优、百万长连接承载、分层 echo 业务设计(裸 echo → 带计算 → 流式分包)、短连接 TIME_WAIT/端口耗尽专项补充。配套 架构设计、分析指南
parameter/ —— 内核参数速查
| 分类 | 文档 | 覆盖指标 |
|---|---|---|
| CPU | cpu-usage.md | %usr/%sys/%idle/%iowait/%irq/%softirq/%steal — 八类 CPU 时间 |
| loadavg.md | load average(1/5/15min)— R+D 态统计、EWMA 算法、常见误区 | |
| 内存 | memory-usage.md | MemAvailable、Swap si/so、Page Fault major/minor、OOM score |
| IO | iowait.md | %iowait、iodelay、cswch/s、%wait — 四大场景时序图与统计窗口 |
| disk-io.md | await/svctm/%util、IOPS、吞吐量、队列深度 | |
| 网络 | net-stats.md | 网卡丢包(rxdrop)、TCP 重传、连接状态、UDP 丢包 |
| 调度 | context-switch.md | cswch/s(自愿)、nvcswch/s(非自愿)、%wait、cs |
6. 推荐阅读路径
不必从头读到尾,按你的目的选一条路线:
6.1 入门
- 会用工具查 CPU 问题:README.md → top → pidstat → perf
- 看地址判断内存类型:memory-layout(栈/堆/代码/库/内核/空指针速判)
- 搞懂程序怎么跑起来的:compile-link-load → elf-format → process-creation → thread-startup
6.2 进程 / 内存 / 并发
- 搞懂 fork/线程/进程创建:task-struct → process-creation → thread-creation → fork-and-threads
- 搞懂 fork 卡死与 vfork 实战:vfork(四类根因 / 根治方案)→ waitpid-kernel-internals → zombie-case
- 搞懂进程组与子进程正确回收:process-group-and-child-reap → waitpid-kernel-internals(内核调用链/时序图)→ zombie-case(四个致命 BUG 逐层拆解/修复)
- 搞懂内存怎么来的(mmap/malloc):mmap → memory-layout → process-creation(CoW)
- 搞懂系统调用到底发生了什么:syscall → syscall-details → segment-management
- 搞懂并发内存序、
std::atomic:reordering-overview → memory-order → store-buffer - 搞懂多核缓存一致性:msi → mesi → comparison
6.3 性能优化
- **搞懂"多线程反而更慢" **:mesi(伪共享)→ cache-organization → atomic
- **搞懂"算法一样却慢一截" **:cpu-microarch-overview → branch-prediction / indirect-branch-prediction / tlb
- 怎么写快代码(缓存友好):cache-friendly-code → memory-alignment / mesi(伪共享)
- 低延迟:绑核/消除抖动:scheduling → thread-affinity → numactl
6.4 硬件 / I/O
- 搞懂 CPU 内部结构、总线拓扑:cpu-bus-architecture → numa → io-addressing → pcie
- **搞懂"NVMe 带宽跑不满、PCIe 拓扑瓶颈" **:cpu-bus-architecture(直连 PCIe vs Chipset/DMI 瓶颈)→ pcie(带宽/Lane 详解)
- 搞懂 DMA 怎么工作:dma-8237(8237——"祖宗")→ dma(Bus Mastering + SG-DMA)→ dma-cpu-interaction → dma-multi-channel
- 搞懂中断控制器怎么进化:8259(PIC——"祖宗")→ irq-affinity §二(APIC/xAPIC/x2APIC/MSI-X)→ interrupts(内核完整处理流程)
6.5 网络 / 存储 / FPGA
- 搞懂网络高并发(C10K→C10M):network/overview → io-models → epoll → thread-models → kernel-tuning-net / zero-copy / tcp-flow-congestion-control
- **搞懂"网卡收包中断为什么全在 CPU0" **:rss → irq-affinity → mpstat
- 搞懂存储性能差异:storage-performance → direct-io-vs-pagecache → io-uring-deep → zero-copy-deep
- 搞懂容器原理 / vs 虚拟机 / 性能:namespaces-cgroups → container/overview → container-vs-vm / performance
- 搞懂低延时设计全貌:low-latency-patterns(总纲)→ lockfree-deep(无锁编程)→ rcu-internals(RCU 内核)→ concurrency-benchmarking(测量方法论)
- 搞懂量化 FPGA 架构:quant-fpga-architecture(总纲)→ feed-handler(行情解码)→ order-execution(订单执行)→ hardware-integration(部署运维)
6.6 调试 / 崩溃
- 进程崩了要分析 core:core-dump → elf-format → symbol-separation
- 进程为什么崩(信号/内存 bug):signals → asan / tsan / valgrind
- 深入内核调试与 panic 分析:kernel-debug → kernel-stack-snapshot → signals
6.7 完整体系
- 系统学习整个知识体系:
- 自底向上(先懂基础,再学工具):L5 → L4 → L3 → L2 → L1
- 自顶向下(先会用,再挖原理):L1 → L2 → L3 → L4 → L5
7. 贯穿全仓库的一条暗线:IPC 低了,去哪查
大量"性能悬案"最终都收敛到一个问题——CPU 没被喂饱(IPC 低)。这条暗线把 L4 微架构和 L3 内存子系统串了起来:
- cache miss,等内存几百拍 → 数据布局差 / 伪共享:cache-organization · mesi
- TLB miss,走 page walk → 访问跨度大、页数超 TLB:tlb
- 分支误预测,清空流水线 → 分支方向随机:branch-prediction;间接分支目标随机:indirect-branch-prediction
- 长依赖链,ILP 不足 → 指令强依赖,喂不满超标量:cpu-out-of-order
- 跨核抢同一 cache line → 伪共享 / 原子争用:mesi · atomic
- 未对齐访存被拆分/跨 line → 数据未对齐、结构体压扁:memory-alignment
- 内存访问延迟异常高 → 跨 Socket 远程 NUMA / 跨 CCD:numa · cpu-bus-architecture
- I/O 延迟大但 CPU 不高 → PCIe/DMI 总线带宽瓶颈:cpu-bus-architecture · pcie
- 单核 %soft 100%、其他核空闲 → 网卡单队列 / RSS 未开 / 中断未分散:rss · irq-affinity · mpstat
- 存储 IO 延迟抖动 → IO 调度器 / 队列深度 / page cache:storage-performance · read-write-process
统一观测入口:perf stat(perf)看 IPC,低了就顺着上表往下查。
8. 约定
- 语言:文档正文以中文为主。
- 风格:每篇用 PlantUML 图 + 表格讲解,章节末尾常有**「一句话」总结**。
- 靶子程序:
demos/cpu-demo/main.cpp→cpu_demo(make编译,Linux 上运行,见 README.md)。 - 平台:
demos/cpu-demo/main.cpp读/proc,只能在 Linux 运行(macOS 能编译不能跑)。 - 链接规范:所有 .md 文件内统一使用相对路径,兼容本地浏览与 Docsify 部署。
一句话:这个仓库是一条"从用工具查性能,一路挖到 CPU 硬件为什么慢,再到 C/C++ 低延时编程"的系统学习路径——L5 二进制基础 → L4 CPU 微架构+内存序 → L3 内存子系统 → L2 系统与资源 → L1 实时工具,外挂四大应用域(网络/存储/容器/低延时)、崩溃排查、可跑示例与内核参数速查。按 tools/README.md 查工具、按 concepts/README.md 查原理、按本篇看地图。