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的取值如下:

常量值 events revents 说明 POLLIN Y Y 普通或优先带数据可读 POLLRDNORM Y Y 普通数据可读 POLLRDBAND Y Y 优先级带数据可读 POLLPRI Y Y 高优先级数据可读 POLLOUT Y Y 普通数据可写 POLLWRNORM Y Y 普通数据可写 POLLWRBAND Y Y 优先级带数据可写 POLLERR N Y 发生错误 POLLHUP N Y 发生挂起 POLLNVAL N Y 描述符不是一个打开的文件

timeout参数的可能取值如下:

值 说明 INFTIM 永远等待 0 不等待,立即返回 > 0 等待指定的时间值
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鸽子家飞时间短怎么办 宝宝吃母乳不吃奶瓶怎么办 邮件群发超50人怎么办 鸽子拉白色水便怎么办 进京没办进京证怎么办 吃海鲜喝牛奶了怎么办 煎牛排油少了怎么办 网上订酒店去后怎么办 澳洲语言班没过怎么办 照片粘在玻璃上怎么办 照片粘玻璃上怎么办啊 个人3月旅游签证怎么办 澳洲签证拒签了怎么办 我想买房子可是没钱怎么办 微信身份证17位怎么办 身份证后4位泄露怎么办 车牌照掉了一个怎么办 车牌螺丝孔坏了怎么办 借了贷款还不起怎么办 谷歌验证码丢了怎么办 谷歌验证码错误怎么办 未满16岁怎么办银行卡 身份证在北京丢了怎么办 出国前护照丢了怎么办 在美国护照丢了怎么办 护照上照片太丑怎么办 小额贷还不起了怎么办 护照不到6个月怎么办 出国的护照是怎么办的 快递被退回去了怎么办 枫叶卡过期9年怎么办? l签去台湾怎么办入台证 导游证考过了怎么办 在澳洲护照丢了怎么办 在韩国护照丢了怎么办 回国前护照丢了怎么办 在韩国护照掉了怎么办 在机场护照丢了怎么办 在泰国掉了护照,怎么办 在蘇梅护照丢了怎么办 护照不小心撕了怎么办