Linux select/poll和epoll实现机制对比

关于这个话题,网上已经介绍的比较多,这里只是以流程图形式做一个简单明了的对比,方便区分。

一、select/poll实现机制

特点:

1.select/poll每次都需要重复传递全部的监听fd进来,涉及用户空间和内核直接的数据拷贝。

2.fd事件回调函数是pollwake,只是将本进程唤醒,本进行需要重新遍历全部的fd检查事件,然后保存事件,拷贝到用户空间,函数返回。

3.每次循环都是对全部的监测的fd进行轮询检测,可能发生事件的fd很少,这样效率很低。

4.当有事件发生,需要返回时,也需要将全部fd的事件进行返回,而其中可能只有很少的fd有事件发生。

5.select/poll返回时,会将该进程从全部监听的fd的等待队列里移除掉,这样就需要select/poll每次都要重新传入全部监听的fd,然后重现将本进程挂载到全部的监测fd的等待队列,大量重复劳动,效率很低。

参考链接:http://www.cnblogs.com/apprentice89/archive/2013/05/09/3070051.html

二、epoll实现机制

特点:

1.每次累加添加,不需要每次传入全部的监测fd。

2.每个fd只将本进程挂载到自己的等待队列一次,直到该fd被从epoll移除,不需要重复挂载。

3.fd事件回调函数是ep_epoll_callback,该函数将发生事件的fd加入到epoll专门的就绪队列rdllist中,同时唤醒本进程。

4.本进程不需要遍历每一个fd去监测事件是否发生,而只需要判断epoll中的就绪队列rdllist是否为空即可。

5.epoll返回时,只返回就绪队列rdllist中的项,避免了无关项的操作,应用层也就不需要再次重复遍历。

6.epoll内部使用红黑树存储监测fd,支持大量fd的快速查询、修改和删除操作。

epoll与select/poll机制的相同点:

1.主要监测流程是一样的,都需要将当前进程挂载到对应fd的队列中去。如果fd有事件发生,调用挂载的回调函数,该回调函数基本的作用是唤醒本进程。

2.主事件检测循环是一样的,循环检测是否有事件发生,有则处理事件后返回;没有则调用schedule_timeout睡眠一会。不同的是,select/poll直接检测每个fd,而epoll只需检测就绪队列rdllist是否有数据即可。

参考链接:http://www.cnblogs.com/apprentice89/p/3234677.html

注:引用本人文章请注明出处,谢谢。

时间: 2024-10-12 13:45:45

Linux select/poll和epoll实现机制对比的相关文章

Linux下select, poll和epoll IO模型的详解(转)

http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热门人选, Epoll 在 Linux2.6 内核中正式引入,和 select 相似,其实都 I/O 多路复用技术而已 ,并没有什么神秘的.其实在 Linux 下设计并发网络程序,向来不缺少方法,比如典型的 Apache 模型( Process Per Connection ,简称 PPC ), TP

I/O多路复用之select,poll,epoll的区别

一.关于select,poll,epoll 三种IO模型,都属于多路IO就绪通知,提供了对大量文件描述符就绪检查的高性能方案,只不过实现方式有所不同: select原理概述: 调用select时,会发生以下事情: (1)从用户空间拷贝fd_set到内核空间: (2)注册回调函数__pollwait: (3)遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等

阻塞、非阻塞、异步、同步以及select/poll和epoll

针对IO,总是涉及到阻塞.非阻塞.异步.同步以及select/poll和epoll的一些描述,那么这些东西到底是什么,有什么差异? 一般来讲一个IO分为两个阶段: 等待数据到达 把数据从内核空间拷贝到用户空间 现在假设一个进程/线程A,试图进行一次IO操作. A发出IO请求,两种情况: 1)立即返回 2)由于数据未准备好,需要等待,让出CPU给别的线程,自己sleep 第一种情况就是非阻塞,A为了知道数据是否准备好,需要不停的询问,而在轮询的空歇期,理论上是可以干点别的活,例如喝喝茶.泡个妞.

I/O复用的 select poll和epoll的简单实现

一个tcp的客户端服务器程序 服务器端不变,客户端通过I/O复用轮询键盘输入与socket输入(接收客户端的信息) 服务器端: 1 /*selcet服务器客户端模型: 2 1.客户端关闭后,服务器再向客户端发送信息,第一次会收到一个RST复位报文,第二次会收到SIGPIPE信号,导致服务器关闭,必须对这个信号进行处理: 3 1.在服务器对read返回值为0的情况进行处理,不向客户端发送信息 4 2.signal函数: signal(SIGPIPE, handle) 或者直接忽略signal(SI

Linux中select poll和epoll的区别

在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select.poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并 发的场景下,nginx越来越收到欢迎.这里有个文章参考.Nginx成为全球Top1000网站最受欢迎的Web服务器. 据 w3techs 7月 3 日的统计数据表明

select poll和 epoll

select .poll.epoll 都是多路io复用的机制,i/o多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知乡音的程序进行相应的读写操作.但select poll epoll 本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的(即就绪后切换到内核态进行吧数据从内核拷贝到空间),而异步I/O则无需自己负责读写. 与多进程多线程技术相比.I/O多路复用技术的最大优势是减小系统开销,系统不必创建.

select,poll 和 epoll ??

其实所有的 I/O 都是轮询的方法,只不过实现的层面不同罢了. 其中 tornado 使用的就是 epoll 的. selec,poll 和 epoll 区别总结 基本上 select 有 3 个缺点: 1.连接数受限   2.查找配对速度慢   3.数据由内核拷贝到用户态 poll 改善了第一个缺点 epoll 改了三个缺点. 原文地址:https://www.cnblogs.com/lmh001/p/9739507.html

【Unix环境编程】select、poll、epoll机制的联系与区别

在linux设计并发网络程序,主要有如下几种模型:Apache模型(Process Per Connection, PPC).TPC(Thread Per Connection)模型,select机制.poll机制以及epoll. 1.  PPC/TPC模型 这两种模型思想类似,每一个新的链接就用一个线程或者进程处理.PPC使用使用进程.TPC使用线程.缺点是连接多了以后,这么多进程和线程的切换非常大.因此这类模型的能接受的最大连接数不会太高,一般几百个左右. 2.  select机制 PPC/

Linux多线程编程----IO【select、poll、epoll】

IO操作多   速度就下降 IO数据的 读和写 IO的完成 必须等到 读事件(如磁盘 拷贝  每次要从磁盘查找数据) 和 写事件 (允许写 如写太快 写满就要马上阻塞)的就绪 IO是否高效 :主要看一次IO中 等的时间的比例的多少 (等的时间比例越少  越高效) 就像钓鱼分两步:1 等 2 钓   (评价钓鱼技术高效 是 等的时间少 钓的次数多) 5中IO模型 1 阻塞式IO: 等的时候自己等   , 数据搬迁也是由自己来操作, IO事件就绪时 自己处理.期间什么也不做 2 非阻塞IO :(轮询