同步 IO 和异步 IO

文章目录
  1. 1. 如何区分是同步 IO 还是异步 IO 呢?
  2. 2. 如何区分是阻塞 IO 还是非阻塞 IO 呢?
  3. 3. 讨论几个IO模型
  4. 4. 参考资料

Linux 系统中,所有的设备读写都可以看做文件的读写来操作,对文件的读写一般要经过内核态和用户态的切换,

正因为有切换才导致了 IO 有同步和异步的说法

通常来讲 IO 可以分成两种:

  • 来自网络的 IO
  • 来自文件或者设备的 IO

并且完成 IO 操作可以简单的表述为两个步骤:

  • 发起 IO 请求
  • 执行 IO 操作

如何区分是同步 IO 还是异步 IO 呢?

  • “执行 IO 操作”是否阻塞

当请求被阻塞,就是同步 IO,否则就是异步 IO

同步 IO 的特点:

同步 IO 指的是用户进程触发 I/O 操作并等待或者轮询的去查看 I/O 操作是否就绪。
同步 IO 的执行者是 IO 操作的发起者。
同步 IO 需要发起者进行内核态到用户态的数据拷贝过程,所以这里必须由个阻塞

异步 IO 的特点:

异步 IO 是指用户进程触发 I/O 操作以后就立即返回,继续开始做自己的事情,而当 I/O 操作已经完成的时候会得到 I/O 完成的通知。
异步 IO 的执行者是内核线程,内核线程将数据从内核态拷贝到用户态,所以这里没哟阻塞

如何区分是阻塞 IO 还是非阻塞 IO 呢?

  • 发起 IO 操作是否阻塞

如果阻塞直到完成,就是阻塞 IO,否则就是非阻塞 IO

讨论几个IO模型

  • 阻塞 IO 模型(同步IO)

阻塞 IO 模型从发起 IO 操作到数据拷贝到用户空间,进程一直是阻塞的。

  • 非阻塞 IO 模型(同步IO)

非阻塞 IO 模型从发起 IO 操作后就直接返回,定时轮询数据有没有准备好,后面还是需要拷贝数据到用户空间

  • IO 复用模型(同步 IO)

IO 复用模型是发起 IO 操作前先调用 Select 或者 Poll。这两个函数都会在内核态准备好数据后告诉用户进程,相对于非阻塞 IO 模型来说,不需要轮询,用户进程可以做其他事情。但是本质上还是同步 IO
但是它的优点在于可以同时触发多个 IO任务并在每个 IO 完成后依次处理。

  • 信号驱动 IO 模型

通过 sigaction 注册信号,等内核准备好数据后内核态执行信号函数,本质还是同步 IO

  • 异步 IO 模型采用 aio_read 让内核准备好数据并复制到用户进程空间,最后通知用户进程,这才是正真的异步 IO

参考资料