第1章 进程与线程 1
1.1 进程和线程的概念 1
1.1.1 进程的历史 1
1.1.2 线程的不同玩法 3
1.2 Linux对进程和线程的实现 5
1.2.1 Linux中的进程实现 6
1.2.2 进程创建之后 12
1.2.3 内核线程和进程的区别 13
1.2.4 用户线程库pthread 15
1.3 进程的调度 16
1.3.1 进程调度机制的架构 16
1.3.2 进程切换的原理 19
1.3.3 调度中的CPU亲和度 21
1.4 在应用程序中管理进程和线程 22
1.4.1 Memcached线程池模型分析 22
1.4.2 Nginx进程模型分析 24
1.5 处理进程和线程的相关工具 25
1.5.1 开发环境调试线程 25
1.5.2 进程崩溃调试方法 26
1.5.3 strace工具 28
1.5.4 SystemTap工具 29
1.5.5 DTrace工具 30
1.6 本章小结 32
第2章 并发 33
2.1 什么是并发 34
2.1.1 并发是如何产生的 34
2.1.2 并发会带来什么问题 34
2.1.3 如何解决并发带来的问题 35
2.2 操作系统会在哪些场景遇到并发 35
2.3 Linux中并发工具的实现 37
2.3.1 原子变量 37
2.3.2 自旋锁 38
2.3.3 信号量 42
2.3.4 互斥锁 43
2.3.5 读写锁 43
2.3.6 抢占 44
2.3.7 per-cpu变量 45
2.3.8 RCU机制 48
2.3.9 内存屏障 51
2.4 常见开源软件中的并发问题分析 54
2.4.1 Nginx原子性 54
2.4.2 Memcached中的互斥锁 55
2.4.3 Redis无锁解决方案 56
2.4.4 Linux中惊群问题分析 57
2.4.5 解决MyCat同步问题 65
2.4.6 false-sharing问题解决方案 67
2.5 本章小结 69
第3章 内存管理 70
3.1 为什么需要内存管理 71
3.2 MMU和地址空间 73
3.2.1 虚拟地址、线性地址、物理地址 73
3.2.2 MMU的内存管理机制 74
3.3 Linux中的分段和分页机制 79
3.3.1 分段机制 79
3.3.2 分页机制 80
3.4 Linux的内存管理 82
3.4.1 物理内存管理 83
3.4.2 进程地址空间管理 86
3.5 Linux的内存分配和管理 89
3.5.1 物理内存分配算法 89
3.5.2 slab分配器 95
3.5.3 内核态内存管理 105
3.5.4 用户态内存申请 109
3.6 栈内存分配和管理 109
3.7 内存管理案例分析 110
3.7.1 Memcached内存管理机制分析 110
3.7.2 Redis内存管理机制分析 113
3.8 本章小结 115
第4章 中断机制 116
4.1 x86系统的中断机制 116
4.1.1 x86中断架构 117
4.1.2 x86在保护模式下的中断 117
4.2 Linux对中断的支持和实现 119
4.2.1 初始化IRQ中断门 120
4.2.2 中断响应流程 120
4.2.3 中断回调handler注册过程 122
4.3 Linux加速中断处理的机制 122
4.3.1 软中断 122
4.3.2 tasklet 126
4.3.3 工作队列 128
4.4 系统调用 132
4.5 时钟中断 134
4.6 信号处理机制 135
4.7 Nginx信号处理机制 139
4.8 本章小结 141
第5章 输入输出 142
5.1 I/O在Linux中的生命周期 143
5.1.1 vfs层 143
5.1.2 文件系统层 144
5.1.3 Block层 152
5.1.4 scsi层 156
5.1.5 I/O流程总结 157
5.2 I/O调度器 159
5.3 多队列机制 161
5.4 I/O多路复用实现 163
5.5 Redis对epoll的封装 170
5.6 Nginx文件异步I/O 175
5.7 tail指令为何牛 177
5.8 零拷贝技术应用分析 179
5.8.1 mmap 180
5.8.2 sendfile 181
5.8.3 mmap和sendfile在开源软件中的使用 183
5.9 本章小结 186
第6章 文件系统 187
6.1 Linux文件系统架构 187
6.2 文件系统的主要功能 189
6.2.1 文件系统的安装 190
6.2.2 文件路径查找 191
6.3 ext4文件系统 201
6.3.1 磁盘布局 201
6.3.2 inode定位 203
6.3.3 碎片问题解决方案 204
6.3.4 extenttree结构 204
6.4 淘宝TFS小文件系统分析 206
6.5 本章小结 207
第7章 Linux的进程隔离技术与Docker容器 208
7.1 虚拟化相关技术 208
7.2 Linux进程隔离技术 209
7 2 1 chroot 209
7.2.2 namespace 210
7.2.3 cgroup 212
7.3 Docker容器的部分实现 219
7.3.1 新版Docker架构 220
7.3.2 containerd的实现 221
7.4 本章小结 241
第8章 Linux网络层数据流分析 242
8.1 数据在网络层的流转 242
8.1.1 sk buff结构 243
8.1.2 数据流转过程 244
8.2 socket接口层的实现 248
8.2.1 socket系统初始化 248
8.2.2 socket创建 250
8.2.3 socket绑定 251
8.2.4 socket监听 253
8.2.5 socket接受连接 254
8.2.6 新连接的到来 257
8.2.7 socket整体流程 259
8.3 netfilter和lvs 260
8.3.1 netfilter 260
8.3.2 lvs 263
8.4 网络相关的一些参数 265
8.4.1 Java socket相关的参数 265
8.4.2 Linux TCP相关队列 267
8.5 Nginx服务器监听socket初始化过程 268
8.6 本章小结 274