mini-muduo版本传送门
version 0.00 从epoll构建muduo-1 mini-muduo介绍
version 0.01 从epoll构建muduo-2 最简单的epoll
version 0.02 从epoll构建muduo-3 加入第一个类,顺便介绍reactor
version 0.03 从epoll构建muduo-4 加入Channel
version 0.04 从epoll构建muduo-5 加入Acceptor和TcpConnection
version 0.05 从epoll构建muduo-6 加入EventLoop和Epoll
version 0.06 从epoll构建muduo-7 加入IMuduoUser
version 0.07 从epoll构建muduo-8 加入发送缓冲区和接收缓冲区
version 0.08 从epoll构建muduo-9 加入onWriteComplate回调和Buffer
version 0.09 从epoll构建muduo-10 Timer定时器
version 0.11 从epoll构建muduo-11 单线程Reactor网络模型成型
version 0.12 从epoll构建muduo-12 多线程代码入场
version 0.13 从epoll构建muduo-13 Reactor + ThreadPool 成型
前段时间看了陈硕写的muduo网络库(github,<<Linux多线程服务端编程>>,blog),觉得这是一个学习网络编程的非常好的素材。为了更好的了解这个库,自己花了点时间,模仿其源码从零开始编写了一个极小的mini-muduo(起这名字没版权问题吧:-)),代码编写过程中有很多收获,我打算写几篇文章记录下心得。有几个问题先说明一下:
Q1:网络库很多,为什么选择muduo?
1 库的功能相对完整,基本上网络库应该有的功能都具备了,比如IO事件分派/多线程/缓冲区管理/Log/简单的http监控等等。
2 适应性强,充分利用多核并兼顾高IO和高CPU请求。
3 目标明确,作者只关注Linux平台所以代码量较小,这也是我个人很欣赏的一点。wc命令统计了在base和net目录下,主要代码大概一万行。
4 有比较完整的文档,参考:blog 和<<Linux多线程服务端编程>>
Q2:作者在书中已介绍过muduo的实现过程,为什么还亲自写一遍?
1 作者讲解muduo实现的内容有限,一些重要内容往往穿插在各个章节中作为独立知识模块,比如线程模型,Buffer的设计等,书看完总有见木不见林的感觉。
2 作者在"第8章 muduo网络库的设计与实现"里,以最简单的Reactor模型开始编码,而后添加了定时器和网络相关功能,最后加入多线程和epoll。这种介绍方式虽然条理性很好,但是个人觉得更适合有一定经验的开发者,我读代码时是按照另一种方式推进的,我的起点不是Reactor模型而是一个最简单的epoll示例程序(网上最常见的for循环epoll示例),以这个epoll示例为开端,我按照muduo的实现方式写了一个简陋版muduo。
3 写代码会使得你对细节把握更到位,从零开始构建就没有机会欺骗自己了。
Q3 mini-muduo和muduo有什么差别 ?
1 目的不同,muduo作为网络库发布,mini-muduo只是我为了学习网络编程而编写的简化代码,发出来只是为了和关心muduo的人共享一点心得。
2 代码量差异,muduo大概10000行,mini-muduo与muduo有完全相同的架构设计和模块,将部分代码简化实现,争取控制在1000行左右。如果没有精力阅读muduo全部代码,可以看看mini-muduo。
3 mini-muduo关注代码的构建过程,从第一个100行的epoll例子开始每个版本都是一个可运行的echo服务器,每个版本都打了Tag,通过git命令可以在各个版本间轻松切换,同时每个版本都有详细的文章说明。
4 未使用CMake编译, 图省事借用了一个万能Makefile文件,直接make就跑起来。未使用boost::function和boost::bind而是虚函数,未实现client端代码,放弃了细节的包装比如socket,socket选项,大小端,ip地址的包装类。
mini-muduo代码地址:github
网页上浏览tag可以通过这里
命令行切换tag可通过
git checkout v0.03
目前规划版本如下,后续博客不断更新
version 0.01 最简单的epoll
version 0.02 加入第一个类,顺便介绍Reactor
version 0.03 加入Channel
version 0.04 加入Acceptor和TcpConnection,socket的事件被分割到两部分处理
version 0.05 加入EventLoop和Epoll,for循环和IO multiplexing分别被包装起来
version 0.06 加入IMuduoUser,库和库的用户被分开了,用户第一次可以在库的外部使用库
version 0.07 加入发送和接收缓冲区
version 0.08 加入onWriteComplate回调和Buffer
version 0.09 加入定时器
version 0.11 修整代码,单线程Reactor网络模型成型(方案5)
version 0.12 多线程代码入场
version 0.13 加入ThreadPool,实现Reactor + Threadpool模型(方案8)
version 0.14 一个EventLoop变多个,实现reactors in threads模型,也叫one loop per thread(方案9)
version 0.15 多个EventLoop和ThreadPool,实现最灵活的reactors + thread pool模型(方案11)