IO 操作
概念
IO 分成两个阶段:
- 数据准备
- 内核空间复制数据到用户空间(用户进程缓冲区)
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 操作彻底完成。