【发布时间】:2021-01-04 21:52:07
【问题描述】:
我一直在阅读为什么异步 IO 比同步 IO 更好,这是因为在异步 IO 中,您的程序可以继续运行,而在同步 IO 中,您会被阻塞,直到操作完成。
我不明白这句话,因为使用同步 IO(例如write())内核将数据写入磁盘 - 它不会自行发生。内核确实需要 CPU 时间才能做到这一点。
所以在异步 IO 中,它也需要它,这可能会导致上下文从我的应用程序切换到内核。所以它并不是真正的阻塞,但确实需要 cpu 周期来运行这个操作。
- 正确吗?
- 这两者之间的区别是我们假设磁盘访问速度很慢,因此与等待数据写入磁盘的同步 IO 相比,在异步 IO 中等待数据写入磁盘的时间可以用来继续做应用处理,写入磁盘的内核部分很小?
- 假设我有一个应用程序,它所做的只是获取信息并将其写入文件。使用异步 IO 代替同步 IO 有什么好处吗?
同步 IO 示例:
- 写()
异步 IO 示例:
- io_uring(据我所知,副本也为零,所以这是一个好处)
- spdk(应该是最好的,虽然我不明白怎么用)
- aio
【问题讨论】:
-
"内核将数据写入磁盘-它不会自己发生" 实际上,内核向磁盘控制器制定消息,然后磁盘控制器自己进行实际写入没有处理器或操作系统的帮助。支持 DMA 的现代磁盘接口实际上会自己从系统 RAM 中获取数据——内核只会给磁盘控制器提供数据的地址(像指针,但物理地址不是虚拟地址)。
-
是的,异步输出的系统完成的工作总量通常至少是同步的。然而,与 CPU 负载相比,用户更倾向于抱怨用户界面暂停几分之一秒。如果用户界面定期写入文件以响应一些较小的用户操作,同步输出将意味着用户界面在写入文件时会一直暂停或挂起。异步输出允许程序继续响应用户,即使输出不完整。
-
磁盘是慢的部分,不是CPU。因此,如果您有其他事情要做,请使用异步 I/O。如果你仍然要等待,那么没有理由这样做。
-
当你执行
write时,你只需要等待数据写入内核的缓冲区缓存,而不是直到它被写入磁盘。写入返回后,写入磁盘将异步进行。如果你想要一个完全同步的写入,你也需要使用 fsync。