I/O模型

Posted bzaq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I/O模型相关的知识,希望对你有一定的参考价值。

Unix下有5种可用的I/O模型:

  • 阻塞式I/O
  • 非阻塞式I/O
  • I/O复用(select、poll、epoll)
  • 信号驱动式I/O(SIGIO)
  • 异步I/O  

(1) 阻塞式I/O模型

  像scanf, cin这些就是最简单的阻塞式I/O, 在正确读入/接收到数据之前, 进程被阻塞, 无法继续向下运行, 只有当数据到达或者发生错误时才返回。在网络编程中, 常见的阻塞式I/O有read, recv, accept等

(2) 非阻塞式I/O模型

  进程把一个套接字设置成非阻塞是再通知内核: 当所有的I/O操作非得把本进程投入睡眠才能完成时, 不要把本进程投入睡眠, 而是返回一个错误。

技术分享图片

如上图中, 前三次调用recvfrom时没有数据可返回, 因此内核转而立即返回一个EWOULDBLOCK错误, 第四次调用recvfrom时已有一个数据报准备好, 他被复制到应用进程缓冲区, 于是recvfrom成功返回。当一个进程像这样对一个非阻塞描述符循环调用recvfrom时, 我们称之为轮询(polling)。这么做往往耗费大量CPU时间, 通常是在专门提供某种功能的系统中才有。

(3) I/O复用模型

  我们可以通过调用select, poll或者epoll, 使阻塞不在真正的I/O系统调用上, 比如select, 他同时管理多个套接字, 等待数据包套接字变为可读, 然后返回可读条件, 之后才在调用真正的I/O系统调用

技术分享图片

 

(4) 信号驱动I/O模型

  这种模型是让内核在描述符就绪时发送SIGIO信号通知我们, 我们可以通过sigaction安装一个信号处理函数, 当接收到SIGIO信号时, 在处理函数中直接读取数据, 或者通知主循环让他读取数据。这种模型的优势在于等待数据报到达期间进程不被阻塞, 主循环可以继续执行, 只需等待来自信号处理函数的通知

(5) 异步I/O模型

  这种I/O模型与信号驱动模型主要区别在于: 信号驱动模型是内核通知我们何时可以启动一个I/O操作, 而异步模型是内核通知我们何时完成了I/O操作

 

以上是关于I/O模型的主要内容,如果未能解决你的问题,请参考以下文章

Unix I/O与Java I/O

Unix I/O与Java I/O

Linux系统I/O模型和网络I/O模型

UNIX五种I/O模型

5种I/O模型

WEB服务与NGINX-NGINX的I/O模型