陈硕老师的muduo代码整体过了一遍,收获很多,尽管整个过程并不轻松,头一次看这么复杂的源码。代码和书都是第一遍看,很多细节没有深究,打算第二遍把整个逻辑重新梳理一下,顺道记在博客里,整个学习过程,遇到的问题,解决的方案,以及为什么的trade off
- 理解
Reactor设计的总体思路,以及要解决的问题。和陈硕老师推荐的Linux系统下C++多线程服务端编程模式one loop per thread + thread pool这样设计的原因 - 使用Catch2做单元测试,使用C++11语法对源代码部分重写,去除
Boost依赖,完全使用标准库基础设施 - 学习使用
Git做版本控制,使用Travis做持续集成,构建工具采用CMake
- OS: Ubuntu 18.04 (64 bit)
- Compiler: GCC 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
- Build: CMake 3.10.2
- 按照
base,log,net和http的顺序依次实现四个独立的库(muduo中只是按照base和net,示例放到example中) - 单元测试用例放在各自的库所在文件夹
- 底层使用Epoll水平触发实现IO多路复用,文件描述符均为非阻塞
- 原子类依赖C++11中的
atomic,借助智能指针shared_ptr和unique_ptr管理资源,去除Boost依赖 - RAII编程技巧,借助对象的生存期管理资源的申请和释放
- 定时器事件借助
timerfd,线程唤醒事件通知借助eventfd,以及监听和连接套接字,统一纳入到IO多路复用体系中 - 基于红黑二叉搜索树的定时器队列
- 基于双缓冲的异步日志
- Reactor设计模式,主Reactor通过accept接受连接,按照Round Robin的方式依次派发给线程池中的次Reactor
- 代码统计
-
ab测试(ab是Apache基金会下的一款HTTP服务器压测工具)
ab -c 100 -n 100 -k http://localhost:8000/并发数100,测试100次,Keep-alive(长连接)
作为对比,使用了Nodejs的Express框架,访问的都是https://github.com/plantree/Slack的html内容
Nodejs:
Slack(线程1):
Slack(线程10):
测试是一项复杂而细致的工作,这里只是简单测试,略作比较,后面会再去研究。
- 继续研究muduo源码,熟悉各种网络编程的例子
- 丰富HTTP服务器,实现为REST风格接口
- 学习Java,了解Netty
- https://github.com/chenshuo/muduo
- 《Linux多线程服务端编程》
- 《Unix网络编程》
- 《Unix环境高级编程》
- 《Linux系统编程手册》



