一图流

read()和write()系统调用在用户空间缓冲区与内核缓冲区高速缓存(kernel buffer cache)之间复制数据。

这其中暗示了write一般会在用户空间到内核缓冲的复制完成之后,不保证实际磁盘写入,直接返回。

C封装

会根据实际对象选择缓冲方式

行缓冲 终端

fully buffer 其他 如管道重定向

unbuffered

内核到磁盘

Synchronized I/O data integrity completion

对写,保证data和必要的元信息(如文件大小)落盘

对读,保证影响该次读的写都落盘(?)

fdatasync

O_DSYNC

Synchronized I/O file integrity completion

保证data和所有元信息落盘

fsync

O_SYNC

O_RSYNC和O_SYNC/O_DSYNC结合,保证读之前的写入完成

sync在linux实现上把所有内核缓冲落盘

直接I/O

绕过内核缓冲区,直接将用户空间缓冲区写入设备

O_DIRECT

对用户缓冲区有边界/大小要求

数据库系统