epoll的原理和使用方法

epoll的原理和使用方法

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

设想一个场景:有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_wati收集发生事件的连接。这样,仅仅须要在进程启动时建立1个epoll对象,并在须要的时候向它加入�或删除连接就能够了,因此,在实际收集事件时,epoll_wait的效率就会很高,由于调用epoll_wait时并没有向它传递着100万个连接,内核也不须要去遍历所有的连接。

      介绍epoll是怎么处理这样的情况的

     当某一个进程调用epoll_create方法时,linux内核会创建一个eventpoll结构体,这个结构体中有两个成员于epoll的使用方式密切相关,例如以下所看到的

     struct   eventpoll{

     /*红黑树的跟节点,这棵树中存储着全部加入�到epoll中的事件,也就是这个epoll监控的事件*/

      struct rb_root_rbr;

     //双向链表tdllist保存着将要通过epoll_wait放回给用户的、满足条件的事件

     struct  list_head_rdllist;

}

每个epoll对象都有一个独立的eventpoll结构体,这个结构体会在内核空间中创造独立的内存,用于存储使用epoll_ctl方法想epoll对象中加入�进来的事件。这些事件都会挂到rbr红黑树中,这样,反复加入�的事件就能够通过红黑树而高效标示出来(epoll_ctl方法会非常快)。

epoll的原理和使用方法

     全部加入�到epoll中的事件都会与设备(如网卡)驱动程序建立回调关系,也就是说,相应的事件发生时会调用这里的回调方法。这个回调方法在内核中叫做ep_epoll_callback,它会把这种事件放到上面的rdllist双向链表中。在epoll中,对于每个事件都会建立一个epitem结构体。这里包括每个事件相应着的信息。

      当调用epoll_wait检查是否有发生事件的连接时,仅仅是检查eventpoll对象中的rdllist双向链表是否有epitem元素而已,假设rdllist链表不为空,则把这里的事件拷贝到用户态内存中,同一时候将时间数量返回给用户,因此,epoll_wait的效率很高,epoll_ctl在向epoll对象中加入�、改动。删除事件时,从rbr红黑树中查找事件也很快,也就是说,epoll是很高效的,它能够轻易地处理百万级的并发连接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118763.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • csgo开箱网站都有哪些_csgo官方承认的开箱网站

    csgo开箱网站都有哪些_csgo官方承认的开箱网站csgo开箱网站有哪些?csgo开箱网站大全以下国内知名CSGO开箱网站网站状态优惠码/推广码官网直达链接直接取回csgogoincsgo直接取回csgogoskinsdog直接取回csgo88hash直接取回csgogoskskins直接取回csgofateskins可取回暂无yskins直接取回csgocoolkaixiang可取回csgogopiggycase以下国外知名CSGO开箱网站

    2022年10月6日
    2
  • 深入了解”网上邻居”原理「建议收藏」

    深入了解”网上邻居”原理「建议收藏」说到“网上邻居”,相信很多人都很熟悉。但是说起“网上邻居”的工作机制,可能大家就不太清楚了。要说“网上邻居”的工作机制,不妨联系一下生活中的例子:比如我(A),要拜访一个远方的朋友(B),我要去他的

    2022年8月3日
    6
  • 人工智能万亿市场待挖掘

    人工智能万亿市场待挖掘1.新技术革命登场,IT发展焦点将从互联网转向人工智能发轫于2007年的移动互联网浪潮已经席卷全球,极大地改变了我们的生存状态。然而,就在资本市场热切地期待移动互联网催生出更多新应用服务、更多新商业模式的时候,由技术水平不足导致的发展瓶颈已然出现。与此同时,为突破上述瓶颈,新一轮更激动人心、更值得期待的技术革命风暴已经诞生,将成为未来10年乃至更长时间内IT产业发展的焦点,将再次并更加彻底地颠

    2022年6月22日
    79
  • npm卸载安装

    npm卸载安装npm安装卸载命令利用npm安装xxx模块到当前命令行所在目录:npminstallxxx利用npm安装全局模块xxx:npminstall-gxxx安装但不写入package.json:npminstallxxx安装并写入package.json的”dependencies”中:npminstallxxx–save安装并写入package.json的”d…

    2025年7月27日
    4
  • mysql建表语句 numeric_数据库建表语句[通俗易懂]

    mysql建表语句 numeric_数据库建表语句[通俗易懂]展开全部CREATETABLE语句,用32313133353236313431303231363533e78988e69d8331333433616139于在数据库中创建新表。语法:CREATETABLEtable(field1type[(size)][NOTNULL][index1][,field2type[(size)][NOTNULL][index2][,…

    2025年10月5日
    5
  • 纯HTML+CSS网页设计期末作业(个人网站)

    目录纯HTML+CSS网页设计期末作业(个人网站)效果展示源码index.htmlindex.cssabout.htmlhobbies.htmlhobbies.cssme.htmlme.cssbook1.htmlbook.csssongci.htmlsongci.css缺陷纯HTML+CSS网页设计期末作业(个人网站)效果展示index页面about页面hobbies页面书籍介绍页面元曲介绍页面源码index.html<!DOCTYPEhtml><h

    2022年4月6日
    923

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号