• 回复@大雨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
  • 今晚福建36选7开奖结果: 碧俐千仞 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (1)

    9
    回复
    1488
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    排名
    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-5-16 22:14 编辑




    从事服务端开发,少不了要接触网络编程。epoll作为linux下高性能网络服务器的必备技术至关重要,nginx、redis、skynet和大部分游戏服务器都使用到这一多路复用技术。

    文/罗培羽
    因为epoll的重要性,不少游戏公司(如某某九九)在招聘服务端同学时,可能会问及epoll相关的问题。比如epoll和select的区别是什么?epoll高效率的原因是什么?如果只靠背诵,显然不能算上深刻的理解。
    网上虽然也有不少讲解epoll的文章,但要不是过于浅显,就是陷入源码解析,很少能有通俗易懂的。于是决定编写此文,让缺乏专业背景知识的读者也能够明白epoll的原理。文章核心思想是:

    要让读者清晰明白EPOLL为什么性能好。

    本文会从网卡接收数据的流程讲起,串联起CPU中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select到epoll的进化过程;最后探究epoll的实现细节。目录:

    一、从网卡接收数据说起
    二、如何知道接收了数据?
    三、进程阻塞为什么不占用cpu资源?
    四、内核接收网络数据全过程
    五、同时监视多个socket的简单方法
    六、epoll的设计思路
    七、epoll的原理和流程
    八、epoll的实现细节
    九、结论


    一、从网卡接收数据说起
    下图是一个典型的计算机结构图,计算机由CPU、存储器(内存)、网络接口等部件组成。了解epoll本质的第一步,要从硬件的角度看计算机怎样接收网络数据
    计算机结构图(图片来源:linux内核完全注释之微型计算机组成结构)

    下图展示了网卡接收数据的过程。在①阶段,网卡收到网线传来的数据;经过②阶段的硬件电路的传输;最终将数据写入到内存中的某个地址上(③阶段)。这个过程涉及到DMA传输、IO通路选择等硬件有关的知识,但我们只需知道:网卡会把接收到的数据写入内存。


    网卡接收数据的过程

    通过硬件传输,网卡接收的数据存放到内存中。操作系统就可以去读取它们。

    二、如何知道接收了数据?

    了解epoll本质的第二步,要从CPU的角度来看数据接收。要理解这个问题,要先了解一个概念——中断。
    计算机执行程序时,会有优先级的需求。比如,当计算机收到断电信号时(电容可以保存少许电量,供CPU运行很短的一小段时间),它应立即去保存数据,保存数据的程序具有较高的优先级。

    一般而言,由硬件产生的信号需要cpu立马做出回应(不然数据可能就丢失),所以它的优先级很高。cpu理应中断掉正在执行的程序,去做出响应;当cpu完成对硬件的响应后,再重新执行用户程序。中断的过程如下图,和函数调用差不多。只不过函数调用是事先定好位置,而中断的位置由“信号”决定。

    中断程序调用

    以键盘为例,当用户按下键盘某个按键时,键盘会给cpu的中断引脚发出一个高电平。cpu能够捕获这个信号,然后执行键盘中断程序。下图展示了各种硬件通过中断与cpu交互。

    cpu中断(图片来源:net.pku.edu.cn)

    现在可以回答本节提出的问题了:当网卡把数据写入到内存后,网卡向cpu发出一个中断信号,操作系统便能得知有新数据到来,再通过网卡中断程序去处理数据。

    三、进程阻塞为什么不占用cpu资源?

    了解epoll本质的第三步,要从操作系统进程调度的角度来看数据接收。阻塞是进程调度的关键一环,指的是进程在等待某事件(如接收到网络数据)发生之前的等待状态,recv、select和epoll都是阻塞方法。了解“进程阻塞为什么不占用cpu资源?”,也就能够了解这一步。
    为简单起见,我们从普通的recv接收开始分析,先看看下面代码:

    [C] 纯文本查看 复制代码
    //创建
    socketint s = socket(AF_INET, SOCK_STREAM, 0);   
    //绑定
    bind(s, ...)
    //监听
    listen(s, ...)
    //接受客户端连接
    int c = accept(s, ...)
    //接收客户端数据
    recv(c, ...);
    //将数据打印出来
    printf(...)

    这是一段最基础的网络编程代码,先新建socket对象,依次调用bind、listen、accept,最后调用recv接收数据。recv是个阻塞方法,当程序运行到recv时,它会一直等待,直到接收到数据才往下执行。

    插入:如果您还不太熟悉网络编程,欢迎阅读我编写的《网络游戏实战(第2版)》,会有详细的介绍。
    那么阻塞的原理是什么?

    工作队列

    操作系统为了支持多任务,实现了进程调度的功能,会把进程分为“运行”和“等待”等几种状态。运行状态是进程获得cpu使用权,正在执行代码的状态;等待状态是阻塞状态,比如上述程序运行到recv时,程序会从运行状态变为等待状态,接收到数据后又变回运行状态。操作系统会分时执行各个运行状态的进程,由于速度很快,看上去就像是同时执行多个任务。
    下图中的计算机中运行着A、B、C三个进程,其中进程A执行着上述基础网络程序,一开始,这3个进程都被操作系统的工作队列所引用,处于运行状态,会分时执行。

    工作队列中有A、B和C三个进程

    等待队列

    当进程A执行到创建socket的语句时,操作系统会创建一个由文件系统管理的socket对象(如下图)。这个socket对象包含了发送缓冲区、接收缓冲区、等待队列等成员。等待队列是个非常重要的结构,它指向所有需要等待该socket事件的进程。

    创建socket

    当程序执行到recv时,操作系统会将进程A从工作队列移动到该socket的等待队列中(如下图)。由于工作队列只剩下了进程B和C,依据进程调度,cpu会轮流执行这两个进程的程序,不会执行进程A的程序。所以进程A被阻塞,不会往下执行代码,也不会占用cpu资源


    socket的等待队列

    ps:操作系统添加等待队列只是添加了对这个“等待中”进程的引用,以便在接收到数据时获取进程对象、将其唤醒,而非直接将进程管理纳入自己之下。上图为了方便说明,直接将进程挂到等待队列之下。

    唤醒进程

    当socket接收到数据后,操作系统将该socket等待队列上的进程重新放回到工作队列,该进程变成运行状态,继续执行代码。也由于socket的接收缓冲区已经有了数据,recv可以返回接收到的数据。

    以下内容待续
    四、内核接收网络数据全过程
    五、同时监视多个socket的简单方法
    六、epoll的设计思路
    七、epoll的原理和流程
    八、epoll的实现细节
    九、结论

    既然说到网络编程,笔者的《Unity3D网络游戏实战(第2版)》是一本专门介绍如何开发多人网络游戏的书籍,用实例介绍开发游戏的全过程,非常实用。书中对网络编程有详细的讲解,全书用一个大例子贯穿,真正的“实战”教程。
    致谢:本文力图详细说明epoll的原理,特别感谢

    @陆俊壕

    @AllenKong12

    雄爷、堂叔 等同事审阅了文章并给予修改意见

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

    0

    主题

    1589

    帖子

    2344

    积分

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

    UID
    254705
    好友
    1
    蛮牛币
    2109
    威望
    0
    注册时间
    2017-11-16
    在线时间
    393 小时
    最后登录
    2019-10-22
    沙发
    2019-5-17 08:10:27 只看该作者
    666666666666666666666666666666
    3偶尔光临
    261/300
    排名
    17383
    昨日变化

    0

    主题

    65

    帖子

    261

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    177972
    好友
    0
    蛮牛币
    266
    威望
    0
    注册时间
    2016-10-24
    在线时间
    158 小时
    最后登录
    2019-10-22
    板凳
    2019-5-17 08:50:55 只看该作者
    谢谢分享
    5熟悉之中
    940/1000
    排名
    10707
    昨日变化

    0

    主题

    663

    帖子

    940

    积分

    Rank: 5Rank: 5

    UID
    301976
    好友
    1
    蛮牛币
    1408
    威望
    0
    注册时间
    2018-10-31
    在线时间
    179 小时
    最后登录
    2019-9-30
    地板
    2019-5-17 10:05:40 只看该作者
    大佬大佬 膜拜大佬?。?!
    5熟悉之中
    541/1000
    排名
    10961
    昨日变化

    1

    主题

    89

    帖子

    541

    积分

    Rank: 5Rank: 5

    UID
    130631
    好友
    0
    蛮牛币
    796
    威望
    0
    注册时间
    2015-12-2
    在线时间
    357 小时
    最后登录
    2019-10-22
    5#
    2019-5-23 17:04:43 只看该作者
    你在哪 我去掐你
    3偶尔光临
    229/300
    排名
    14745
    昨日变化

    0

    主题

    81

    帖子

    229

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    236535
    好友
    0
    蛮牛币
    357
    威望
    0
    注册时间
    2017-8-8
    在线时间
    94 小时
    最后登录
    2019-10-22
    6#
    2019-5-30 11:41:59 只看该作者
    66666666666666666
    5熟悉之中
    963/1000
    排名
    3264
    昨日变化

    1

    主题

    70

    帖子

    963

    积分

    Rank: 5Rank: 5

    UID
    149521
    好友
    2
    蛮牛币
    596
    威望
    0
    注册时间
    2016-5-23
    在线时间
    436 小时
    最后登录
    2019-10-21
    7#
    2019-5-30 16:07:09 只看该作者
    你可能要死了。
    5熟悉之中
    940/1000
    排名
    10707
    昨日变化

    0

    主题

    663

    帖子

    940

    积分

    Rank: 5Rank: 5

    UID
    301976
    好友
    1
    蛮牛币
    1408
    威望
    0
    注册时间
    2018-10-31
    在线时间
    179 小时
    最后登录
    2019-9-30
    8#
    2019-5-31 10:14:03 只看该作者
    不错不错...

    1

    主题

    15

    帖子

    78

    积分

    Rank: 2Rank: 2

    UID
    322252
    好友
    0
    蛮牛币
    354
    威望
    0
    注册时间
    2019-5-16
    在线时间
    62 小时
    最后登录
    2019-10-21
    9#
    2019-6-1 10:35:39 只看该作者
    赞赞赞666666666
    6蛮牛粉丝
    1317/1500
    排名
    10819
    昨日变化

    3

    主题

    1014

    帖子

    1317

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    310426
    好友
    0
    蛮牛币
    1914
    威望
    0
    注册时间
    2019-1-2
    在线时间
    204 小时
    最后登录
    2019-10-21
    10#
    2019-6-2 17:41:15 只看该作者
    epoll的本质
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 回复@大雨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
  • 腾讯彩票中秋充值 365足彩外围网站app 网赌百人牛牛怎么才能赢钱 足彩总进球数玩法 海南七星彩app下载 彩票快3选大小单双技巧 双色球开奖时间 湖北11选5网上卖吗 河南22选5下期预测1注 36o中超直播在线观看 天津快乐十分软件免费版 牛牛棋牌 打篮球的游戏规则 亚博极速11选5 ag娱乐平台在哪里发牌