IO复用


前言

阻塞、非阻塞、同步、异步,这些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模型,他们的区别是进程等待结果时的状态:阻塞是进程挂起等待;非阻塞是进程继续执行,不挂起,并进行轮询。

参考资料

UNIX网络编程


坚持原创技术分享,您的支持将鼓励我继续创作!