Unix网络编程(五、五种I/O模型)

I/O模型

常用的I/O模型分为五大类

  1. 阻塞I/O
  2. 非阻塞I/O
  3. I/O复用
  4. 异步I/O
  5. 信号驱动式I/O

阻塞I/O

最流行的i/o模型就是阻塞i/o模型,在前面试验的所有代码中,用的都是该模型。在默认情况下,所有套接字都是阻塞的。
比如说调用了recvfrom函数。如果此时内核中没有数据的话,进程便会一直阻塞在该函数上,直到等到数据传递到进程中。
数据的传递过程如下图所示。
图片来自unix网络编程

非阻塞I/O

在创建套接字的时候可以通过某些选项将该套接字设置为非阻塞套接字。那么在后面对该套接字进行读或者写操作,这些函数不会在内核中等待数据到来时才返回,而是直接返回一个EWOULDBLOCK的error。进程可以根据返回值来判断数据是否到来,从而在合适的地方去取数据。
以下为示意图
图片来自unix网络编程

I/O复用

I/O复用模型就是为了让进程阻塞在提供的I/O复用函数上(),而不是阻塞在真正的I/O调用之上,如下面的select模型
图片来自unix网络编程

信号驱动式I/O模型

信号驱动式I/O模型是指通过signaction系统调用建立对SIGIO信号的处理事件。这样可以让内核在数据到来的时候通过SIGIO信号通知用户进程,过程如下图所示
图片来自unix网络编程

异步I/O模型

异步IO是通过调用系统提供的异步函数来实现。它们的工作机制是告知内核启动某个操作,并在操作完成之后通知用户进程。它与信号驱动模型的区别在于,信号驱动模型是内核通知我们何时启动IO操作。而该模型是内核通知我们IO操作何时完成。
图片来自unix网络编程

五种模型的比较

图片来自unix网络编程