网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
6034 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 学好网络编程,需要掌握哪些核心问题?
免费
第一模块:基础篇 (9讲)
01 | 追古溯源:TCP/IP和Linux是如何改变世界的?
02 | 网络编程模型:认识客户端-服务器网络模型的基本概念
03丨套接字和地址:像电话和电话号码一样理解它们
04 | TCP三次握手:怎么使用套接字格式建立连接?
05 | 使用套接字进行读写:开始交流吧
06 | 嗨,别忘了UDP这个小兄弟
07 | What? 还有本地套接字?
08 | 工欲善其事必先利其器:学会使用各种工具
09丨答疑篇:学习网络编程前,需要准备哪些东西?
第二模块:提高篇 (10讲)
10 | TIME_WAIT:隐藏在细节下的魔鬼
11 | 优雅地关闭还是粗暴地关闭 ?
12 | 连接无效:使用Keep-Alive还是应用心跳来检测?
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
14丨UDP也可以是“已连接”?
15 | 怎么老是出现“地址已经被使用”?
16 | 如何理解TCP的“流”?
17 | TCP并不总是“可靠”的?
18 | 防人之心不可无:检查数据的有效性
19丨提高篇答疑:如何理解TCP四次挥手?
期中复习周 (2讲)
期中大作业丨动手编写一个自己的程序吧!
免费
期中大作业丨题目以及解答剖析
免费
第三模块:性能篇 (12讲)
20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件
21 | poll:另一种I/O多路复用
22 | 非阻塞I/O:提升性能的加速器
23 | Linux利器:epoll的前世今生
24 | C10K问题:高并发模型设计
25 | 使用阻塞I/O和进程模型:最传统的方式
26 | 使用阻塞I/O和线程模型:换一种轻量的方式
27 | I/O多路复用遇上线程:使用poll单线程处理所有I/O事件
28 | I/O多路复用进阶:子线程使用poll处理连接I/O事件
29 | 渐入佳境:使用epoll和多线程模型
30 | 真正的大杀器:异步I/O探索
31丨性能篇答疑:epoll源码深度剖析
第四模块:实战篇 (4讲)
32 | 自己动手写高性能HTTP服务器(一):设计和思路
33 | 自己动手写高性能HTTP服务器(二):I/O模型和多线程模型实现
34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
结束语 (1讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

29 | 渐入佳境:使用epoll和多线程模型

盛延敏 2019-10-14
你好,我是盛延敏,这里是网络编程实战第 29 讲,欢迎回来。
在前面的第 27 讲和第 28 讲中,我介绍了基于 poll 事件分发的 reactor 反应堆模式,以及主从反应堆模式。我们知道,和 poll 相比,Linux 提供的 epoll 是一种更为高效的事件分发机制。在这一讲里,我们将切换到 epoll 实现的主从反应堆模式,并且分析一下为什么 epoll 的性能会强于 poll 等传统的事件分发机制。

如何切换到 epoll

我已经将所有的代码已经放置到GitHub上,你可以自行查看或下载。
我们的网络编程框架是可以同时支持 poll 和 epoll 机制的,那么如何开启 epoll 的支持呢?
lib/event_loop.c 文件的 event_loop_init_with_name 函数是关键,可以看到,这里是通过宏 EPOLL_ENABLE 来决定是使用 epoll 还是 poll 的。
struct event_loop *event_loop_init_with_name(char *thread_name) {
...
#ifdef EPOLL_ENABLE
yolanda_msgx("set epoll as dispatcher, %s", eventLoop->thread_name);
eventLoop->eventDispatcher = &epoll_dispatcher;
#else
yolanda_msgx("set poll as dispatcher, %s", eventLoop->thread_name);
eventLoop->eventDispatcher = &poll_dispatcher;
#endif
eventLoop->event_dispatcher_data = eventLoop->eventDispatcher->init(eventLoop);
...
}
在根目录下的 CMakeLists.txt 文件里,引入 CheckSymbolExists,如果系统里有 epoll_create 函数和 sys/epoll.h,就自动开启 EPOLL_ENABLE。如果没有,EPOLL_ENABLE 就不会开启,自动使用 poll 作为默认的事件分发机制。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(8)

  •  JJ
    边缘条件,当套接字缓冲区可写,会不断触发ready notification事件,不是应该条件触发才是这样吗?

    作者回复: 笔误,已经让编辑勘误了,感谢指正。

    2019-10-14
    1
    5
  • 沉淀的梦想
    在ET的情况下,write ready notification只会在套接字可写的时候通知一次的话,那个时候应用还没准备好数据,等到应用准备好数据时,却又没有通知了,会不会导致数据滞留发不出去?这种情况是怎么解决的呢?

    作者回复: 你可以再次注册这个write ready的事件啊,不是说只能注册一次就结束了,而是你注册了一次,它就通知你一次;而LT的情况下,可能你注册了一次,它通知你好多次。

    2019-10-15
    1
  • Steiner
    老师能不能为这个框架写一份README.md,我对这个实现很感兴趣

    作者回复: 你需要什么样的README.md呢?第四篇会详细讲解这个框架的设计,也行你读完之后,可以写一个README.md push到git上呢?

    2019-10-14
    2
    1
  • 林林
    文稿中的框架示意图,我看到main reactor 和 sub reactor都各自运行了epoll,请问是否各自处理不同的socket? 如果处理了相同的socket会发生什么吗?

    作者回复: main reactor处理的是监听套接字上的事件,sub reactor处理的是已连接套接字上的事件,两个是不重合的。

    如果处理了相同的socket,那么肯定需要通过锁-并发来控制,无形中就增加了处理的开销,降低了程序处理的效率。

    2019-12-02
  • 流浪地球
    细读了下老师git上的代码,套接字都是设置为非阻塞模式的,但并没有对返回值做判断处理,看上去好像是阻塞式的用法,求解?

    作者回复: 可能是考虑不周,有可能的话麻烦提一个MR或者issue,大家一起来改。

    2019-10-17
  • 传说中的成大大
    看到CMake我就完全懵逼。。。。

    作者回复: 还好吧,看一下CMake的文档,以前我一直用的Makefile, CMake也是现学的。

    2019-10-16
  • 刘丹
    看了github上面的lib目录,很多文件里的函数没有介绍,注释也不多。

    作者回复: 在第四篇会有详细的介绍,如果有疑问,可以沟通,我统一回复或答疑。

    2019-10-14
  • 刘丹
    终于看到github地址了,建议每节课都写一下链接地址,没代码的章节除外。

    作者回复: 好的,已经这么做了。

    2019-10-14
收起评论
8
返回
顶部