epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.以一个生活中的例子来解释.假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈扮演的就是多路复用IO的角色.进一步解释select和epoll模型的差异.select版大妈做的是如下的事情:比如同学甲的朋友来了,select版大妈比较笨,她带着朋友挨个房间进行查询谁是同学甲,你等的朋友来了,于是在实际的代码中,select版大妈做的是以下的事情:
intn=select(&readset,NULL,NULL,100);
for(inti=0;n>0;++i)
{
if(FD_ISSET(fdarray[i],&readset))
{
do_something(fdarray[i]);
--n;
}
}
epoll版大妈就比较先进了,她记下了同学甲的信息,比如说他的房间号,那么等同学甲的朋友到来时,只需要告诉该朋友同学甲在哪个房间即可,不用自己亲自带着人满大楼的找人了.于是epoll版大妈做的事情可以用如下的代码表示:
n=epoll_wait(epfd,events,20,500);
for(i=0;i<n;++i)
{
do_something(events[n]);
}
在epoll中,关键的数据结构epoll_event定义如下:
typedefunionepoll_data{
void*ptr;
intfd;
__uint32_tu32;
__uint64_tu64;
}epoll_data_t;
structepoll_event{
__uint32_tevents;/*Epollevents*/
epoll_data_tdata;/*Userdatavariable*/
};
可以看到,epoll_data是一个union结构体,它就是epoll版大妈用于保存同学信息的结构体,它可以保存很多类型的信息:fd,指针,等等.有了这个结构体,epoll大妈可以不用吹灰之力就可以定位到同学甲.别小看了这些效率的提高,在一个大规模并发的服务器中,轮询IO是最耗时间的操作之一.再回到那个例子中,如果每到来一个朋友楼管大妈都要全楼的查询同学,那么处理的效率必然就低下了,过不久楼底就有不少的人了.对比最早给出的阻塞IO的处理模型, 可以看到采用了多路复用IO之后, 程序可以自由的进行自己除了IO操作之外的工作, 只有到IO状态发生变化的时候由多路复用IO进行通知, 然后再采取相应的操作, 而不用一直阻塞等待IO状态发生变化了.从上面的分析也可以看出,epoll比select的提高实际上是一个用空间换时间思想的具体应用.
分享到:
相关推荐
本文详细介绍了epoll原理、工作机制、和select的区别、为什么高效以及epoll事件的两种工作模型。 内容通俗易懂,特别适合初学者学习理解。
把epoll接收数据封装为接口形式供线程调用
epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht
Lua的epoll模块 更多细节,请查看sample.lua API: ok,err=epoll.setnonblocking(fd) 设置一个文件描述符非阻塞。 epfd,err=epoll.create() 创建一个 epoll 文件描述符。ok,err=epoll.register(epfd,fd,event...
linux epoll多线程编程 例子
epoll反应堆模型代码,相对于网上普通的epoll模型增加了send recv 操作,并有详细的注释epoll反应堆
linux socket tcp大并发 epoll使用教程 有关epoll的一切
为什么ET模式可以提高IO效率呢?用户在调用epoll_wait时,ET模式产生的事件只会报告一次。不管epoll管理的连接有多少,epoll_wait都会在常数时间内返回。而使用LT模式时,epoll_wait会去遍历所有连接的状态,只要...
epoll模型http server
在一些 benchmark中,如果所有的socket基本上都是活跃的---比如一个高速LAN环境,epoll并不比select/poll有什么效率,相 反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN...
poll 与epoll分析,poll 与epoll的源代码,
linux下的epoll版telnet服务器。。linux下的epoll版telnet服务器。。linux下的epoll版telnet服务器。。linux下的epoll版telnet服务器。。linux下的epoll版telnet服务器。。linux下的epoll版telnet服务器。。linux下...
由于此处仅为Epoll类库的第一个版本, 因此错误之处必然会存在, 如果读者在阅读的过程中发现了该类库的BUG, 还望这篇博客的读者朋友不吝赐教; 而作者也会不断的更新该类库(主要更新代码我会发布到此处), 以处理新的...
epoll原理分析 epoll原理分析 epoll原理分析
epoll开发的一个简单例子,应用了EPOLL做异步通信,只是一个简单例子。
epoll c++ linux 技术探讨,新手必备 epoll c++ linux 技术探讨,新手必备 epoll c++ linux 技术探讨,新手必备
timerfd和epoll整理
socket epoll 通讯实例
Linux下QT开发,网络服务器Demo,采用Epoll库
python 使用epoll 示例代码