总结说的有的过大,算是对自己学习的一个总结。兴许会不断补充。

模型总结

muduo是基于非堵塞的IO和事件驱动的网络库。

muduo的总体结构时one loop per thread+threadpool,图例如以下:



mainReactor和subReactor都是EventLoop,在mainReactor中接收连接。把建立后的连接分发到subReactor中。

作者開始在muduo/base中封装了和网络无关的一些操作。如日志、时间、队列、相互排斥量、条件变量、线程、线程池等。给后面网络库的设计带来了极大便利。

在muduo/net中封装了和网络相关的操作,muduo是基于Reactor模式的设计的,结构例如以下:



1、EventLoop是整个模式的核心,它来管理全部事件。one loop per thread说明一个线程仅仅能有一个EventLoop。

它封装了eventfd和timerfd,用来唤醒等待在poll上的线程;eventfd是其它线程唤醒当前线程使用,把任务加入到EventLoop的任务队列后,假设不是EventLoop的owner线程,则要唤醒它来运行任务。timerfd用来实现定时。

2、Poller是个虚基类,真正调用的时PollPoller或EPollPoller。

用来实现IO的复用。事件都注冊到Poller中。

3、Channel和fd一一相应。尽管它不拥有fd。fd须要响应哪些事件都保存在Channel中。且有相应的回调函数。

4、TcpConnection是保存已经建立的连接。它的生命周期模式,因此採用shared_ptr来管理。它负责数据的发送和接收。负责socket fd的关闭。

5、Acceptor主要负责连接的建立。用在服务端。

当建立连接后。它会把连接的控制权转交给TcpConnection。

6、TcpServer是服务端,有Acceptor,用Map保存了当前已经连接的TcpConnection。

7、Connector是负责发起连接的一方,用在client。发起连接比接收连接要难。非堵塞发起连接更难,要处理各种错误,还要考虑连接失败后怎样处理。当连接成功后它会把控制权交给TcpConnection。

8、TcpClient是client,封装了Connector。

技术总结

muduo网络库尽管是用C++编写。可是却没实用到面向对象,用的是基于对象。最大的特点就是到处可见boost::bind,採用绑定回调函数的手法,实现了事件和特定函数的绑定,更加易于理解和使用。

对象生命周期的管理使用了shared_ptr。多线程中,对象的声明周期难以管理,一个线程难以推断对象是否已经析构。作者shared_ptr来管理对象声明周期。

使用weak_ptr防止对象间相互引用。造成内存永久不释放。对于类内部的一些对象,使用scoped_ptr来管理。

非堵塞网络库应用层为什么须要缓冲区,怎么设计缓冲区。发送过快,缓冲区增长太大怎么办。

仅仅使用非递归的相互排斥量,编码逻辑相对简单。

使用前置声明降低.h文件的包括。

……待续

muduo总结的更多相关文章

  1. 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

    <Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...

  2. 用muduo实现memcached协议的例子

    最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于 examples/memcached/server,能通过 memcached 的大部分测试用例(incr/dec ...

  3. 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册

    <Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...

  4. Debian 8 最小化系统安装muduo

    最近开始学习陈硕的muduo C++ Linux多线程网络库,首先当然是要安装.其间遇到过不少问题,最后不能说都解决了,只能说找到了一条不会遇到什么问题的路线.总结起来是两点: 注意各软件之间要版本匹 ...

  5. muduo库的简单使用-echo服务的编写

    muduo库的简单使用 muduo是一个基于事件驱动的非阻塞网络库,采用C++和Boost库编写. 它的使用方法很简单,参考这篇文章:TCP网络编程本质论 里面有这么几句: 我认为,TCP 网络编程最 ...

  6. Muduo 多线程模型对比

    本文主要对比Muduo多线程模型方案8 和方案9 . 方案8:reactor + thread pool ,有一个线程来充当reactor 接受连接分发事件,将要处理的事件分配给thread pool ...

  7. muduo库安装

    一.简介 Muduo(木铎)是基于 Reactor 模式的网络库. 二.安装 从github库下载源码安装:https://github.com/chenshuo/muduo muduo依赖了很多的库 ...

  8. Reactor模式解析——muduo网络库

    最近一段时间阅读了muduo源码,读完的感受有一个感受就是有点乱.当然不是说代码乱,是我可能还没有完全消化和理解.为了更好的学习这个库,还是要来写一些东西促进一下. 我一边读一边尝试在一些地方改用c+ ...

  9. Muduo源码库研究(笔记汇总)

    声明: 本人学习Muduo源码, 有些代码会对其进行精简, 加上本人的一些理解, 所以与作者的代码可能有些不同. 如有理解错误的地方欢指出. Muduo基础库-时间戳类 http://www.cnbl ...

  10. muduo网络库学习笔记(10):定时器的实现

    传统的Reactor通过控制select和poll的等待时间来实现定时,而现在在Linux中有了timerfd,我们可以用和处理IO事件相同的方式来处理定时,代码的一致性更好. 一.为什么选择time ...

随机推荐

  1. 略过天涯 深入浅出VGA和DVI接口【转】

    本文转载自:http://www.cnblogs.com/lueguo/p/3373649.html 由CrazyBingo修改…… 前言:目前显示器的主流接口是VGA.DVI以及HDMI,再加上一个 ...

  2. Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D【转】

    本文转载自:http://blog.csdn.net/maopig/article/details/7230311 在源代码里面如果这样是定义的:#ifdef   MACRONAME//可选代码#en ...

  3. poj1700--贪心--Crossing River

    Crossing River Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12260   Accepted: 4641 D ...

  4. Truck History --hdoj

    Truck History Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tota ...

  5. [jqpolt] formatString 日期格式化列表

    // 年 %Y   2008 %y   08 // 月 %m   09 %#m   9 %B   September %b   Sep // 日 %d   05 %#d   5 %e   5 %A   ...

  6. 利用@factory和@dataProvider实现参数化

    利用构造函数将要用的的参数初始化,非常有利于简化脚本.它将外部的数据赋给本地的变量,可以使得初始化后的参数被其他方法使用.直接上代码: private String url;    private S ...

  7. javascript时间戳转换成yyyy-MM-DD格式

    最近开发中需要和后端进日期和时间传值,前后端约定为时间戳的格式,但是前端展示需要展示成年-月-日的格式.就需要进行日期和时间转换格式.自己总结两个方式就行转换. 一,new Date(时间戳).for ...

  8. javascript中构造函数的三种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. MySQL 5.6 Reference Manual-14.6 InnoDB Table Management

    14.6 InnoDB Table Management 14.6.1 Creating InnoDB Tables 14.6.2 Moving or Copying InnoDB Tables to ...

  10. java RPC系列之一 rmi

    java RPC系列之一    rmi 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Burlap . ...