一图流

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
对用户缓冲区有边界/大小要求
数据库系统