Part II · 一台机器 · 第 5 章
05

与世界对话:I/O、文件与存储

CPU 和内存只是在机器内部转圈。真正的服务必须收网络、写文件、刷磁盘。I/O 是程序走出自身的门,也是云上尾延迟最常埋伏的地方。

难度 CS162 核心 用时 约 50 分钟 交互 I/O 路径动画 · 缓冲/持久化取舍 路线 螺旋式:先抓大图,再深入机制

0先把地图摊开

CPU 和内存只是在机器内部转圈。真正的服务必须收网络、写文件、刷磁盘。I/O 是程序走出自身的门,也是云上尾延迟最常埋伏的地方。 本章不会把概念排成术语表,而是沿着一条真实系统路径走:先看它解决什么痛点,再看 OS/云平台怎样实现,最后回到工程取舍。

文件描述符进程访问文件、socket、pipe 的句柄。Unix 把很多东西都统一成 fd。
页缓存内核用内存缓存磁盘数据,读写常先落在这里。
fsync要求系统把脏数据真正推到持久介质上的同步点。
异步 I/O不把线程卡死在等待上,而是在完成时通知。
I/O、文件与存储 · 核心流程 分步动画 点击节点或用键盘 ← →
图 5.1核心机制路径。把这一章最容易散掉的流程压成可播放的五步。

5.1文件是接口,不只是磁盘上的东西

在 Unix 里,文件描述符可以代表普通文件、网络 socket、pipe、设备。这个统一接口让程序用相似方式读写世界,也让内核成为所有 I/O 的裁判。

5.2写成功不等于已经落盘

调用 write 返回,通常只说明数据进入了内核缓冲。真正写到 SSD 可能稍后发生。数据库为什么小心翼翼地调用 fsync?因为崩溃时,缓冲里的承诺可能还没变成物理事实。

5.3页缓存让磁盘看起来更快

热数据读起来像在内存里,因为它真的在内存里。页缓存是性能恩人,也是理解基准测试的陷阱:第一次读的是磁盘,第二次可能只是读内存。

5.4网络 I/O 也是文件式的

socket 是双向字节流或报文入口。高并发服务器不会给每个连接配一个阻塞线程,而是用 epoll/kqueue/io_uring 等机制等待“哪些 fd 准备好了”。

5.5云存储把本地 I/O 放大成网络协议

对象存储、网络块盘、分布式文件系统都把一次读写跨到远端机器。你以为在写磁盘,实际可能穿过网络、复制到多副本、等待 quorum。

I/O、文件与存储 · 取舍实验 可玩模拟器 切换策略,看指标怎么变
图 5.2工程取舍。云和 OS 的概念真正进入工程时,几乎都不是“选最好”,而是在约束之间找一个诚实的点。

云与 OS 的桥

这一章不是孤立知识点。下面这张表把它和前后章节接起来:你会看到,同一个机制在单机、云平台和 AI 基建里会换名字,但问题结构没变。

本章机制云上形态为什么重要
文件描述符socket、日志、容器 stdout云服务的可观测性和网络通信都走类似抽象。
页缓存数据库 buffer pool、对象存储网关双重缓存可能帮你,也可能污染基准。
fsync事务日志、消息队列确认持久化承诺必须落到明确的同步边界。
深潜 读完本章后,怎么确认自己真的懂了?

不要只背定义。你应该能把一个线上现象翻译回机制:慢在哪里、谁在排队、哪个抽象漏了、哪个资源被过度承诺。下面三个检查点可以当成小作业。

本章收束 · 你现在握住了什么

  • Unix 用文件描述符统一文件、socket、pipe 和设备。
  • write 返回不一定代表持久化,fsync 才是更强承诺。
  • 页缓存提升性能,也让测试和故障语义更复杂。
  • 云存储把本地 I/O 扩展成跨网络、多副本的协议。

Part II 到这里收束。接下来我们回到云:一台物理机如何正式切成许多台虚拟机?