从操作系统概念来看
另一个可能影响 I/O 性能的问题是对文件系统的写入是同步发生还是异步发生。
同步写入按照磁盘子系统接收它们的顺序发生,并且写操作没有被缓冲。因此,调用例程必须等待数据到达磁盘驱动器才能继续。
在一个 异步写,数据存储在缓存中,并且控制权返回给调用者。
大多数写入都是异步的。然而,元数据写入等可以是同步的。操作系统经常在系统调用中包含一个标志,
open
以允许进程请求同步执行写入。例如,数据库使用此功能进行原子事务,以确保数据按照所需的顺序到达稳定存储。
在同步写入中,“写入不被缓冲”。同步写和直接I/O是同一个概念吗?
“操作系统经常在系统调用中包含一个标志,
open
以允许进程请求同步执行写入。”通过调用哪些函数可以实现同步写入,如何调用?是open()
与O_DIRECT
?write()
默认情况下是阻塞的,并且在完成写入缓冲区缓存(而不一定是写入文件)时返回,这是否正确?write()
同步写入是按照引用中的定义进行的吗?aio_write()
也称为异步 I/O。是aio_write()
异步写还是不异步写?
谢谢。
答案1
关于O_SYNC和O_DIRECT,它们是不一样的:
- O_SYNC 会导致磁盘同步,但内容会进入缓存,因此您已读取缓存
- O_DIRECT 绕过缓存但不同步
- 在(例如)raid 的情况下,据我所知 O_DIRECT 可能会导致东西被发送到 raid,但不低于该值
- O_SYNC 可能会导致全磁盘同步,这将导致其他分区和其他文件的数据同步,并且还会刷新硬件缓存
重新阻止,是和否:
- 如果文件系统未使用同步挂载,那么只要数据已复制到内核,它就会返回。只要内核中有可用的缓冲区空间,它就会是即时的。一旦没有更多的缓冲区空间,它就会阻塞,直到有为止。
- 如果文件系统使用同步挂载,那么它将阻塞
重新开放,来自man 2 open
:
O_SYNC Write operations on the file will complete according to the
requirements of synchronized I/O file integrity completion (by
contrast with the synchronized I/O data integrity completion
provided by O_DSYNC.)
有关详细信息,请参阅联机帮助页。