美文网首页
epoll事件驱动浅析

epoll事件驱动浅析

作者: 吕艳凯 | 来源:发表于2019-11-27 18:17 被阅读0次

       Linux2.6以上版本支持该事件驱动,这也是Nginx唯一与内核紧密相连的地方,Nginx是基于事件驱动的,Nginx之所以支持跨平台,是因为Nginx支持多种事件驱动方式。

       设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收到TCP包),也就是说,在每一时刻,进程只需要处理这100万连接中的一小部分连接。那么,如何才能高效地处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出其中有事件发生的几百个连接呢?实际上,在Linux内核2.4版本以前,那时的select或者poll事件驱动方式就是这样做的。这里有个非常明显的问题,即在某一时刻,进程收集有事件的连接时,其实这100万连接中的大部分都是没有事件发生的。因此,如果每次收集事件时,都把这100万连接的套接字传给操作系统(这首先就是用户态内存到内核态内存的大量复制),而由操作系统内核寻找这些连接上有没有未处理的事件,将会是巨大的资源浪费,然而select和poll就是这样做的,因此它们最多只能处理几千个并发连接。而epoll不这样做,它在Linux内核中申请了一个简易的文件系统,把原先的一个select或者poll调用分成了3个部分:调用epoll_create建立1个epoll对象(在epoll文件系统中给这个句柄分配资源)、调用epoll_ctl向epoll对象中添加这100万个连接的套接字、调用epoll_wait收集发生事件的连接。这样,只需要在进程启动时建立1个epoll对象,并在需要的时候向它添加或删除连接就可以了,因此,在实际收集事件时,epoll_wait的效率就会非常高,因为调用epoll_wait时并没有向它传递这100万个连接,内核也不需要去遍历全部的连接。

相关文章

  • epoll事件驱动浅析

    Linux2.6以上版本支持该事件驱动,这也是Nginx唯一与内核紧密相连的地方,Nginx是基于事件驱动的...

  • AIO初步整理(二)——select/poll和epoll

    select/poll和epoll 在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或...

  • 深入理解 epoll 回调用户数据

    epoll 多路复用驱动是异步事件处理,在用户层它提供了用户数据(epoll_data),方便事件触发后回调给用户...

  • epoll的优劣与原理

    epoll事件驱动模型与poll的比较 X轴为句柄数Y轴为响应事件可以看到epoll几乎不受句柄数的增加的影响 e...

  • ae.c

    Redis的ae.c封装了多种事件驱动框架的使用。如:evport、epoll、kqueue、select。在ae...

  • netty

    netty 高性能,异步,事件驱动库 Unix io模型 阻塞io 非阻塞io,netty主要就是基于epoll的...

  • epoll的事件

    epoll事件 这里主要说明epoll事件的触发情况,epoll具体怎么使用后续再补充吧 epoll_wait处理...

  • linux手册翻译——epoll_wait(2)

    epoll_wait, epoll_pwait, epoll_pwait2 - 在epoll fd上等待I/O事件...

  • # c++常用框架和库

    值得学习的C语言开源项目 Libevent libev是一个开源的事件驱动库,基于epoll,kqueue等OS提...

  • 浅析 java 的事件驱动

    在 Java 中参与事件驱动有三种角色: event object(事件对象):事件状态对象,用于 listene...

网友评论

      本文标题:epoll事件驱动浅析

      本文链接:https://www.haomeiwen.com/subject/jvhmwctx.html