新書推薦:
《
图解机械工程入门
》
售價:NT$
440.0
《
中文版SOLIDWORKS 2024机械设计从入门到精通(实战案例版)
》
售價:NT$
450.0
《
旷野人生:吉姆·罗杰斯的全球投资探险
》
售價:NT$
345.0
《
希腊人(伊恩·莫里斯文明史系列)
》
售價:NT$
845.0
《
世界巨变:严复的角色(王中江著作系列)
》
售價:NT$
500.0
《
塔西佗(全二册)(二十世纪人文译丛)
》
售價:NT$
1800.0
《
宋初三先生集(中国思想史资料丛刊)
》
售價:NT$
990.0
《
简帛时代与早期中国思想世界(上下册)(王中江著作系列)
》
售價:NT$
1400.0
|
編輯推薦: |
【与时俱进】本书基于Linux 6.0及以上版本讲解书中涉及的各个模块,有助于读者理解现代Linux内核,掌握实用的技术知识。
【深入底层】
本书详细介绍计算机系统中的核心知识,帮助想摘掉“CRUD(增删改查)Boy”标签的程序员掌握技术的底层原理。
【图文并茂】
本书共有150多张示例图,有助于读者理解“硬核”技术的细节。
【学以致用】
本书提供大量实战案例和测试代码,不仅有助于读者理解理论,还有助于读者对理论进行实践和验证,达到学以致用和有的放矢的目的。
|
內容簡介: |
本书主要讲解计算机系统中核心的技术知识,涵盖缓存、内存屏障、无锁编程、网络基础、TCP/UDP、端口复用、网络收发包流程、物理内存、虚拟内存等内容。本书还分享了实际工作中可能出现的技术难题及解决方案供读者借鉴。为了使读者轻松、快速地理解书中晦涩难懂的技术知识,本书作者精心绘制了大量的流程图、结构图。为了使读者更好地理解Linux内核源码,本书还提供了大量经过注释的Linux内核源码供读者下载。通过阅读本书,读者可以轻松、快速地掌握这些技术知识,并通过源码和书中配图加强对相关知识的理解。
|
關於作者: |
邓中华,高级软件工程师。曾就职于搜狐畅游,负责大型游戏服务端开发,拥有5年互联网服务端开发经验和6年游戏服务端开发经验。曾多次担任“救火队长”主导分析并解决大型线上事故,累计为公司减少经济损失达千万级别。擅长服务端架构设计,性能、网络和内存的优化。网文“十年码农内功”的作者,该网文的下载量已近万份。微信公众号和知乎账号“科英”的作者,通过不同平台分享经验和见解。
|
目錄:
|
目
录
第1章 缓存 1
1.1 存储体系结构 1
1.2 缓存一致性协议 4
1.2.1 MESI协议 4
1.2.2 MOESI协议 8
1.2.3 MESIF协议 9
1.3 写缓存区和无效队列 9
1.3.1 写缓冲区的作用 11
1.3.2 无效队列的作用 11
1.4 内存屏障 11
1.4.1 读写屏障 12
1.4.2 单向屏障 12
1.5 x86-TSO 13
1.6 CPU黑盒测试 15
1.6.1 测试核心内是否存在Store Buffer 15
1.6.2 测试转发(Store Forwarding)是否生效 17
1.6.3 测试StoreStore是否乱序执行 18
1.6.4 测试LoadLoad是否乱序执行 19
1.6.5 测试LoadStore是否乱序执行 19
1.6.6 测试StoreLoad是否乱序执行 20
1.7 CAS原理 20
1.8 原子操作 22
1.8.1 互斥锁 23
1.8.2 自旋锁 23
1.8.3 C 原子变量 25
1.8.4 C 内存顺序 26
1.9 无锁队列 31
1.9.1 设计思路 31
1.9.2 实现细节 32
第2章 网络 36
2.1 网络分层 36
2.2 网络接口层(以太网) 37
2.3 网络层(IP、ICMP) 39
2.3.1 IP 39
2.3.2 ICMP 43
2.4 套接字编程 47
2.4.1 套接字 47
2.4.2 函数 47
2.4.3 多路复用 49
2.5 虚拟网卡 54
2.5.1 Tun设备 54
2.5.2 创建代码 55
2.6 网络抓包 56
2.6.1 tcpdump 56
2.6.2 Wireshark 59
2.7 网络工具 61
2.7.1 ethtool工具 61
2.7.2 ifconfig工具 65
2.7.3 ip工具 66
2.7.4 nc工具 66
2.8 网卡的特性(Feature) 67
2.8.1 LRO 67
2.8.2 GRO 67
2.8.3 TSO 68
2.8.4 GSO 68
2.9 网络栈的扩展(Scaling) 69
2.9.1 RSS 69
2.9.2 RPS 71
2.9.3 RFS 72
2.9.4 XPS 73
2.10 硬中断的负载均衡 74
2.10.1 硬中断的CPU亲和性 74
2.10.2 irqbalance功能 75
第3章 TCP 76
3.1 协议体 76
3.2 有限状态机 81
3.2.1 netstat 82
3.2.2 ss 82
3.3 准备阶段 83
3.4 握手阶段 84
3.4.1 三次握手 84
3.4.2 初始化序列号 88
3.5 连接阶段 89
3.5.1 重传机制 90
3.5.2 确认机制 93
3.5.3 乱序恢复机制 94
3.5.4 保活机制 95
3.6 流量控制 97
3.6.1 滑动窗口 97
3.6.2 流量控制过程 99
3.6.3 零窗口 100
3.7 拥塞控制 101
3.7.1 拥塞控制算法 101
3.7.2 CUBIC 102
3.8 挥手阶段 109
3.8.1 四次挥手 109
3.8.2 三次挥手 112
3.8.3 同时挥手 113
3.8.4 关闭函数 114
第4章 UDP 117
4.1 协议体 117
4.2 特点 119
4.2.1 无连接性 119
4.2.2 不可靠性 122
4.2.3 面向报文 122
4.2.4 最大交付 124
4.2.5 最小开销 125
4.3 应用场景 125
4.4 可靠性保障 126
4.4.1 ACK 126
4.4.2 FEC 126
第5章 端口 128
5.1 问题 128
5.2 地址和端口复用的总结 128
5.2.1 两个选项均关闭 129
5.2.2 仅开启一个选项 129
5.2.3 仅开启地址复用选项 130
5.2.4 开启端口复用选项 131
5.3 地址复用的应用场景 132
5.4 端口复用的应用场景 133
5.4.1 单工作线程 133
5.4.2 多工作线程 137
5.5 TCP和UDP绑定同一端口 138
第6章 收包 139
6.1 网卡的准备过程 139
6.1.1 网卡驱动的加载 140
6.1.2 网卡驱动的初始化 141
6.1.3 启用网卡 143
6.2 收包过程总览 145
6.3 网络接口层 148
6.3.1 网卡收到数据包 149
6.3.2 内核收到硬中断 149
6.3.3 内核收到软中断 150
6.3.4 清理接收队列 152
6.3.5 GRO 158
6.3.6 RPS 159
6.3.7 数据包进入协议栈之前 161
6.4 网络层(IP) 168
6.4.1 网络协议栈入口 169
6.4.2 数据包的流向 171
6.4.3 数据包的转发 172
6.4.4 数据包进入传输层之前 173
6.5 传输层(UDP) 174
6.5.1 UDP协议入口 175
6.5.2 数据包的特殊处理 176
6.5.3 将数据包放入接收队列 178
6.5.4 唤醒等待数据的进程/线程 179
6.6 套接字层 183
6.6.1 创建套接字 183
6.6.2 绑定套接字 188
6.6.3 读取套接字 189
第7章 发包 195
7.1 发包流程总览 195
7.2 套接字层 198
7.2.1 send/sendto函数(用户态) 198
7.2.2 send/sendto系统调用(内核态) 199
7.2.3 选择发送函数 200
7.2.4 将消息对象递交到传输层 201
7.3 传输层(UDP) 202
7.3.1 处理消息对象 203
7.3.2 处理数据包(struct sk_buff) 211
7.4 网络层(IP) 212
7.4.1 IP层入口函数 213
7.4.2 IPv4的发送函数 214
7.4.3 执行BPF程序 214
7.4.4 数据包的分片 215
7.4.5 将数据包发给邻居子系统 216
7.5 邻居子系统 217
7.5.1 确定发送路径 219
7.5.2 快速发送路径 220
7.5.3 慢速发送路径 222
7.6 网络接口层 225
7.6.1 网络接口层入口 226
7.6.2 内核选择发送队列 229
7.6.3 运行排队规则 233
7.6.4 将数据包递交到网卡驱动 235
7.6.5 网卡驱动发包 236
7.6.6 软中断处理过程 240
7.6.7 网卡发送完成 241
第8章 内存 244
8.1 物理内存 244
8.1.1 物理内存模型 244
8.1.2 物理内存架构 250
8.1.3 物理内存节点 253
8.1.4 物理内存区域 256
8.1.5 物理内存页 261
8.1.6 物理内存布局 266
8.1.7 物理内存硬件 269
8.2 虚拟内存 270
8.2.1 虚拟内存布局 270
8.2.2 虚拟内存空间 279
8.2.3 虚拟内存区域 288
8.2.4 虚拟内存申请 290
8.3 内存映射 301
8.3.1 正向映射 301
8.3.2 反向映射 307
第9章 案例 310
9.1 伪内存泄漏排查 310
9.1.1 背景 310
9.1.2 分析 310
9.1.3 定位 311
9.2 周期性事故处理 312
9.2.1 背景 312
9.2.2 猜想(大胆假设) 312
9.2.3 定位(小心求证) 313
9.2.4 总结 316
|
內容試閱:
|
我一直想自己设计一个无锁的多生产者、多消费者队列。无锁编程涉及很多缓存和内存屏障的知识,不是一件容易的事情,没有技术功底是不行的。所以我查了很多资料,深入学习了很多理论知识,弄清楚每个细节,刨根问底,追本溯源,从CAS、内存屏障、缓存一致性协议,再到缓存原理,甚至底层硬件,终于弄明白了无锁编程的底层实现。然后把学习到的知识汇总整理成了“CPU缓存一致性:从理论到实战”—这是我在网上发布的第一篇技术文章。这篇文章发布后,获得了非常多的点赞,我也收获了很多粉丝。就这样,我发现了自己的另一面—除了可以自己写代码,还可以教别人写代码。读者的认可激发了我想要创作更多的技术文章的热情。我后来又写了网络、TCP、UDP、端口、分布式和相关工作经历等的文章。
在我工作满十周年之际,借此契机,我将这些文章整理为“十年码农内功”系列,例如其中的“十年码农内功:缓存”。后面我又写了网络收发包详细过程和内存等文章,填补了“十年码农内功”系列的最后几块拼图。再后来有几个出版社联系了我,想要将“十年码农内功”系列文章出版为图书,最后我选择了最早与我联系的电子工业出版社。将网络文章变成正式的出版物可不是一件容易的事情,在此期间我做了大量的修改工作来完善本书的内容。
本书内容涉及大量的代码和Linux命令,希望读者自己运行其中的代码和相关的命令,达到学以致用、有的放矢的目的。
本书特色
计算机技术发展飞快、日新月异,很多面试“八股文”可能早已过时。本书基于Linux 6.0及以上版本来讲解书中涉及的各个模块,有助于读者理解现代Linux内核,掌握实用的技术知识。
网上技术文章的质量参差不齐并且不成体系,还有存在错误的情况,就连ChatGPT给出的答案也会有错误,导致我们的学习成本比较高。本书详细地介绍了计算机系统中的核心知识,可以有效降低我们的学习成本。
作为工作十余年的技术老兵,我深刻体会到写五年业务逻辑和写十年业务逻辑没有太大的差异,只不过是对业务的熟练度有差异罢了。本书可以帮助那些想要摘掉“CRUD(增删改查)Boy”标签的程序员掌握技术的底层原理。
本书涉及的内容偏底层并且比较“硬核”,更适合有一定基础的学生和程序员阅读,从而进阶为更高级的软件开发工程师,打破“天花板”。
全书共有150多张示例图,图文并茂,有助于读者更容易理解本书的内容。同时还提供了大量的实战和测试代码,不仅有助于读者理解理论,还可以对理论进行练习和验证,达到学以致用和有的放矢的目的。
本书结构 第1章首先介绍存储体系结构、缓存原理、缓存一致性协议、内存屏障、CAS原理和原子操作等理论知识,然后介绍如何运用这些理论知识实现一个高性能无锁多生产者、多消费者队列,该队列在单生产者、单消费者场景下可以达到600万QPS。
第2章介绍网络接口层、网络层、套接字编程和虚拟网卡等内容,还介绍了一些网络工具,例如tcpdump和ethtool,以及如何使用这些工具进行网络分析和调优。
第3章介绍TCP的协议体、有限状态机、建立/关闭连接的不同阶段,以及流量控制(滑动窗口)和拥塞控制(CUBIC算法)。
第4章首先介绍UDP的协议体、特点和应用场景,以及介绍保障可靠传输的两种机制:ACK(消息确认)和FEC(前向纠错)。
第5章首先通过几个问题引出地址/端口复用的结论。然后介绍地址复用和端口复用的应用场景。最后介绍了TCP和UDP本来就可以同时绑定同一个端口。
第6章首先介绍网络在收发数据包之前的准备工作,包括网卡驱动的加载、初始化和网卡的启动。然后依据Linux 6.0内核源码详细介绍数据包从网卡硬件、网络接口层、网络层、传输层(UDP)、套接字层再到应用层的整个收包流程。
第7章依据Linux 6.0内核源码详细介绍数据包从应用层、套接字层、传输层(UDP)、网络层、邻居子系统、网络接口层再到网卡硬件的整个发包流程。
第8章首先通过Linux 6.8内核源码中的物理内存节点、物理内存区域和物理内存页及实际的物理内存空间布局来介绍物理内存。然后通过Linux 6.8内核源码中的虚拟内存空间和虚拟内存区域,以及虚拟内存的布局和虚拟内存的申请来介绍虚拟内存。最后通过Linux 6.8内核源码中的正向与反向映射来介绍物理内存与虚拟内存之间的互为映射关系。本章参考了“bin的技术小屋”的公众号,这里表示感谢。
第9章主要分享我在实际工作中遇到的两个难题,以及难题是如何解决的。通过这两个案例可以看到具体的解题方法,给读者在解决实际工作中遇到的问题时提供借鉴和启发。
|
|