前面三十六篇讲原理,这一篇讲怎么把原理变成数字。perf 是唯一能回答「这几个核在干什么」的工具,也是唯一会在你真需要它的时候给你一屏 [unknown] 的工具。
eBPF 不是在 Linux 上加了个虚拟机这么简单,它解决的是「怎么在不影响生产的前提下执行任意校验过的内核代码」这个二十年的老问题。
内核源码有三千多万行。没有目标地读它,三分钟就会放弃。这一篇讲怎么带着一个具体问题进去,以及进去之后该找哪些文件。
封装不是为了「面向对象好看」,是为了让关闭、错误、超时这三件事只在一个地方处理。
UDP 的「不保证」不是缺陷,是把责任重新分配。广播和组播是两个不同的分发模型,配置看起来都对却不生效时,先怀疑交换机。
粘包不是 TCP 的 bug,是它压根没有「消息」这个概念。你在字节流上自己划了线,就得自己负责这条线划得对不对。
前两篇讲原理,这篇讲接口。三个函数的每个参数都在解决一个具体问题,看懂参数就知道差别在哪。
fork、线程池、select、epoll 不是四个并列选项,是一条演进线。每一代都是为了解决上一代的某个具体瓶颈,而那些瓶颈现在依然存在。
这两个状态天天被搞反。一个说明连接被正确关闭了,另一个说明你的代码忘了 close。
Linux
未读握手不是「打个招呼」,是两个内核在两台机器的内存里各建了一堆状态。逐字段看一眼,就知道为什么是三次不是两次。















