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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webpack图片压缩_webpack的cdn

    webpack图片压缩_webpack的cdn图片处理url-loader(webpack5之前的处理方式)在项目开发中,我们时长会需要使用到图片,比如在img文件夹中有图片test1.png,然后在normal.css中会引用到图片body

    2022年7月30日
    5
  • go富集分析和kegg富集分析的区别_非模式生物怎么做GO富集

    go富集分析和kegg富集分析的区别_非模式生物怎么做GO富集前言关于clusterProfiler这个R包就不介绍了,网红教授宣传得很成功,功能也比较强大,主要是做GO和KEGG的功能富集及其可视化。简单总结下用法,以后用时可直接找来用。首先考虑一个问题:

    2022年8月2日
    14
  • 前端vue面试题2021及答案_redux面试题

    前端vue面试题2021及答案_redux面试题1、html及css部分2.Js部分2.1数据类型面试官:JavaScript中什么是基本数据类型什么是引用数据类型?以及各个数据类型是如何存储的?⭐⭐⭐⭐⭐答:基本数据类型有NumberStringBooleanNullUndefinedSymbol(ES6新增数据类型)bigInt引用数据类型统称为Object类型,细分的话有ObjectArrayDate…

    2025年10月1日
    5
  • Linux系统查看CPU「建议收藏」

    Linux系统查看CPU「建议收藏」    在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况,以便性能分析优化。而监控CPU的性能一般包括以下3点:运行队列、CPU使用率和上下文切换。    对于每一个CPU来说运行队列最好不要超过3,例如,如果是双核CPU就不要超过6。如果队列长期保持在3以上,说明任何一个进程运行时都不能马上得到cpu的响应,这时可能需要考虑升级cpu。另外满负荷运…

    2022年4月19日
    160
  • Windows下面的Netstat命令详解

    Windows下面的Netstat命令详解  netstat[-a][-e][-n][-o][-pProtocol][-r][-s][Interval] 参数解释:-a 显示所有活动的TCP连接以及计算机侦听的TCP和UDP端口。 -e 显示以太网统计信息,如发送和接收的字节数、数据包数。该参数可以与-s结合使用。 -n 显示活动的TCP连接,不过,只以数字…

    2022年5月30日
    39
  • Altium Designer 13 只能选中当前层元器件

    Altium Designer 13 只能选中当前层元器件今天打开一个ad工程,发现pcb只能选中当前层原件,其它层原件都不能选中。如图所示:这个问题以前都没遇到过,百度后发现是视图配置里面设置了。首先右键pcb文件如下图所示:然后会弹出下面的窗口:在单层模式的位置可以设置如何显示。如果需要取消这些设置 可以按下快捷键shift+s

    2022年7月15日
    41

发表回复

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

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