write() 是异步写入吗?

write() 是异步写入吗?

从操作系统概念来看

另一个可能影响 I/O 性能的问题是对文件系统的写入是同步发生还是异步发生。

同步写入按照磁盘子系统接收它们的顺序发生,并且写操作没有被缓冲。因此,调用例程必须等待数据到达磁盘驱动器才能继续。

在一个 异步写,数据存储在缓存中,并且控制权返回给调用者。

大多数写入都是异步的。然而,元数据写入等可以是同步的。操作系统经常在系统调用中包含一个标志,open以允许进程请求同步执行写入。例如,数据库使用此功能进行原子事务,以确保数据按照所需的顺序到达稳定存储。

  1. 在同步写入中,“写入不被缓冲”。同步写和直接I/O是同一个概念吗?

  2. “操作系统经常在系统调用中包含一个标志,open以允许进程请求同步执行写入。”通过调用哪些函数可以实现同步写入,如何调用?是open()O_DIRECT?

  3. write()默认情况下是阻塞的,并且在完成写入缓冲区缓存(而不一定是写入文件)时返回,这是否正确?write()同步写入是按照引用中的定义进行的吗?

  4. 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.)

有关详细信息,请参阅联机帮助页。

相关内容