知其然,知其所以然
Rust 内部机制 2026-10-02

BufWriter 与批量写入

用计数的 Write 包装器与真实文件验证 BufWriter:10 万行无缓冲 writeln! 触发 511110 次底层 write(每行约 5 次),BufWriter 147 次,LineWriter 100000 次;100 万行耗时无缓冲约 8898 ms 对 BufWriter 30.9 ms;stdout 套 BufWriter 184.0 → 11.9 ms;process::exit 不 flush 丢了 3808 字节。

Rust BufWriter 缓冲IO stdout 真实验证 动画演示
Rust 内部机制 2026-10-02

文件描述符与资源释放

用 /dev/fd 与真实文件验证文件描述符:打开 +1、drop −1、编号被复用;不 drop 地打开到第 61438 次出现 Too many open files(os error 24);mem::forget 1000 次让 fd 数从 4 涨到 1004;try_clone / into_raw_fd / OwnedFd 与重复 close 返回 EBADF;子进程不继承 File 的 fd。

Rust 文件描述符 资源释放 fd 真实验证 动画演示
Rust 内部机制 2026-10-02

Path 与 PathBuf

用真实路径验证 Path 与 PathBuf:parent/file_name/extension 对各种形状的结果;components 整理 // 与 ./ 但保留 ..;join 绝对路径丢掉前缀;按组件比较(/ab 不是 /a 的子路径);OsStr 装非 UTF-8 字节,to_str 返回 None,macOS 上创建这样的文件名失败(os error 92);canonicalize 解析 .. 与符号链接。

Rust Path PathBuf 路径 真实验证 动画演示
Rust 内部机制 2026-10-02

内存映射文件

下载 memmap2 验证内存映射:读写与 flush;1 GiB 稀疏文件映射后 RSS 仅 2.0 MB,读遍所有页后 1026.0 MB(按页惰性加载);256 MiB 顺序求和 mmap 47.8 ms 对 read_to_end 65.8 ms;20 万次随机读 mmap 0.86 ms 对 seek+read 153.93 ms(约 179×);文件被截断后访问触发 SIGBUS。

Rust mmap 内存映射 memmap2 真实验证 动画演示
Rust 内部机制 2026-10-02

TCP Listener 与 TcpStream

用回环地址上的真实 TCP 验证 TcpListener 与 TcpStream:bind 端口 0、accept 与回显;ConnectionRefused(61)、AddrInUse(48)、读超时为 WouldBlock;字节流无消息边界(3 次 write 一次读到 12 字节);shutdown(Write) 与 read_to_end;set_nodelay 往返 44 → 18 µs。

Rust TCP TcpListener TcpStream 网络 真实验证 动画演示
Rust 内部机制 2026-10-02

非阻塞 IO

用回环 TCP 与真实 libc poll 验证非阻塞 IO:WouldBlock 几微秒返回;等 300 ms 的数据,忙等循环 1,222,679 次烧 305.1 ms CPU,阻塞 read 0.2 ms,poll 0.0 ms;一个线程用 poll 按就绪顺序服务 3 个连接;非阻塞标志被 try_clone 的克隆共享。

Rust 非阻塞IO poll TCP 真实验证 动画演示
Rust 内部机制 2026-10-02

UDP Socket

用回环地址验证 UdpSocket:数据报保留边界;缓冲区太小静默截断;macOS 上最大数据报 9216 字节(超过 os error 40);对死端口 send_to 成功、connect 后 recv 得 ConnectionRefused;快速发 20000 个数据报只收到 762 个(丢 96.2%)。

Rust UDP UdpSocket 网络 真实验证 动画演示
Rust 内部机制 2026-10-02

HTTP 请求的底层实现

用 TcpStream 手写 HTTP/1.1 对独立实现的服务端(Python http.server)和 curl 验证:请求与响应的原始字节、状态行与头部解析(Content-Length 是字节数、同名头可重复)、无长度时读到 EOF、chunked 分块的原始格式与手写解码、Keep-Alive 复用连接 104 对 149 µs/请求、302 与 curl -L。

Rust HTTP TCP 协议 真实验证 动画演示
Rust 内部机制 2026-10-02

Tokio TCP Echo Server

下载 tokio 写一个回显服务并与线程版对比:io::copy 回显;tokio 保持 3000 个连接只用 5 个线程、5 MB;每连接一线程的版本在 1507 个连接处失败并用到 1509 个线程、29 MB;单连接往返延迟 tokio 22.9 µs 对线程 20.3 µs。

Rust tokio TCP 回显服务 真实验证 动画演示
Rust 内部机制 2026-10-02

HTTP Server 从 Socket 到 Response

用标准库的 TcpListener 写一个约 60 行的 HTTP/1.1 服务端并用 curl 验证:GET/HEAD/POST/DELETE 与 404、405;头部转小写;keep-alive 复用连接;畸形请求得 400/431;读超时;20 个并发请求计数不丢更新。

Rust HTTP 服务端 TCP 真实验证 动画演示
Rust 内部机制 2026-10-02

Unix Domain Socket

用 std::os::unix::net 验证 Unix 域套接字:bind 创建 socket 类型文件(权限 755);残留文件使 bind 得 AddrInUse(48)、connect 得 ConnectionRefused(61);路径最长 103 字节;UnixStream::pair 与 UnixDatagram;往返延迟 4.7 对 TCP 17.2 µs,但吞吐 1.76 对 3.94 GB/s(TCP 更高)。

Rust Unix域套接字 UnixStream IPC 真实验证 动画演示
Rust 内部机制 2026-10-02

信号处理

用 libc 的 sigaction 与真实进程验证信号处理:默认 SIGTERM 终止进程且不运行 Drop(退出码 -15);安装处理函数设置原子标志后主循环正常退出,Drop 运行、退出码 0;阻塞期间的 100 个 SIGUSR1 合并成 1 次;SIGKILL 不能被捕获(EINVAL);Rust 运行时已把 SIGPIPE 设为忽略。

Rust 信号 SIGTERM sigaction 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号