前言
阻塞、非阻塞、同步、异步,这些IO名词经常听到,但是很容易混淆,这里记录一下他们的区别与联系。
IO模型概览
上述词语都和IO编程相关,我们先来了解一下IO模型。依据《UNIX网络编程》的说法,IO模型共分为五种,分别为:
- 阻塞IO
- 非阻塞IO
- IO复用
- 信号驱动IO
- 异步IO
下面分别简单介绍之。
阻塞IO模型
这是最基本的IO模型,进程通过recvfrom系统调用向内核请求数据,在内核准备好数据并返回给进程之前,进程一直阻塞等待。
非阻塞IO模型
在非阻塞IO模型中,进程不是被动等待数据返回,而是每隔一段时间就使用recvfrom系统调用询问(轮询)内核数据是否准备好。若还未准备好,则内核会返回一个EWOULDBLOCK错误;若准备好,则进程执行recvfrom系统调用。
IO复用模型
在IO复用模型中,多个进程可以同时请求数据并阻塞,使用select或poll系统调用,由select或poll代为请求内核的系统调用。当某个进程的数据准备好之后,即通知该进程执行recvfrom系统调用,其他进程继续等待。
信号驱动IO模型
通过系统调用sigaction,为进程安装一个信号处理程序,进程可以非阻塞地继续执行。当数据准备好,内核为进程生成一个信号,通知进程,然后进程执行recvfrom系统调用。
异步IO模型
异步IO与信号驱动IO类似,都是由内核通知进程,但是区别在于:信号驱动IO是由内核通知进程何时可以启动一个IO操作,而异步IO是由内核通知进程IO操作何时完成。
IO模型比较
前四种IO模型的主要区别都在第一阶段,而第二阶段,在数据从内核拷贝到用户空间时,都是阻塞于recvfrom调用;异步IO的两个阶段都不同于前四种模型。
同步IO与异步IO
Posix.1定义:
- 同步IO操作引起请求进程阻塞,直至IO操作完成
- 异步IO操作不引起请求进程阻塞
根据上面的定义,前四种模型都是同步模型,而异步IO模型属于异步模型。
总结
同步、异步的区别是返回结果的方式:同步是直接返回结果;异步是通过通知、回调等方式返回结果。
阻塞、非阻塞都描述同步IO模型,他们的区别是进程等待结果时的状态:阻塞是进程挂起等待;非阻塞是进程继续执行,不挂起,并进行轮询。