导航
导航
文章目录
  1. IO 操作
    1. 概念
    2. 五种 IO 模型的比较
  2. 同步异步 IO、阻塞非阻塞 IO
    1. 概念
    2. 异步 IO 模型
    3. 阻塞 IO 模型
    4. 非阻塞 IO 模型
    5. IO 复用模型

理解同步、异步、阻塞、非阻塞

IO 操作

概念

IO 分成两个阶段:

  1. 数据准备
  2. 内核空间复制数据到用户空间(用户进程缓冲区)

tips: 一旦拿到了数据就变成了数据操作,不再是 IO。

阻塞 IO 和非阻塞 IO 的区别在于第 1 阶段发起 IO 请求是否被阻塞,如果阻塞直到请求完成就是传统的阻塞 IO,如果不阻塞就是非阻塞 IO。

同步 IO 和异步 IO 的区别在于第 2 阶段是否被阻塞,如果不阻塞,而是操作系统做完 IO 操作再将结果返回,那么就是异步 IO。

一般来讲:

阻塞 IO 模型、非阻塞 IO 模型、IO 复用模型(select/poll/epoll)、信号驱动 IO 模型都属于同步 IO,因为阶段 2 都是阻塞的(尽管时间很短)。

五种 IO 模型的比较

同步异步 IO、阻塞非阻塞 IO

概念

同步异步 IO 的概念

  • 同步 IO:用户进程发起 IO 请求后,需要等待或轮询内核 IO 操作完成后才能继续执行。
  • 异步 IO:用户进程发起 IO 请求后,不需要等待或轮询内核 IO 操作是否完成,内核 IO 操作完成后会通知用户进程,或调用用户进程注册的回调函数。

阻塞非阻塞 IO 的概念

  • 阻塞 IO:IO 操作需要彻底完成后,才能返回用户空间。
  • 非阻塞 IO:IO 操作被调用后立即返回一个状态值,无需登台 IO 操作彻底完成。

异步 IO 模型

阻塞 IO 模型

非阻塞 IO 模型

IO 复用模型