Muduo源码剖析
文章平均质量分 88
FreeeLinux
A3GM5H3647LPD4QVYMYAER2S47P4WZ2UKBXBCGZES2V62WEY2HULQA
展开
-
muduo库的框架剖析及总结
有些人觉得我的博客口水话很多,嗯,我个人考虑了一下,可能我写东西确实没有那么高大上,口水话很多,但是我个人确实非常喜欢这种看着非常亲切的风格,其实我觉得还好,只要你能读懂我的博客就行!!!有问题和意见可以提,有问题可以相互探讨、留言,甚至在留言板骂我都行,对我个人也是一种鼓励吧,好了还是太多废话了!!!我前面有说过把Muduo库分成大致四个模块,那么我们今天把Channel模块和Eve转载 2016-12-06 21:26:23 · 2256 阅读 · 0 评论 -
muduo库的EpollPoller剖析
EpollPoller和PollPoller一样,都是muduo库对I/O复用机制的封装,不过默认使用的是EpollPoller。在EventLoop中初始化构造poller_,调用newDefaultPoller(this),构造默认的poller。EventLoop::EventLoop() : looping_(false), //表示还未循环 quit_(false),原创 2016-12-06 22:29:07 · 1844 阅读 · 2 评论 -
muduo应用层缓冲区buffer设计
一: muduo的I/O模型采用非阻塞模式,避免阻塞在read()或write()或其他系统调用上。 TcpConnection必须要有output buffer 考虑一个常见场景:程序想通过TCP连接返送100k字节的数据,但在write()调用中,操作系统只接受了80k字节(受TCP advertised window的控制,细节见TCPv1),你肯定不想在原地原创 2016-12-13 16:54:16 · 2158 阅读 · 0 评论 -
muduo网络库定时器的实现
一:函数介绍常见的与时间相关的函数有:sleep,alarm,usleep,nanosleep,clock_nanosleep,gettimer/settitimer,timer_create/timer_settime/timer_gettime/timer_delete,还有muduo使用的timerfd_create/timerfd_gettime/timerfd_settime函数。原创 2016-12-07 17:58:42 · 2416 阅读 · 1 评论 -
muduo库的EventLoop类剖析
一:采用的线程通信机制首先来看一下一个进程(线程)如何通知另一个个等待中的(线程),有三种方法:1.pipe,使用fd[0] 为读端,fd[1]为写端,半双工。等待线程关注fd[0]的可读事件。2.socketpair,也有一对文件描述符,可用于双向通信,全双工。3.eventfd。eventfd是一个比pipe更搞笑的线程间事件通知机制,一方面它比pipe少用一个pipe des原创 2016-12-08 01:43:53 · 3231 阅读 · 0 评论 -
muduo库的EventLoopThread类剖析
关于EventLoopThread有以下几点:1.任何一个线程,只要创建并运行了EventLoop,都称之为I/O线程。2.I/O线程不一定是主线程。I/O线程中可能有I/O线程池和计算线程池。3.muduo并发模型one loop per thread + threadpool4.为了方便使用,就直接定义了一个I/O线程的类,就是EventLoopThread类,该类实际上就是对原创 2016-12-08 21:36:17 · 1262 阅读 · 1 评论 -
muduo库的Socket封装
主要来看一下几个部分:1.Endian.h封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中)2.SocketsOps.h/SocketOps.cc封装了socket相关的系统调用(全局函数,位于muduo::net::sockets名称空间中)3.Socket.h/Socket.cc(Socket类)用RAII方法封装socket fil原创 2016-12-10 00:33:23 · 2407 阅读 · 0 评论 -
muduo库的事件框架
TCP网络编程本质TCP网络编程编程本质是处理三个半事件。1.连接建立:服务器accept(被动)接收连接,客户端connect(主动)发起连接。2.连接断开:主动断开(close、shutdown),被动断开(read返回0)3.消息到达:文件描述符可读4.消息发送完毕:这算半个事件。对于低流量的服务,可以不关心这个事件。这里的发送完毕是数据写入操作系统缓冲区,将有TCP协议原创 2016-12-04 18:22:51 · 2255 阅读 · 0 评论 -
muduo库的ThreadPool剖析
先上代码,然后分析:ThreadPool.h#ifndef MUDUO_BASE_THREADPOOL_H#define MUDUO_BASE_THREADPOOL_H#include #include #include #include #include #include #include #include namespace muduo{class T原创 2016-10-26 20:03:25 · 2236 阅读 · 0 评论 -
muduo库TcpConnection对send、shutdown、SIGPIPE的处理
muduo库对send的处理:muduo库的send()函数重载了三个: void send(const void* message, int len); void send(const StringPiece& message); //短字符优化子string类 void send(Buffer* message); // this one will swap data分别原创 2016-12-14 13:37:20 · 1838 阅读 · 0 评论 -
muduo库的Connector以及TcpClient的使用
一:Connector Connector可以说是muduo库的连接器,负责客户端向服务器发起连接。实际上说白了就是封装了socket的connect操作。 Connector类的成员如下:class Connector : boost::noncopyable, public boost::enable_shared_from_th原创 2016-12-14 16:20:28 · 1846 阅读 · 0 评论 -
muduo的http库剖析
一:http协议 首先看一下http request:request line + header + body (header分为普通报头,请求报头与实体报头)header与body之间有一空行(CRLF) 请求方法有:GET、POST、HEAD、PUT、DELETE等 协议版本:1.0、1.1 详细知识参见这篇博客:http必知必会,原创 2016-12-14 19:08:44 · 2508 阅读 · 0 评论 -
muduo库chat server对TCP粘包问题的处理
粘包问题的最本质原因在与接收对等方无法分辨消息与消息之间的边界在哪。我们通过使用某种方案给出边界,例如:发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。包尾加上\r\n标记。FTP协议正是这么做的。但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界。包头加上包体长度。包头是定长的4个字节,说明了包体的长原创 2016-12-22 23:56:39 · 1819 阅读 · 0 评论 -
muduo库chat server的shared_ptr和TLS实现分析
muduo 库的 chat 最基本的是单线程模型,然后有多线程模型,但是多线程同步需要加锁,锁争用会降低服务器性能,明显的代码就是 chat server 的 onStringMessage()函数:void onStringMessage(const TcpConnectionPtr&, const string& message,原创 2016-12-23 01:20:11 · 803 阅读 · 1 评论 -
muduo库的PollPoller类剖析
muduo库中唯一使用面向对象的地方就在Poller,它有两个派生类,分别是PollPoller和EPollPoller。可以实现两种I/O多路复用机制。PollerPoller的数据成员有:protected: typedef std::map ChannelMap; ChannelMap channels_; private: EventLoop* ownerLoo原创 2016-12-04 22:32:48 · 1217 阅读 · 0 评论 -
muduo的Channel类剖析
Channel类,即通道类。>它是muduo库负责注册读写事件的类,并保存了fd读写事件发生时调用的回调函数,如果poll/epoll有读写事件发生则将这些事件添加到对应的通道中。>一个通道对应唯一EventLoop,一个EventLoop可以有多个通道。>Channel类不负责fd的生存期,fd的生存期是有socket决定的,断开连接关闭描述符。>当有fd返回读写事件时,调用提前原创 2016-12-04 22:11:33 · 1981 阅读 · 0 评论 -
muduo库的LogFile日志文件类剖析
之前写了muduo的Logger类的分析,今天来看一下LogFile类及其相关的类分析,之前的Logger是控制日志怎样写,怎样用,怎样实现,而今天的LogFile则是用来控制日志怎样和文件打交道。几天写一次?多少行写一次?我们下面来看一下它的相关实现。一:日志参数1.muduo的日志滚动(1)文件大小,例如每天写满1G换下一个文件(2)时间(每天零点新建一个日志文件,不论原创 2016-12-04 14:19:04 · 2529 阅读 · 0 评论 -
面向对象的风格和基于对象的风格程序设计
下面采用两种风格实现thread类一.基于对象的风格先上代码:#ifndef _THREAD_H#define _THREAD_H#include class thread {public: thread(); virtual ~thread();public: void start(); void join(); virt原创 2016-12-01 01:09:28 · 2522 阅读 · 1 评论 -
muduo库的Timestamp类剖析
分析之前我们先来看,Timestamp中用了一个BOOST_STATIC_ASSERT宏,这是编译时断言,而我们平时用的assert是运行时断言。示例:#include #include class Timestamp {private: int64_t microSecondsSinceEpoch_;};BOOST_STATIC_ASSERT(sizeof(Ti原创 2016-12-01 03:08:37 · 1129 阅读 · 0 评论 -
muduo库的Acceptor类剖析
一:主要功能>>>Acceptor用于accept(2)接受TCP连接。>>>Acceptor的数据成员包括Socket、Channel。>>>Acceptor的socket是listening socket(即server socket)。>>>Channel用于观察此socket的readable事件,并Acceptor::handleRead(),后者调用accept(2)来原创 2016-12-10 11:13:45 · 1487 阅读 · 0 评论 -
muduo库的TcpServer和TcpConnection用法
TcpServer是muduo库很重要的一个类,它结合TcpConnection、Acceptor构成了一套完整的对I/O触发事件的处理机制。那么它们具体是怎么工作的呢?先来看一个例子:原创 2016-12-11 18:47:17 · 3049 阅读 · 0 评论 -
muduo库Thread类剖析
muduo库中的Thread类集合了所有线程的操作,其中还运用了线程安全的观察者模式。运用shared_ptr和weak_ptr做到了生命周期的管理。代码加注释如下:Thread.h#ifndef MUDUO_BASE_THREAD_H#define MUDUO_BASE_THREAD_H#include #include #include #include #in原创 2016-10-24 22:49:13 · 2491 阅读 · 0 评论 -
muduo的Mutex类剖析
muduo的mutex_lock_guard()就是利用C++的RAII机制,完成互斥锁锁的自动加锁,解锁操作,解放双手。我们只需要用一堆大括号的控制互斥锁的范围就可以了。RAII(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析原创 2016-10-25 00:53:37 · 1706 阅读 · 0 评论 -
muduo库的AtomicIntegerT剖析
首先来说为什么需要原子操作?最最典型的例子:x++我们知道它有三个步骤,1.从内存中读x的值到寄存器中 2.对寄存器加1 3.再把新值写回x所处的内存地址假设x的初始值为0,我们使用两个线程对x++,我们期待x的值为3,但实际上可能为2。原因是有可能多个处理器同时从各自的缓存中读取变量i,分别进行加一操作,然后分别写入系统内存当中。那么想要保证读改原创 2016-12-01 04:09:33 · 860 阅读 · 0 评论 -
muduo库的Condition类和CountDownLatch类剖析
condition类是封装了条件变量的操作,我以前在做服务器项目的时候也实现过封装condition。它的实现如下:#ifndef MUDUO_BASE_CONDITION_H#define MUDUO_BASE_CONDITION_H#include #include #include namespace muduo{class Condition : bo原创 2016-12-01 23:43:24 · 1870 阅读 · 0 评论 -
muduo库的BlockingQueue和BoundBlockingQueue类剖析
一:无界阻塞队列muduo库的BlcokingQueue实际上用的生产这消费者模型。我们知道生产者消费者模型一般有两种实现方式,可以利用信号量也可以利用条件变量实现,muduo库采用条件变量实现。BlockingQueue比较简单,它是线程安全的,我们在外部调用它时无需加锁。它的类图如下:实现代码如下:#ifndef MUDUO_BASE_BLO原创 2016-12-02 00:33:41 · 1054 阅读 · 0 评论 -
muduo库的Singleton类剖析
如题,分析muduo库线程安全的单例模式类。它的类图如下:分析如下:#ifndef MUDUO_BASE_SINGLETON_H#define MUDUO_BASE_SINGLETON_H#include #include #include // atexit#include namespace muduo{namespace detail{原创 2016-12-02 08:50:17 · 1702 阅读 · 0 评论 -
muduo库的ThreadLocal类剖析
首先来看一个概念:线程特定数据>>>在单线程程序中,我们经常用全局变量共享数据。多线程环境下,全部变量被所有线程所共有。>>>但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效>>>POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称之为线程特定数据(Thread-specific Data,或TSD)>>>对于POD类型,可以用__thread来解决原创 2016-12-02 13:47:44 · 1194 阅读 · 3 评论 -
muduo库的ThreadLocalSingleton类剖析
本文剖析muduo库的ThreadLocalSingleton类,即线程本地单例类。先来看下它的类图,它的内部嵌套的一个deleter类。分析如下:#ifndef MUDUO_BASE_THREADLOCALSINGLETON_H#define MUDUO_BASE_THREADLOCALSINGLETON_H#include #include原创 2016-12-02 14:15:55 · 1370 阅读 · 0 评论 -
muduo库的Logger及附属类剖析
我们先来看一下logger工作的流程:它的宏是这样定义的(举出一例):#define LOG_INFO if(muduo::Logger::logLevel() 这代表我们使用该LOG_INFO宏时会先进行判断,如果级别大于INFO级别,后面那句不会被执行,也就是不会打印INFO级别的信息。用法:LOG_INFOLogger --> impl --> LogStream原创 2016-12-03 01:40:26 · 2292 阅读 · 0 评论 -
muduo的inspect库以及TCP的Keep-Alive时间分析
一:源码分析 今天剖析muduo inspect库。muduo_inspect库通过HTTP的方式为服务器提供监控接口。比如提供以下功能:接收了多少个TCP连接当前有多少个活动连接一共响应了多少次请求每次请求的平均响应时间为多少ms... inspect库主要有Inspector类组成,它包含了一个HttpServer对象,并同过ProcessInspector类返原创 2016-12-17 22:56:51 · 1068 阅读 · 0 评论