poll,select与epoll

标签: poll select epoll | 发表时间:2013-11-24 10:47 | 作者:xiangjie88
出处:http://www.iteye.com
select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此select需要提供3个这种类型的参数来分别传入和输出可读,可写及异常等事件.这一方面使得select不能处理更多类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select前不得不重置这3个fd_set集合

poll的参数类型pollfd则多少"聪明"一些.它把文件描述符和事件都定义其中,任何事件都被统一处理,从而使得编程接口简洁得多.并且内核每次修改的是pollfd结构体的revents成员,而events成员保持不变,因此下次调用poll时应用程序无须重置pollfd类型的事件集参数.由于每次select和poll调用都返回整个用户注册的事件集合(其中包括就绪和未就绪的),所以应用程序索引就绪文件描述符的时间复杂度O(n).

epoll则采用与select和poll完全不同的方式来管理用户注册的事件.它在内核中维护一个事件表,并提供了一个独立的系统调用epoll_ctl来控制往其中添加,删除,修改事件.这样,每次epoll_wati调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读入这些事件.epoll_wait系统调用的events参数仅用来返回就绪的事件,这使得应用程序索引就绪文件描述符的时间复杂度的O(1).

从实现原理上来说,select和poll采用的都是轮询的方式,即每次调用都要扫描整个注册文件描述符集合,并将其中就绪的文件描述符返回给用户程序,因此它们检测就绪事件的算法的时间复杂度是O(n).epoll_wait则不同,它采用的是回调的方式.内核检测到就绪的文件描述符,将触发回调函数,回调函数就将该文件描述符上对应的事件插入内核就绪事件队列.内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间.因此epoll_wait无须轮询整个文件描述符集合来检测哪些事件已经就绪,其算法时间复杂度是O(1).但是,当活动连接比较多的时候,epoll_wait的效率未必比select和poll高,因为此时回调函数被触发得过于频繁.所以epoll_wait适用于连接数量多,但活动连接较少的情况

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [poll select epoll] 推荐:

poll,select与epoll

- - 操作系统 - ITeye博客
select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此select需要提供3个这种类型的参数来分别传入和输出可读,可写及异常等事件.这一方面使得select不能处理更多类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select前不得不重置这3个fd_set集合.

select、poll、epoll之间的区别总结

- - 企业架构 - ITeye博客
select、poll、epoll之间的区别总结. select,poll,epoll都是IO多路复用的机制. I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间.

linux下epoll模式和select模式的区别

- - Linux - 操作系统 - ITeye博客
        支持高并发连接. 官方测试的是5w并发连接但在实际生产中可制成2-4w并发连接数,得益于nginx使用最新的epoll(linux 2.6内核)和kqueue(freebsd)网络I/O模型. 而apache使用的则是传统的select模型,其比较稳定的prefork模式为多进程模式,需要经常派生子进程,所消耗的CPU等服务器资源要比nginx高的多.

user-select介绍

- - 前端观察
之前在《 CSS的未来:一些试验性CSS属性》中有提到user-select这个属性,最近整理的时候有遇到,所以详细的了解了下,这里简单的介绍下. 这是在css3 UI规范中新增的一个功能,用来控制内容的可选择性. auto——默认值,用户可以选中元素中的内容. none——用户不能选择元素中的任何内容.

select 效率问题

- - C++博客_杨粼波
 很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解. 一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果.

jsoup select 选择器

- - 编程语言 - ITeye博客
采用CSS或类似jquery 选择器(selector)语法来处理HTML文档中的数据. 利用方法: Element.select(String selector)和 Elements.select(String selector). Jsoup的元素支持类似CSS或(jquery)的选择器语法的查找匹配的元素,可实现功能强大且鲁棒性好的查询.

EPOLL下的accept(转载)

- chuang - C++博客-首页原创精华区
     摘要: (转载者注:看完这个,再回头看看nginx源码,发现它在accept时用的是LT模式,read,write时是ET模式)不知道是谁第一个犯了错,在网上贴出所谓epoll通用框架的代码. 注意看accpet的处理:1epfd = epoll_create(10);2 3struct sockaddr_in clientaddr;4struct sockaddr_in se...  阅读全文.

select的最佳预设(reset)

- - 携程UED
    我们知道select标签在各个浏览器中的属性和各浏览器的支持各有些不同,从而造成select选择框在各浏览器的显示有不同,下面我们通过对主要 外形CSS属性的支持,打造全兼容select.     我对select的height、padding、line-height分别利用控制变量的方法写了个DEMO在各浏览器上测试三种情况:height.100.padding.0、height.no.padding.100、no.height.no.padding,结果如  链接图片各浏览器DEMO外观.

Hibernate调优之select new map()

- - CSDN博客架构设计推荐文章
        Hibernate调优不只是设置一下lazy,调整一下由谁来维护这个字段而已.         这次要说的是对查询语句进行优化——select new map().         select new map语句结果说明.         语句一:.         结果list中,每条记录对应一个object数组,object[]中每个元素为hql语句中列的序号(从0开始).

epoll网络编程实例

- - CSDN博客推荐文章
       在前面已经经过了PPC、TPC、select之类( TPC就是使用进程处理data,TPC就是使用线程处理 ),前面两个的缺点大家应该都是知道的是吧,对于select( 其实poll和他差不多 ),缺点是能同时连接的fd是在是不多,在linux中一般是1024/2048,对于很大的服务器来说是不够的.