主题
面试速答(先看这里)
**一句话结论:**需要注意的是,如果一个数据想要写入磁盘,可以只进行write,但是不能只进行fsync或者fdatasync,因为要先写入缓冲区才能通过fsync/fdatasync同步到磁盘。
60秒标准回答:
write 和 fsync 是操作系统中常用的文件 I/O 操作,它们都与数据写入磁盘有关
write 是把数据写入内存缓存区, fsync 是把内存缓冲区数据真正刷到磁盘
除了这两个。还有一个 fdatasync ,它将指定文件的数据部分从操作系统缓存中同步到磁盘,但可能不会刷新元数据(比如文件的修改时间、权限等)
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**write 和 fsync 是操作系统中常用的文件 I/O 操作,它们都与数据写入磁盘有关。
- **要点2:**write 是把数据写入内存缓存区, fsync 是把内存缓冲区数据真正刷到磁盘。
- **要点3:**还有一个 fdatasync ,它将指定文件的数据部分从操作系统缓存中同步到磁盘,但可能不会刷新元数据(比如文件的修改时间、权限等)。
- **要点4:**因为 write 是把数据写入内存缓存区,如果没有来得及写入磁盘,操作系统就崩溃或者断电了,那么这个数据就丢了。
- **要点5:**但是如果write之后没有执行fsync/fdatasync的话,操作系统也会在后台把缓存区中的数据异步刷到磁盘(例如通过 pdflush)。
**记忆锚点:**write → fsync → fdatasync → RAID → 是把数据写入内存缓存 → 据部分从操作系统缓存
易错提醒:
- 需要注意的是,如果一个数据想要写入磁盘,可以只进行write,但是不能只进行fsync或者fdatasync,因为要先写入缓冲区才能通过fsync/fdatasync同步到磁盘。
加分表达:
- 因为 write 是把数据写入内存缓存区,如果没有来得及写入磁盘,操作系统就崩溃或者断电了,那么这个数据就丢了。
- 但是如果write之后没有执行fsync/fdatasync的话,操作系统也会在后台把缓存区中的数据异步刷到磁盘(例如通过 pdflush)。
追问准备:
- 围绕「write」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「fsync」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「fdatasync」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
write 和 fsync 是操作系统中常用的文件 I/O 操作,它们都与数据写入磁盘有关。
write 是把数据写入内存缓存区,fsync 是把内存缓冲区数据真正刷到磁盘。
除了这两个。还有一个 fdatasync ,它将指定文件的数据部分从操作系统缓存中同步到磁盘,但可能不会刷新元数据(比如文件的修改时间、权限等)。

因为write 是把数据写入内存缓存区,如果没有来得及写入磁盘,操作系统就崩溃或者断电了,那么这个数据就丢了。
> 现在也可以在RAID 控制器上配备电池模块的RAID 卡。这种电池通常被称为“电池备份单元(BBU)”或“RAID 卡电池”,主要作用是在服务器断电时,为RAID 控制器上的高速缓存(RAM)提供电力,以确保缓存中的数据安全地写入硬盘,防止数据丢失。
需要注意的是,如果一个数据想要写入磁盘,可以只进行write,但是不能只进行fsync或者fdatasync,因为要先写入缓冲区才能通过fsync/fdatasync同步到磁盘。
但是如果write之后没有执行fsync/fdatasync的话,操作系统也会在后台把缓存区中的数据异步刷到磁盘(例如通过 pdflush)。 但是前提还是不断电。