muduo网络库源码分析
文章平均质量分 89
muduo是基于Reactor模式的C++网络库,采用Reactor + 线程池的方法提高并发性。内部对于事件驱动,线程池,定时器,io复用的设计都非常值得学习。设计技巧对C++代码风格有很大的帮助。
一个程序渣渣的小后院
这个作者很懒,什么都没留下…
展开
-
muduo网络库学习(九)日志类Logger和LogStream,将日志信息打印到屏幕
每一个成熟的项目都有大大小小的日志系统,在关键的地方打印日志信息,常用来跟踪程序运行,查找错误原因等,可以节省大量的debug时间muduo的日志信息有5个级别TRACE,细粒度最高的日志信息,打印的最详细DEBUG,细粒度级别上对调试有帮助的日志信息INFO,粗粒度级别上强调程序的运行信息WARN,程序能正常运行,但存在潜在风险的信息ERROR,执行出错,但不影响程序继续执行的错误信息原创 2017-10-29 18:48:34 · 2139 阅读 · 2 评论 -
muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool
muduo是支持多线程的网络库,在muduo网络库学习(七)用于创建服务器的类TcpServer中也提及了TcpServer中有一个事件驱动循环线程池,线程池中存在大量线程,每个线程运行一个EventLoop::loop。线程池的作用体现在用户启动TcpServer服务器时创建大量子线程,每个子线程创建一个EventLoop并开始执行EventLoop::loop主线程的线程池保存着创建的这些线原创 2017-10-28 16:16:38 · 1456 阅读 · 2 评论 -
muduo网络库学习(七)用于创建服务器的类TcpServer
目前为止,涉及到的绝大多数操作都没有提及线程,EventLoop,Poller,Channel,Acceptor,TcpConnection,这些对象的执行都是在单独线程完成,并没有设计多线程的创建销毁等。除了runInLoop函数仅仅提及了线程安全性,发现原来其实是有多个线程在同时运行的,也发现某个对象可能会暴露给其他线程,这样不安全,为了解决不安全隐患,muduo为每个EventLoop设计了r原创 2017-10-27 17:05:55 · 793 阅读 · 0 评论 -
muduo网络库学习(六)缓冲区Buffer及TcpConnection的读写操作
在tcp的通信过程中,内核其实为tcp维护着一个缓冲区当调用write/send时,会向内核缓冲区中写入数据,内核和tcp协议栈负责将缓冲区中的数据发送到指定<ip,port>的目标位置。当有数据到达内核的tcp缓冲区中,如果开启了对套接字可读事件的监听,那么内核会让套接字变为可读状态,从而从poll函数中返回,调用read/recv进行读操作。但是,内核维护的tcp缓冲区通常都比较小如果调原创 2017-10-26 19:15:17 · 2964 阅读 · 4 评论 -
muduo网络库学习(五)服务器监听类Acceptor及Tcp连接TcpConnection的建立与关闭
通常服务器在处理客户端连接请求时,为了不阻塞在accept函数上,会将监听套接字注册到io复用函数中,当客户端请求连接时,监听套接字变为可读,随后在回调函数调用accept接收客户端连接。muduo将这一部分封装成了Acceptor类,用于执行接收客户端请求的任务。类的定义如下,主要就是监听套接字变为可读的回调函数class EventLoop;class InetAddress;//////原创 2017-10-25 16:42:35 · 1533 阅读 · 8 评论 -
muduo网络库学习(四)事件驱动循环EventLoop
muduo的设计采用高并发服务器框架中的one loop per thread模式,即一个线程一个事件循环。 这里的loop,其实就是muduo中的EventLoop,所以到目前为止,不管是Poller,Channel还是TimerQueue都仅仅是单线程下的任务,因为这些都依赖于EventLoop。这每一个EventLoop,其实也就是一个Reactor模型。 而多线程体现在EventLoop原创 2017-10-24 14:58:03 · 3295 阅读 · 4 评论 -
muduo网络库学习(三)定时器TimerQueue的设计
Linux下用于获取当前时间的函数有time(2) / time_t (秒)ftime(3) / struct timeb (毫秒)gettimeofday(2) / struct timeval (微秒)clock_gettime(2) / struct timespec (纳秒)定时函数,用于让程序等待一段时间或安排计划任务sleep(3)alarm(2)usleep(3)na原创 2017-10-23 22:27:34 · 1780 阅读 · 0 评论 -
muduo网络库学习(二)对套接字和监听事件的封装Channel
muduo对描述符fd,需要监听的事件events,当fd被激活调用的可读/可写/关闭/错误回调函数进行了封装,实现在Channel类中,Poller监听的其实就是一个个Channel对象,Channel可以向Poller注册自己关心的事件,当被激活后调用相应的回调函数。类似libevent的struct event。 Channel在整个事件驱动循环中的流程大致如下Acceptor接收到客户端原创 2017-10-23 19:23:34 · 1364 阅读 · 2 评论 -
muduo网络库学习(一)对io复用的封装Poller,面向对象与基于对象
高效并发的网络框架大多离不开io多路复用函数,Linux下有三种selectpollepoll关于三者的区别可以参考 linux网络编程—–几种服务器模型及io多路复用函数 前段时间看Libevent源码时也学习过对epoll/poll/select的封装,但是毕竟c语言写的库,是通过函数指针实现多态。我学习的muduo源码是c++11版本的,利用c++进行封装。首先复习一下C++面向对象原创 2017-10-23 18:34:46 · 1293 阅读 · 2 评论