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模型的主要内容,如果未能解决你的问题,请参考以下文章