你有没有遇到过这种事:
文档刚点“保存”,电脑突然蓝屏/断电/死机;重启一看——有时文件居然还在,有时却回到上一个版本,甚至变成 0 字节。你当场就想问一句:我到底保存了没?
这事的根源就在于:
你以为“保存=写进硬盘”,但在现代操作系统里,保存通常只是“先写进内存、排队等待落盘”。真正写到磁盘上,中间要走一条很长的流水线,经过一堆“中转站”和“签字盖章”。
这篇文章就用大白话、用生活比喻,把一次磁盘写入从头到尾完整走一遍:
从应用程序调用write()开始,到数据变成磁盘上的磁信号/闪存电荷为止。并且我们会把最容易迷糊的点讲清楚:
- 为什么写文件“看起来很快”,但磁盘灯还在闪?
write()返回了,到底算不算写成功?fsync()到底在等什么?- 文件系统日志(journal/WAL)在里面扮演什么角色?
- HDD 和 SSD 的落盘过程有什么不同?
- 为什么小文件、随机写特别慢?
- 断电到底丢什么?丢数据还是丢目录结构?
- 什么情况下“明明写了却没了”?
文章会偏 Linux/类 Unix 的通用逻辑(Windows 也类似),但不会用太多吓人的术语。你只要跟着“流水线”走一遍,就能把磁盘写入这件事看得清清楚楚。
0. 先立个规矩:写入有两种“成功”,别混了
在讲流程之前先把一个坑填上: