I/O复用
来源:互联网 发布:物流运输软件多少 编辑:程序博客网 时间:2024/06/08 06:13
1. I/O复用的原因及场景
之所以会进行I/O复用是因为不想让代码阻塞在某一个I/O相关的系统调用中。因此,只要是涉及到操作多个文件描述府的程序,都适合使用I/O复用。
2. 基本的I/O处理模型
2.1 阻塞式I/O
“一直等待,直至有数据返回”
最常见的I/O方式,在进行IO系统调用时,进程阻塞,直至系统调用完成返回,进程继续进行。例如,程序中调用recv函数,然后该进程阻塞在这里,直到recv函数返回,才继续执行下面的代码。
2.2 非阻塞式I/O
“即刻返回,没有数据时返回错误码,可由此构造轮询IO请求模型”
也可视为轮询请求IO的一种方式。即,当调用系统调用时,如果此时无数据可返回,则直接返回一个错误码。在编程时,可根据返回值判断,若为错误码则可使进程睡眠特定时间或做一些其他的事,然后再次请求IO,如此反复,直至有数据返回。由此,构成了一个轮询的IO请求。
2.3 I/O复用(select&poll)
“也是阻塞,但是是让程序阻塞在多个文件描述符上,而非一个”
通过使用select和poll,指定需要等待I/O的文件描述符,然后让进程阻塞在select上,之后,如果文件描述符集合中任意一个准备好,select会返回,程序继续执行。
2.4 信号驱动I/O
“创建SIGIO的信号处理程序”
使内核在文件描述府就绪时发送SIGIO信号给程序,程序中捕捉并进行相应处理。需要注意的是,需程序开启该功能。
2.5 异步I/O模型
“内核通知程序I/O何时完成”
与信号驱动类似,也是内核通知,不同在于,信号驱动通知时,我们可以启动一个I/O调用操作,而该模型中,通知时,I/O操作已完成,因此我们无需感知到该信号,并设置信号处理函数。需要注意的是,可能不是每个系统均支持该种模型。
3. Select函数
/* According to POSIX.1-2001 */#include <sys/select.h>/* According to earlier standards */#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);struct timeval{ long tv_sec; /* second */ long tv_usec; /* microsecond */}/* 清空FD集 */void FD_ZERO(fd_set *fdset);/* 向FD集中添加fd符 */void FD_SET(int fd, fd_set *fdset);/* 清楚FD集中的描述符fd */void FD_CLR(int fd, fd_set *fdset);/* 判断fd是否在FD集中 */void FD_ISSET(int fd, fd_set *fdset);
其中,timeout置为空指针时,该函数会一直等到有IO准备好才返回。timeout中的值全为0时,根本不等待直接返回。timeout中包含一定数值时,在时间内有准备好的IO会返回,或者到达指定时延后会返回。
4. Poll函数
#include <poll.h>int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);struct pollfd{ int fd; short events; /* 感兴趣的事件 */ short revents; /* 发生的事件 */};
其中events和revents的取值如下:
timeout参数的可能取值如下:
- I/O模型以及I/O复用
- epoll I/O复用
- I/O复用
- I/O 复用
- Linux I/O复用
- I/O复用-epoll
- I/O复用
- I/O复用
- I/O复用
- I/O复用poll
- I/O复用epoll
- I/O复用--《APUE1》
- I/O复用
- I/O复用
- I/O复用
- I/O复用
- I/O复用------select
- I/O复用------poll
- 欢迎使用CSDN-markdown编辑器
- (笔记)图像的客观评价标准:PSNR
- 记4.19日灵异现象
- w1
- C++中cin、cin.get()、cin.getline()、getline()等函数的用法
- I/O复用
- Post Tagged 【dp】最大子数组和(最大子序列和 | 连续子数组最大和)
- 既然选择了,就义无反顾的走吧
- 解题报告 之 POJ1149 Pigs
- 市赛选拔赛题目集锦
- 第8题
- [BZOJ2330]SCOI2011糖果|差分约束
- 阿里巴巴平台型产品经理
- How To Avoid Disk Full Issues Because OPatch Backups Take Big Amount Of Disk Space. (文档 ID 550522.1)