原创 EPOLL为我们带来了什么。收藏

新一篇: 卡通渲染的另类勾边方法 | 旧一篇: 情人节的巧克力。

Q:网络服务器的瓶颈在哪?
A:IO效率。

在大家苦苦的为在线人数的增长而导致的系统资源吃紧上的问题正在发愁的时候,Linux 2.6内核中提供的System Epoll为我们提供了一套完美的解决方案。传统的select以及poll的效率会因为在线人数的线形递增而导致呈二次乃至三次方的下降,这些直接导致了网络服务器可以支持的人数有了个比较明显的限制。

自从Linux提供了/dev/epoll的设备以及后来2.6内核中对/dev/epoll设备的访问的封装(System Epoll)之后,这种现象得到了大大的缓解,如果说几个月前,大家还对epoll不熟悉,那么现在来说的话,epoll的应用已经得到了大范围的普及。

那么究竟如何来使用epoll呢?其实非常简单。
通过在包含一个头文件#include 以及几个简单的API将可以大大的提高你的网络服务器的支持人数。

首先通过create_epoll(int maxfds)来创建一个epoll的句柄,其中maxfds为你epoll所支持的最大句柄数。这个函数会返回一个新的epoll句柄,之后的所有操作将通过这个句柄来进行操作。在用完之后,记得用close()来关闭这个创建出来的epoll句柄。

之后在你的网络主循环里面,每一帧的调用epoll_wait(int epfd, epoll_event events, int max events, int timeout)来查询所有的网络接口,看哪一个可以读,哪一个可以写了。基本的语法为:
nfds = epoll_wait(kdpfd, events, maxevents, -1);
其中kdpfd为用epoll_create创建之后的句柄,events是一个epoll_event*的指针,当epoll_wait这个函数操作成功之后,epoll_events里面将储存所有的读写事件。max_events是当前需要监听的所有socket句柄数。最后一个timeout是epoll_wait的超时,为0的时候表示马上返回,为-1的时候表示一直等下去,直到有事件范围,为任意正整数的时候表示等这么长的时间,如果一直没有事件,则范围。一般如果网络主循环是单独的线程的话,可以用-1来等,这样可以保证一些效率,如果是和主逻辑在同一个线程的话,则可以用0来保证主循环的效率。

epoll_wait范围之后应该是一个循环,遍利所有的事件:
for(n = 0; n < nfds; ++n) {
               if(events[n].data.fd == listener) { //如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。
                   client = accept(listener, (struct sockaddr *) &local,
                                   &addrlen);
                   if(client < 0){
                       perror("accept");
                       continue;
                   }
                   setnonblocking(client); // 将新连接置于非阻塞模式
                   ev.events = EPOLLIN | EPOLLET; // 并且将新连接也加入EPOLL的监听队列。
注意,这里的参数EPOLLIN | EPOLLET并没有设置对写socket的监听,如果有写操作的话,这个时候epoll是不会返回事件的,如果要对写操作也监听的话,应该是EPOLLIN | EPOLLOUT | EPOLLET
                   ev.data.fd = client;
                   if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
// 设置好event之后,将这个新的event通过epoll_ctl加入到epoll的监听队列里面,这里用EPOLL_CTL_ADD来加一个新的epoll事件,通过EPOLL_CTL_DEL来减少一个epoll事件,通过EPOLL_CTL_MOD来改变一个事件的监听方式。
                       fprintf(stderr, "epoll set insertion error: fd=%d0,
                               client);
                       return -1;
                   }
               }
               else // 如果不是主socket的事件的话,则代表是一个用户socket的事件,则来处理这个用户socket的事情,比如说read(fd,xxx)之类的,或者一些其他的处理。
                   do_use_fd(events[n].data.fd);
}

对,epoll的操作就这么简单,总共不过4个API:epoll_create, epoll_ctl, epoll_wait和close。
如果您对epoll的效率还不太了解,请参考我之前关于网络游戏的网络编程等相关的文章。

世界变了,原来担心的问题,现在已经不是问题了。

发表于 @ 2005年02月19日 16:18:00|评论(loading...)|编辑

新一篇: 卡通渲染的另类勾边方法 | 旧一篇: 情人节的巧克力。

评论

#elssann 发表于2005-02-20 16:51:00  IP: 219.133.197.*
to tarkey:
IOCP比不上LINUX下的Select,,..这个不见得。
我个人认为IOCP是相当优秀的一种IO模型。效率也相当不错.
不比LINUX下的EPOLL差,即使差,也差不了多少。

skywind:
至于封装形式,对于上层来说,我的接口当然是一样的,下层的实现方式不同而已。如果这点意识都没有,我还写什么程序。

#Tarkey 发表于2005-02-20 18:41:00  IP: 218.104.235.*
呵呵,不用为IOCP做任何维护了,LINUX下97年就有了IOCP类似的模型,你去找找我的blog去年9月份的文档里面,有我关于网络模型的介绍,WINDOWS根本无法胜任做为网络服务器的要求,socket本身的访问速度极其低下不说,线程本身的效率也非常的低。

#elssann 发表于2005-02-20 09:05:00  IP: 219.133.197.*
去年做过两个月的EPOLL,也封装了一个库出来,但是感觉效率没有我在WINDOWS下封的IOCP的效率高。
也许是我对LINUX编程和EPOLL的理解还不够深入。也许是我当时使用的Fedora Core2的平台不够好,。
准备等有时间了在Slackware和Debian上再试试。

在eDonkey Server的主页上,他们发布的消息,称他们的服务器程序用2.6内核的NPTL和EPOLL以及futex这些,完全用C写的,在P4 XEON*2,4G内存的机器上支持280K用户。
还有一个开源的JABBER服务器,用EPOLL在PIII * 2的机器上支持50000连接。

从这上面看来,我的那个EPOLL库效率不高应该是我自己的原因。

#elssann 发表于2005-02-21 11:45:00  IP: 219.133.197.*
WINDOWS下的context switch的代价是比LINUX下的高,但是IOCP的线程本身是一个F/L的THREAP POOL模型,处理得好的话,线程切换机会会下降很多。

准备过段时间再去slackware和debian下折腾EPOLL
#elssann 发表于2005-02-21 08:58:00  IP: 219.133.197.*
你的那篇文档我看过,其实很多这些评测个人认为没多少意义。
如果需要,我同样可以找出MS的WINDOWS SERVER和SQL SERVER评测数据超过LINUX和ORACLE的东西来,就在MS的站点上。

#Tarkey 发表于2005-02-21 09:21:00  IP: 218.66.59.*
你仔细琢磨琢磨IOCP的模型就明白了。
不要小视了线程间切换的代价。

至于WIN + SQL SERVER要超过Linux + Oracle则纯粹是炒做了,我的那篇文章中表格的数据的评测代码如果你要的话,我都可以给你,可信度还是相当高的。
#skywind 发表于2005-02-21 13:23:00  IP: 210.21.13.*
显然,在异步IO的各个模型相继出现后,微软也需要在这块领域上提供些东西

微软的解决方案就是线程池,每个线程使用一个类似SIGIO的机制

这就使得微软将多线程的缺点与SIGIO的缺点捆绑到一起,更令人惊奇的是微软的市场人员通过艰辛的努力居然将其描述成为一场伟大的革命

我在他们的官方文档里找到这样一句话: "First of all, threads are system
resources that are neither unlimited nor cheap."
"Not cheap" ? 我想这就是它存在的原因吧
#Tarkey 发表于2005-02-20 15:26:00  IP: 218.104.235.*
不要拿WINDOWS和LINUX以及FREE BSD之类来比。
WINDOWS内嵌的GUI就导致了必然很多系统调用的效率要比其他操作系统平台低很多。

IOCP甚至比不过以前Linux下用的最简单的select模型。
#skywind 发表于2005-02-21 10:42:00  IP: 210.21.13.*
何必拘泥于ACE,公司有实力也不会去开发个那种东西,虽然ACE学的人很多,然而说到底,只是一个学术产品,如果在实际中应用很多问题都会暴露出来,何况现在也没有几个算得上成功的案例,举个简单的例子:ACE在Linux下RT-Signal的信号缓存区溢出BUG就一直没有解决。这个问题就是几年前某MMO碰到的情况,在人数少的情况下根本不会出现,当人数增加到4000时,服务器开始逐台崩溃了。

没说要做什么ACE,ACE只是一个学术产品而已,然而反照他其中一两个模型进行设计也不是什么难事
#skywind 发表于2005-02-20 16:01:00  IP: 210.21.13.*
当然只能怪你的封装问题了,不要局限于什么epoll,还是应该象ace一样,提供统一的接口,下层针对不同的系统,提供freebsd的kqueue,linux的epoll/rtsig,以及devpoll还有iocp等,不管什么平台下代码都无修改的编译运行。
#elssann 发表于2005-02-21 15:30:00  IP: 219.133.197.*
这么看来MS的开发人员都是SB。

觉得IOCP差劲的可以把EPOLL作者的主页上提供的那个EPOLL例子和《WINDOWS核心编程》(第二版)提供的那个例子或者MS 的PLATFORM SDK里的那个IOCP例子拿出来在同样的机器上跑一下,看差距能差多少。

#Tarkey 发表于2005-02-20 16:18:00  IP: 218.104.235.*
:) 这是自然,只不过目前真正纯粹的开发网络平台的公司也不见得多,尤其是像做网络游戏的,大部分都是有针对性的封装,比如说我的服务器今后确定了要在linux下跑,我就主要封一个epoll,其他平台就用select只要求能跑就行了。

毕竟有实力开发ACE,ICE之类的东西的公司国内也不见得多。
#skywind 发表于2005-02-21 17:16:00  IP: 210.21.13.*
iocp的确有它的有点,但仍然不能用一两个既简单又极端的例子概括呢?即使快速的icc也只是就像执行某些代码时能快GCC三四倍而已,复杂点的例子测试下结果就出来了,例如多线程里用kqueue或者epoll等。
#elssann 发表于2005-02-22 15:07:00  IP: 219.133.197.*
ok,我已经给你发了邮件,请查收
#Tarkey 发表于2005-02-22 11:58:00  IP: 218.104.235.*
我不仅仅只是测试结果而已,我说过,如果你想要那些测试代码的话,可以发EMAIL给我:xia.tony@gmail.com

不用看结果,看过代码自然就明白了。
#Tarkey 发表于2005-02-21 19:29:00  IP: 218.104.235.*
呵呵,有官方的评测不还说JAVA比C快么。
#elssann 发表于2005-02-22 09:30:00  IP: 219.133.197.*
呵呵,tarkey,开始你摆出了你以前的那篇WINDOWS和LINUX下SOCKET的速度以及创建和线程速度的评测文档。

现在又说有官方的评测不还说JAVA比C快。

你对待这些评测的态度是前后矛盾啊:)
#sodme 发表于2005-02-25 02:22:00  IP: 222.209.115.*
tarkey,工作还好吗?给我一份代码吧:sodme@tygame.com
#Tarkey 发表于2005-02-25 08:39:00  IP: 218.66.59.*
呵呵,还好还好,以上两位的都发了 =)
#wineim 发表于2005-03-11 02:41:00  IP: 211.68.44.*
Tarkey :今天偶见你写的 这篇文章,非常高兴,感谢你辛苦的付出!

你那有完整的epoll模型吗?可否发一份给我:wineim@163.com

谢谢!
#eric 发表于2005-03-21 16:16:00  IP: 218.109.38.*
Win2k+IOCP和Linux AS4+select模型的对比测试,我做了一次。
IOCP用的是微软网站上截止去年最新的例子,select用的是datapipe.c改进型。

测试结果,同样硬件条件下,AS4+select的通讯效率比Win2k+IOCP至少要高30%以上。
#eric 发表于2005-03-21 16:21:00  IP: 218.109.38.*
测试用硬件环境为 P4 Xeon *2, 512 ECC RAM
#eric 发表于2005-03-21 16:37:00  IP: 218.109.38.*
我会在近期试试epoll模型,并测量一下性能。我最相信的,还是自己测出来的数据。
#gxcooo 发表于2005-04-01 16:57:00  IP: 218.242.140.*
呵呵 Tarkey回国了啊,不知道现在何处高就?
前段我在公司的一个游戏项目中用了EPOLL,效率看起来确实比IOCP高一点(仅限于我的测试环境和用例)。
ACE中也有对EPOLL的封装,不过bug多多,提交了几个bug后才知道ACE的改进有多缓慢,不得已自己封装了一个结合ACE来使用.
#tarkey 发表于2005-04-03 12:03:00  IP: 218.104.235.*
我目前在福州网龙天晴数码 =)
#gxcooo 发表于2005-04-01 17:01:00  IP: 218.242.140.*
linux也有真正和IOCP一样的异步socket IO机制:
http://aem.sourceforge.net/
不过我看这个很难融合到linux中,AIO应该会逐步完善异步socket IO
#eric 发表于2005-03-31 08:47:00  IP: 218.109.43.*
AS4+EPOLL比Win2k+IOCP要高50%以上
#tarkey 发表于2005-03-31 11:34:00  IP: 218.104.235.*
谢谢你的数据:)
这组数据跟我最开始在EPOLL出来的时候的测试结果很类似。
#gouki 发表于2005-03-31 20:47:00  IP: 218.79.203.*
你好,上面是我的blog;)

我2年前也是作游戏的,嘿嘿

如果可以,认识一下吧

我的msn:goukiteng@hotmail.com
#gedamis 发表于2005-04-11 10:19:00  IP: 221.216.200.*
tarkey, 能否给我一份上面提到的测试代码,谢谢.
gedamis@163.com
#jindu 发表于2005-04-10 18:20:00  IP: 211.68.44.*
对于 epoll 有两个问题不太懂,请多多指教:

例子程序及epoll用法说明参见以下网页:
http://dev.csdn.net/article/55/article/53/53343.shtm
http://articles.gameres.com/Program/Control/Epoll.htm


问题1:关于 epoll_wait 函数
nfds = epoll_wait(kdpfd, events, maxevents, -1);
该函数的返回值的意义是什么?事件数组events又与该返回值有何关系?为什么之后遍历要用该返回值作参数


//-------------------
nfds=epoll_wait(epfd,events,20,500);
//处理所发生的所有事件
for(i=0;i<nfds;++i)
if(events[i].data.fd==listenfd)

---------------------------------------------
问题2:对于epoll_wait函数中的两参数:events,20 不明白,以上网页的注释是这样说的:
//-----------------------------------
//声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
struct epoll_event ev,events[20];
//-----------------------------------
那么:20 这个参数是要监听的最大句柄数,那么此20与 epoll_create中的maxfds(epoll所支持的最大句柄数

)有何关系??且此20能否将已经保持连接的所有socket都能监听到??这个20的大小会直接影响到什么??

设成1呢?或者设成比 maxfds 还在大呢会是什么样的结果?

问题3:给一个已连接的客户端发送数据时,是不是先要给这个客户端的句柄上注册一个写事件:EPOLLOUT,然

后再在epoll_wait的检测中收到此事件时就可以把实际的数据发送出去吗?我直接往句柄上写入要发送的数据

可行吗?如:
sockfd = events[i].data.fd;
write(sockfd, line, n);




以上是我一直比较疑或的几点,盼回复!万分感谢!

#jindu 发表于2005-04-11 11:29:00  IP: 211.68.44.*
关于 tarkey 针对第二个问题的回答:

events 数组的大小如何来定?如:epoll_create的时候,传进去的是500,那么 events这个数组定多大时效率最高,定这个值的依据是什么?
#tarkey 发表于2005-04-11 09:15:00  IP: 218.104.235.*
回答1:
epoll_wait的返回值表示当前有多少fd是available的
events里是也是epoll_wait的输出,是一个epoll_event的结构,里面包含这次epoll_wait中所有有效的事件。

之后之所以要遍历events,是为了处理这一次wait中返回的所有事件,这些时间都保存在events里。

回答2:
那个20是你的events的大小,这个值一般要小于或者等于你的maxfds。maxfds是epoll可以监听的最大fd数量,而这里的20一般是你当前已经连接上的socket的数量,这个参数的意义是防止epoll的API在填写你传进去的指针的时候,超过你的指针指向的内存的大小从而导致内存溢出。如果你把这个设置成1的话,那么在epoll_wait的时候只会查询队列中的第一个socket的情况。如果设置成比maxfds还大的话,一般来讲是无所谓的,只要设置得比你的输入的数组的大小一样或者小于就没关系。

回答3:
EPOLLOUT这个flag的意思是指当你给这个socket发消息的时候,也会触发epoll的event,也就是讲,当你用EPOLLOUT来新加了一个event,在你调用write(this_fd, data, num_data);的时候,epoll_wait中也会返回这个fd,在一般情况下,EPOLLOUT是没有太大的实际作用的,一般用EPOLLIN就好了,如果你只设置了EPOLLIN,当有消息进来时,epoll_wait就会返回一个读的事件,你收到这个事件之后,再调用read(this_fd, in_buffer, in_buffer_len);即可。
#tarkey 发表于2005-04-11 20:56:00  IP: 220.160.5.*
我在EMAIL里回答你的问题了。
#ansen 发表于2005-04-13 16:03:00  IP: 218.247.142.*
tarkey你好,你的BLOG里有很多好东西啊。刚看了大家关于EPOLL的讨论,我觉得其本质还是LINUX下事件驱动模型,和WINDOWS里面的消息相似,我觉得你结实EPOLLOUT的那段非常好,我最近也在为这个东西苦恼,这下解决了。
我想知道你的哪个EPOLL使用模型是什么样的,能发给我一份吗?我现在用EPOLL+THREAD的方法,我自己也不知道效率如何,因为我第一次做服务器,所以没有比较过。
还有一个问题,epoll_wait()中有一个参数 timeout,对于繁忙的SERVER比如网游和HTTP SERVER来说一般设置为多少好呢?
looking forward to your answer!
#Chicyu 发表于2005-04-13 11:09:00  IP: 202.194.116.*
可否把完整的sys_epoll模型也发一份给我
yxy@ytu.edu.cn

谢谢!
#tarkey 发表于2005-04-14 19:37:00  IP: 59.56.39.*
epoll_wait的timeout可以根据游戏类型来进行设置,如果对实时性要求比较高的话,可以设置为0。对于http的话,可以设置为-1。

其实可以这样来理解,当服务器主要用来处理被动事件的时候,可以设置成-1或者一个比较大点的值来跑一些小的逻辑。对于服务器自身有一定的循环的话,还是建议设置成0。
#ucLinux 发表于2005-04-18 22:07:00  IP: 202.194.116.*
大侠,问几个初级问题,请勿见笑
1)EPOLLET和EPOLLONESHOT是干嘛的?是不是二者必须有其一,有了这个就可以设置工作模式是ET或者是LT了啊...
2)EPOLLPRI,在什么情况下fd会收到所谓的"紧急数据"呢?
3)假如网络突然阻塞掉了,然后某一客户机关机睡觉了,这时候再恢复畅通的时候,是不是有可能收不到EPOLLHUP的事件?这时候把这个已经无效的客户端fd剔除去,是不是就得靠判断超时了?

我是新手,谢谢!
#tarkey 发表于2005-04-19 11:00:00  IP: 218.5.2.*
1,你对EPOLLONESHOT理解错了,EPOLLONESHOT的意思是只监听一次,在监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。

EPOLL的默认是LT模式,你可以通过EPOLLET来讲默认模式改成ET。

2,EPOLLPRI里的PRI的意思是priority也就是优先级的意思,当你的应用程序的socket的属性里面带了OOBINLINE类型的时候,发送的数据就属于urgent data.

3,在以前写socket的时候,往往是通过READ AVAILABLE事件中的读到一个0字节的东西,来检测是否断线,而EPOLL则用EPOLLHUP来代替简单的读事件了,其内部实现则是一样的,也就是说,你用EPOLLHUP可以很好的来检测是否断线了。
#ahzhuo 发表于2005-04-27 10:54:00  IP: 61.145.138.*
gxcooo, 很想观摩一下您是如何封装 epoll 给 ACE 用的,能发一份代码给我研究研究吗?谢谢!ahzhuo@263.net
#hunterforpig 发表于2005-05-31 13:48:00  IP: 61.186.252.*
tarkey大哥
可否把完整的epoll模型也发一份给我!!
当我开超过1020个线程connect Server时
accept返回小于0
perror输出Too many open files
不知是咋回事??
EMAIL:hunterforpig@qq.com
#hunterforpig 发表于2005-05-31 20:28:00  IP: 61.186.252.*
我的kernel是2.6
/proc/sys/fs/file-max 为50035
照理应该支持到50000,不应该到1000多时就开不了!
为何会如此??
#tarkey 发表于2005-06-02 11:40:00  IP: 61.186.252.*
你看看你的file-max和file-nr这两个数的大小,如果你的file-nr大于file-max了,自然就会出这个错误,你在accept之后是否还有其他的操作呢?
#hunterforpig 发表于2005-06-02 16:13:00  IP: 61.186.252.*
root@sky:/proc/sys/fs# cat inode-nr
6945 389
root@sky:/proc/sys/fs# cat file-max
50355

仅仅就是accept操作,我更改了下线程堆栈大小,就没有上面问题了!
#stanleycao 发表于2005-09-01 16:00:00  IP: 61.186.252.*
tarkey你好,看了你上面的文章,写得很不错。
我现在有个问题,不知道你遇没遇到过。
我现在想要使用EPOLLHUP来监测对方的意外断开,比如拔掉网线。实验了一下,结果发现没有作用。
基本按照你上面描述的方法,不知道是否系统有问题。我使用的平台是RETHAT AS4。

谢谢你了。
#DeepRising_ren 发表于2005-11-01 19:06:00  IP: 61.236.126.*
拜读,各位师兄“随笔”——受益非浅,在此感谢^L^。刚开始linux下的网络编程,新项目是把服务器平台(win2000 server)移植到linux下,压力难度对我这个初学者来说满大的,恰好我也是做网络游戏server端开发的,今年才毕业出道。各位师兄,有什么建议,聆听教诲.
#Victor 发表于2006-02-06 16:23:00  IP: 218.108.8.*
tarker你好,我们的应用大体是这样:server收到一个请求以后发送一个应答,然后客户端收到应答关闭连接。我使用epoll的ET方式的时候遇到一个奇怪的问题,就是我得服务器在有些机器上有一部分5%左右,发送应答后马上上来一个EPOLLHUP|EPOLLERR|EPOLLIN事件,我们在网络上抓包在这个时间点上网络上没有任何异常时间,而发送的应答也没有发送到网络上,收到这个事件后我们调用了Close函数关闭连接,但是这个动作并没有在网络上产生关闭握手,客户端也就不能察觉了,不知道是何缘故
#sagely 发表于2006-03-21 23:13:00  IP: 192.168.100.*
tarkey你好,最近研究一下epoll,请问是否您可以给我发一份epoll封装及测试代码呢,万分感谢!sagely2002@eyou.com
#vcclass 发表于2006-06-30 16:40:00  IP: 218.242.128.*
其实在用EPOLL模型的时候,EPOLLHUP|EPOLLERR,这个两个事件可以不用关的,你只管EPOLLIN 和EPOLLOUT 也可以,出错或者挂起了的时候,假如你投递 EPOLLIN事件的话,recv的返回值回 < 0的,也就知道出错了。

至于大家讨论IOCP和EPOLL的效率,实在是没有必要,当时我们公司老总说要用LINUX+oracle开发游戏服务器,当时因为大家不会,只能选择WIN+IOCP+SQLSERVER了。对于大家常用的应用来说不管什么模型都足够了。效率高不高和程序的质量有很大的关系,比如内存管理,线程池的利用等。

说实在的 LINUX下的EPOLL模型是仿照 freeBSD的 KQUEUE模型写的。freeBSD的宣传做的不好,搞的用的人不多,其实freeBSD 的安全性,稳定性,效率等比linux高的多了。

大家有空研究一下freeBSD,个人研究后发现比LINUX好。
#roen 发表于2008-01-11 14:19:56  IP: 61.145.165.*
linux下面的epoll,最让我困惑一点的是,如果有多个线程在epoll_wait(ET模式)等待EPOLLIN的事件时候,是不是必须要用EPOLLONESHOT,否则会出现这种情况,第一个线程还在recv,这个时候又有包到,会再次产生一个event,也许就被第二个线程的epoll_wait获得了.这个时候怎么来处理呢?按照Davide写的:
The attached patch implements the one-shot support for epoll. Because of
the way epoll works (hooking f_op->poll()) the ET behavior is not really
ET because it might happen that, while data is still available to read
(for the EPOLLIN case), another chunk will become available triggering
another event. While those conditions can be easily be handled in
userspace, the absolute triviality of the patch and the avoidance of
user/kernel space switches and f_op->poll() calls, make IMHO worth doing
this inside epoll itself. The patch is on top of 2.6-mm1.
#cppexplore 发表于2008-03-14 10:20:35  IP: 209.202.115.*
楼上的担心是多余的。
epoll工作在ET模式的时候,如果有EPOLLIN事件到来,那么你要处理这个事件,读取socket直到EWOULDBLOCK。
在这期间该socket上还有包到来的话,不会激发EPOLLIN事件,因为可读状态还没有发生变化,此时仍旧由上一个线程读取该包。
#decrui 发表于2008-07-23 20:30:32  IP: 59.108.97.*
Tarkey大哥 能不能给我一份封装的epoll源码
最近在做服务器端通信
真的是搞得头大了
我的邮箱:decrui@yahoo.com.cn
多谢哈
#okyzx 发表于2008-07-30 20:51:46  IP: 218.66.59.*
tarkey,您好 能否给我一份封装的epoll源码
Email: okyzx@163.com 谢谢
#crastin 发表于2008-08-05 13:35:43  IP: 219.139.251.*
Tarkey能不能给份epoll源码?
谢谢啦,email:crastin@vip.qq.com
发表评论  


登录
Csdn Blog version 3.1a
Copyright © tarkey