概论:

select、poll和epoll三组I/O复用系统调用,这3组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回.返回值是就绪的文件描述符的数量。返回0表示没有事件发生,超时.

我们从事件集、最大支持文件描述符的数量、工作模式和具体实现等四个方面进一步比较它们的异同.

事件集:

这三个函数都是通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些事件,并使用该结构体类型的参数来获取内核处理的结果。

select模型:参数类型是fd_set,提供3个这样的结构来表示监听三种不同类型的事件可读、可写和异常.这使得select不能监听更多类型的事件。另外一方面由于内核对fd_set的输出结果进行修改,这使得select不得不在再次调用select时必须重置fd_set集合.

poll模型:把文件描述符和事件同时定义在一个结构体pollfd中。任何事件都统一处理,从而使得编程接口更加规范.并且内核每次返回修改的都是pollfd的revents成员,而events成员保持不变,所以下次调用poll不需重置.

但是select和poll的共同缺点:每次两者调用都需要返回整个用户注册的事件集.包括就绪的和未就绪的。这使得必须对整个事件集逐个遍历判断,时间复杂度O(n).

epoll模型采用了与select、poll完全不同的方式来管理用户注册的事件.它在内核中维护一个事件表,并提供一个独立的系统调用epoll_ctl来操作往其中添加、删除、修改事件。同时epoll_wait函数的events参数仅用来返回就绪的事件,这使得直接索引就绪文件描述符的事件复杂度O(1).

文件描述符的数量:

select能够同时监听最大的文件描述符数量是1024个,这使得往往对于大规模用户登录的服务器端明显不足。而poll和epoll相对没有限制,通常能够达到65535.

工作模式:

select、poll模型都只工作在相对低效的LT模式,而epoll可以工作在ET的高效模式.

 实现原理:

select和poll采用的都是轮询的方式,即每次调用都是扫描整个注册的文件描述符集合,并返回其中就绪的文件描述符集。而epoll采用的回调的方式,内核检测到就绪的文件描述符时,将触发回调函数,回调函数就会将该文件描述符上对应的事件插入内核就绪事件队列.

三组I/O复用模型的比较的更多相关文章

  1. select、poll、epoll三组IO复用

    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...

  2. Linux下的5种I/O模型与3组I/O复用

    引言 上一篇文章中介绍了一些无缓冲文件I/O函数,但应该什么时机调用这些函数,调用这些I/O函数时进程和内核的行为如何,如何高效率地实现I/O?这篇文章就来谈一谈Linux下的5种I/O模型,以及高性 ...

  3. I/O复用模型之select学习

    linux下的I/O模型可以分为5种: 1.阻塞式I/O模型 2.非阻塞式I/O模型 3.I/O复用模型 4.信号驱动I/O模型 5.异步I/O模型 简单解释: 阻塞和非阻塞:就是说需要做一件事的时候 ...

  4. epoll函数及三种I/O复用函数的对比

    epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd ...

  5. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  6. COMET探索系列二【Ajax轮询复用模型】

    写在前面:Ajax轮询相信大家都信手拈来在用,可是有这么一个问题,如果一个网站中同时有好多个地方需要用到这种轮询呢?就拿我们网站来说,有一个未读消息数提醒.还有一个时实时加载最新说说.昨天又加了一个全 ...

  7. swoole(3)网络服务模型(单进程阻塞、预派生子进程、单进程阻塞复用模型)

    一:单进程阻塞 设计流程: 创建一个socket,绑定端口bind,监听端口listen 进入while循环,阻塞在accept操作上,等待客户端连接进入,进入睡眠状态,直到有新的客户发起connet ...

  8. PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第三组

    七:终端风险管理-必选但包含可选步骤异常文件:终端检查应用主账号是否在异常文件列表(卡号黑名单)中.商户强制联机:商户可以将当前交易强制为联机处理.最低限额:控制交易当前交易金额或同一张卡片连续几笔交 ...

  9. CSS 设计彻底研究(三)深入理解盒子模型

    第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...

随机推荐

  1. Winform控件缩写

    控件名称 缩写 Buttom按钮 Btn CheckBox复选框 Chk ColumnHeader视图列表头 Col ComboBox组合框 Cbo ContextMenu快捷菜单 Ctm DataG ...

  2. android dom方式创建xml

    http://blog.csdn.net/nxh_love/article/details/7085174 在android dom 解析xml方式文章中,简单介绍了dom解析xml的应用.今天在原文 ...

  3. FJ省队集训DAY4 T2

    XXX #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #i ...

  4. Linux企业级项目实践之网络爬虫(5)——处理配置文件

    配置文件在Linux下使用得非常普遍,但是Linux下没有统一个配置文件标准. 我们把配置文件的规则制定如下: 1.把"#"视作注释开始 2.所有的配置项都都是以键值对的形式出现 ...

  5. 数据库 SQL语句优化

    温馨提示:本篇内容均来自网上,本人只做了稍微处理,未进行细致研究,仅当做以后不备之需,如若你喜欢可尽情转走. 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图 ...

  6. usaco5.5-Hidden Passwords

    最小表示法,感觉可以做成个模板,第一次RE是因为字符串长度变2倍了而我把数组开小了 Executing...   Test 1: TEST OK [0.008 secs, 3760 KB]   Tes ...

  7. 微博OpenAPI练习之问题记录

    今日想通过新浪微博OpenAPI,做一个客户端出来.可以说过程比较艰难.这里只记录下遇到的问题,其它的按api要求注册.创建应用什么就好了. 1.API jar引用问题 创建了自己的工程,并按照文档说 ...

  8. java 读取mysql库表数据

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  9. eclipse指定启动时的jdk(xjl456852原创)

    在eclipse安装目录中找到eclipse.ini 在第一行配置(即可启动按指定版本的jdk启动eclipse): -vm D:\soft\Java\jre8\bin\server\jvm.dll ...

  10. html checkbox全选或者全不选

    /* 全选或全不选 */ function CheckedAllOrNo() { var arr = $(':checkbox'); for (var i = 1; i < arr.length ...