大多数 I/O 操作本质上是异步的吗?

Are most I/O operations asynchronous in the nature?

提问人:torez233 提问时间:10/22/2023 最后编辑:torez233 更新时间:10/22/2023 访问量:26

问:

当我开始学习编程时,我学到的所有 I/O 功能,如读/读、写/写都是同步的(阻塞)。从那时起,我一直很好奇异步(非阻塞)I/O 的实际工作原理。

最近,我阅读了一些关于这个主题的材料,以下是我的理解:就 I/O 而言,内核实际上所做的是处理来自应用程序的请求,并向设备控制器发出请求。之后,可以自由地做其他事情,例如,将控制权转移回应用程序。当设备控制器收到请求时,它将自行执行实际的 I/O 操作(例如直接内存访问),而不会消耗任何 CPU 周期。操作完成后,设备控制器将通过硬件中断(或类似形式的信号)通知内核。

在整个过程中,唯一实际消耗 CPU 周期(例如阻塞)的部分是内核处理应用程序对相应设备的询问和发出请求。所以这样,所有常见的 I/O 操作本质上都应该是异步的,对吧?

对于这些同步 I/O 操作,我们可以轻松地基于异步版本构建同步版本。例如,在内核向设备发出请求后,内核可以简单地将应用程序进程标记为阻塞,以便进行 I/O 和上下文切换到其他进程,而不是将控制权转移回应用程序。只有在内核收到 I/O 操作完成的通知后,它才能切换回上一个进程。这样,从应用程序的角度来看,尽管 I/O 自然是非阻塞的,但 I/O 操作是阻塞的。

如果我的任何理解是错误的,请纠正我。感谢您的帮助

Linux IO 操作系统 内核

评论

0赞 President James K. Polk 10/22/2023
我们不讨论 SO。仅限 Q&A。
0赞 torez233 10/22/2023
明白了,但我想我已经在这篇文章的最前面发布了我的问题,即主题。
0赞 user207421 10/22/2023
在内核中,这一切都是异步的。在 API 级别,有多种选择:阻塞、非阻塞或异步。
0赞 torez233 10/22/2023
@user207421异步和非阻塞不是指同一件事吗?

答: 暂无答案