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


相关推荐

  • java中的static关键字的作用?

    java中的static关键字的作用?是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢?在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象

    2022年7月8日
    21
  • pycharm 2021.12.12激活码-激活码分享

    (pycharm 2021.12.12激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    51
  • Mysql清空表数据,id从1开始

    Mysql清空表数据,id从1开始Mysql清空表数据,id从1开始TRUNCATETABLEtable_name

    2022年6月6日
    29
  • 关于MSHTML_Html格式

    关于MSHTML_Html格式本文翻译自http://msdn.microsoft.com/workshop/browser/mshtml/overview/overview.aspMSDNHome>MSDNLibra

    2022年8月2日
    5
  • html怎么添加左侧点虚线,css虚线样式,怎么在css里添加虚线

    html怎么添加左侧点虚线,css虚线样式,怎么在css里添加虚线css 虚线样式 怎么在 css 里添加虚线内容导读 控制 div 线框的是 border 我们可以具体设置四条边的线框是否显示 也可以去设置虚线框的颜色和粗细 线框的设置可以让 div 的块状更加明显 至于是用虚线还是实线 大家可以根据具体情况而定 不知道怎么在 css 里添加虚线的朋友 可以拿本文的代码去看看效果 自己再去修改修改 体会下变化 进而更审核的掌握 css 虚线样式 本文给大家介绍的是 css 虚线样式 给大

    2025年8月29日
    2
  • PyCharm激活码永久有效PyCharm2020.1.4激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2020.1.4激活码教程-持续更新,一步到位PyCharm激活码永久有效2020.1.4激活码教程-Windows版永久激活-持续更新,Idea激活码2020.1.4成功激活

    2022年6月19日
    67

发表回复

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

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