引言
以下九篇文章基本上把muduo的整个工作机制算是完整的展现了.muduo网络库是十几年前由陈硕大神完成一个基于Linux的多线程TCP的网络库,其中对于各个地方处理的细节当今看来对于我们学习此方面的内容仍是一盏闪耀的明灯,但毕竟是十几年前的代码,其中当然也有一些值得商榷的地方,但我想这也许就是学习它的目的所在.
这一系列源码解析分九篇文章描述了muduo对于消息的处理与用户的连接,这基本是一个网络库所做的全部事情了.看起来简单,实际上手却是困难重重,下面的文章会详细的描述困难所在与解决方案.这些文章中不仅有专门描述源码的文章,比如1,2等,也有我对于源码的一些改进意见与实现,比如3与5的文末.
阅读muduo的代码对于我们来说的意义我觉得在于以下两点.
- 其一不必多说,就是学习到在网络编程中很多以前不会注意到的问题与理解不深的地方,比如收到的TCP报文窗口大小不够,导致write(send)失败怎么办?缓冲区是否必要?如何处理服务端内存暴涨,即应用层的流量管理?使用非阻塞connect还是阻塞connect?非阻塞connect会遇到哪些问题?如何处理?如何在失败后进行应用层重连?这就涉及到定时机制.何时注册可写事件?如何处理在服务端给每个连接提前分配buffer造成的内存浪费?使用水平触发(level trigger)还是边缘触发(edge trigger)?等等各种各样的问题,这显然对我们来说是一个很好的学习机会.
- 第二点我觉得相比与第一点来说更加不容易做好.即为什么要这么设计,这是一个值得思考的问题.上一条停留在如何解决一个实际的问题,而这一条就是如何做好一个大型程序的架构?比如muduo中大量使用了回调,我们的代码中又是否要借鉴这种写法呢?回调带来的是可维护性更好的程序,凡事只用改回调即可,但带来的是整体结构的复杂,但我觉得除了这些以外还有其他原因,在下面的解析8中有提到.
学长和老师总说到,做好一个项目语言并不是问题,问题在于对于相关知识的理解,这也是自然,语言就像是沟通的媒介,并不是沟通的本质,英语能表达的南非语(随便举的)也能表达,对与muduo来说,它当然也可用其他语言写,没什么不行的,编程的重点是不变的,无非换了种表达方式罢了.所以作为大学生的我们更应该明白何为我们要去学习的重点,更要去思考技术如此日新月异的今天,我们究竟该如何立足?我想这不是一个语言,一个框架能够提供给我们的.我斗胆做一个小小的总结,现在可能大多数的新技术不过是"新鞋走老路,新瓶装旧酒”,我们要来一个从头学一个吗?效率太低,人的精力总是有限的,用在正确的地方对我们来说也许是一个更好的选择.
下面是文章的正文部分:
muduo网络库源码解析(1):多线程异步日志库(上)
muduo网络库源码解析(2):多线程异步日志库(中)
muduo网络库源码解析(3):多线程异步日志库(下)
muduo网络库源码解析(4):TimerQueue定时机制
muduo网络库源码解析(5):EventLoop,Channel与事件分发机制
muduo网络库源码解析(6):TcpServer与TcpConnection(上)
muduo网络库源码解析(7):TcpServer与TcpConnection(下)
muduo网络库源码解析(8):EventLoopThreadPool与EventLoopThread
muduo网络库源码解析(9):Connector与TcpClient