• 回复@大雨582:社会人不可能像自然人一样自由,你还得尊重别人的意愿!不然咱随便生产啥都强行让你要,咱是自由了,你呢? 2019-10-12
  • 发改委每月首个工作日公布限制乘坐火车飞机人员名单 2019-10-12
  • 全国啦啦操联赛临汾站开幕 2019-10-08
  • 《爱疯音乐家》陈洁仪:不完美的美其实更美爱疯音乐家陈洁仪 2019-10-08
  • 中冶置业兴隆百万平米新城正式亮相 将打造全配套高铁康养小镇 2019-10-06
  • 以政府拟严打“乱拍摄”以军行为 最高10年监禁 2019-10-03
  • 图解:关于中国梦,习近平总书记这十句话直抵人心 2019-09-20
  • “舌尖”之后, “风味”能否再续辉煌? 2019-09-17
  • 腾讯要花32亿收购《绝地求生》开发商10%股份 2019-09-17
  • 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 31选七福建体彩走势图: 碧俐千仞 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (3)

    4
    回复
    1103
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    排名
    19949
    昨日变化

    福建36选7和值走势图 www.00-na.com 43

    主题

    224

    帖子

    902

    积分

    Rank: 9Rank: 9Rank: 9

    UID
    53741
    好友
    40
    蛮牛币
    2648
    威望
    0
    注册时间
    2014-11-6
    在线时间
    219 小时
    最后登录
    2019-9-30

    专栏作家

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册帐号

    x
    本帖最后由 tyxxxx 于 2019-6-13 19:16 编辑

    从事服务端开发,少不了要接触网络编程。epoll作为linux下高性能网络服务器的必备技术至关重要,大部分游戏服务器都使用到这一多路复用技术。文章核心思想是:要让读者清晰明白EPOLL为什么性能好。

    文/罗培羽


    上篇回顾

    四、内核接收网络数据全过程

    五、同时监视多个socket的简单方法

    六、epoll的设计思路

    七、epoll的原理和流程

    本节会以示例和图表来讲解epoll的原理和流程。

    创建epoll对象

    如下图所示,当某个进程调用epoll_create方法时,内核会创建一个eventpoll对象(也就是程序中epfd所代表的对象)。eventpoll对象也是文件系统中的一员,和socket一样,它也会有等待队列。


    内核创建eventpoll对象

    创建一个代表该epoll的eventpoll对象是必须的,因为内核要维护“就绪列表”等数据,“就绪列表”可以作为eventpoll的成员。

    维护监视列表

    创建epoll对象后,可以用epoll_ctl添加或删除所要监听的socket。以添加socket为例,如下图,如果通过epoll_ctl添加sock1、sock2和sock3的监视,内核会将eventpoll添加到这三个socket的等待队列中。


    添加所要监听的socket

    当socket收到数据后,中断程序会操作eventpoll对象,而不是直接操作进程。

    接收数据

    当socket收到数据后,中断程序会给eventpoll的“就绪列表”添加socket引用。如下图展示的是sock2和sock3收到数据后,中断程序让rdlist引用这两个socket。


    给就绪列表添加引用

    eventpoll对象相当于是socket和进程之间的中介,socket的数据接收并不直接影响进程,而是通过改变eventpoll的就绪列表来改变进程状态。

    当程序执行到epoll_wait时,如果rdlist已经引用了socket,那么epoll_wait直接返回,如果rdlist为空,阻塞进程。

    阻塞和唤醒进程

    假设计算机中正在运行进程A和进程B,在某时刻进程A运行到了epoll_wait语句。如下图所示,内核会将进程A放入eventpoll的等待队列中,阻塞进程。


    epoll_wait阻塞进程

    当socket接收到数据,中断程序一方面修改rdlist,另一方面唤醒eventpoll等待队列中的进程,进程A再次进入运行状态(如下图)。也因为rdlist的存在,进程A可以知道哪些socket发生了变化。


    epoll唤醒进程

    八、epoll的实现细节

    至此,相信读者对epoll的本质已经有一定的了解。但我们还留有一个问题,eventpoll的数据结构是什么样子?

    再留两个问题,就绪队列应该应使用什么数据结构?eventpoll应使用什么数据结构来管理通过epoll_ctl添加或删除的socket?


    (——我是分割线,想好了才能往下看哦~)


    如下图所示,eventpoll包含了lock、mtx、wq(等待队列)、rdlist等成员。rdlist和rbr是我们所关心的。


    epoll原理示意图,图片来源:《深入理解Nginx:??榭⒂爰芄菇馕?第二版)》,陶辉


    就绪列表的数据结构

    就绪列表引用着就绪的socket,所以它应能够快速的插入数据。

    程序可能随时调用epoll_ctl添加监视socket,也可能随时删除。当删除时,若该socket已经存放在就绪列表中,它也应该被移除。

    所以就绪列表应是一种能够快速插入和删除的数据结构。双向链表就是这样一种数据结构,epoll使用双向链表来实现就绪队列(对应上图的rdllist)。

    索引结构

    既然epoll将“维护监视队列”和“进程阻塞”分离,也意味着需要有个数据结构来保存监视的socket。至少要方便的添加和移除,还要便于搜索,以避免重复添加。红黑树是一种自平衡二叉查找树,搜索、插入和删除时间复杂度都是O(log(N)),效率较好。epoll使用了红黑树作为索引结构(对应上图的rbr)。


    ps:因为操作系统要兼顾多种功能,以及由更多需要保存的数据,rdlist并非直接引用socket,而是通过epitem间接引用,红黑树的节点也是epitem对象。同样,文件系统也并非直接引用着socket。为方便理解,本文中省略了一些间接结构。
    九、结论

    epoll在select和poll(poll和select基本一样,有少量改进)的基础引入了eventpoll作为中间层,使用了先进的数据结构,是一种高效的多路复用技术。

    再留一点作业!

    下表是个很常见的表,描述了select、poll和epoll的区别。读完本文,读者能否解释select和epoll的时间复杂度为什么是O(n)和O(1)?


    select、poll和epoll的区别。


    图片来源《Linux高性能服务器编程》



    《网络游戏实战(第2版)》是一本专门介绍如何开发多人网络游戏的书籍,用实例介绍开发游戏的全过程,非常实用。书中对网络编程有详细的讲解,全书用一个大例子贯穿,真正的“实战”教程。





    7日久生情
    2332/5000
    排名
    4093
    昨日变化

    0

    主题

    1578

    帖子

    2332

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    254705
    好友
    1
    蛮牛币
    2097
    威望
    0
    注册时间
    2017-11-16
    在线时间
    392 小时
    最后登录
    2019-10-18
    沙发
    2019-6-14 08:11:48 只看该作者
    66666666666666666666666666666666666
    5熟悉之中
    940/1000
    排名
    10707
    昨日变化

    0

    主题

    663

    帖子

    940

    积分

    Rank: 5Rank: 5

    UID
    301976
    好友
    1
    蛮牛币
    1408
    威望
    0
    注册时间
    2018-10-31
    在线时间
    179 小时
    最后登录
    2019-9-30
    板凳
    2019-6-14 10:03:12 只看该作者
    感谢大佬普及知识
    2初来乍到
    116/150
    排名
    64937
    昨日变化

    0

    主题

    30

    帖子

    116

    积分

    Rank: 2Rank: 2

    UID
    259926
    好友
    0
    蛮牛币
    300
    威望
    0
    注册时间
    2017-12-16
    在线时间
    84 小时
    最后登录
    2019-10-19
    地板
    2019-6-24 16:58:13 只看该作者
    很详细 感谢大佬分享
    5熟悉之中
    940/1000
    排名
    10707
    昨日变化

    0

    主题

    663

    帖子

    940

    积分

    Rank: 5Rank: 5

    UID
    301976
    好友
    1
    蛮牛币
    1408
    威望
    0
    注册时间
    2018-10-31
    在线时间
    179 小时
    最后登录
    2019-9-30
    5#
    2019-7-4 10:12:03 只看该作者
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 回复@大雨582:社会人不可能像自然人一样自由,你还得尊重别人的意愿!不然咱随便生产啥都强行让你要,咱是自由了,你呢? 2019-10-12
  • 发改委每月首个工作日公布限制乘坐火车飞机人员名单 2019-10-12
  • 全国啦啦操联赛临汾站开幕 2019-10-08
  • 《爱疯音乐家》陈洁仪:不完美的美其实更美爱疯音乐家陈洁仪 2019-10-08
  • 中冶置业兴隆百万平米新城正式亮相 将打造全配套高铁康养小镇 2019-10-06
  • 以政府拟严打“乱拍摄”以军行为 最高10年监禁 2019-10-03
  • 图解:关于中国梦,习近平总书记这十句话直抵人心 2019-09-20
  • “舌尖”之后, “风味”能否再续辉煌? 2019-09-17
  • 腾讯要花32亿收购《绝地求生》开发商10%股份 2019-09-17
  • 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 紫金阁棋牌手机版下载 网上怎么赚钱百度经验 快乐8中奖资讯 阿迪达斯棒球帽子 体彩任选9场胜负预测 爱彩乐专业版大发 七星彩2025期规律了之 捕鱼达人手机版下载 彩票托为什么一般上午都不在 bb高低游戏玩法技巧规律介绍 现在网上卖什么最赚钱 香港赛马会免费独家料 海南4十1开奖号码图 福彩3d中奖去哪里领奖 梅西在巴萨每年的进球记录