muduo
YongApple
LINUX C++ golang thrift libevent
展开
-
muduo -- AsyncLogging分析
文章目录1. 为啥vector容器中存储的是std::unique_ptr?2. 为啥?1. 为啥vector容器中存储的是std::unique_ptr?std::vector<std::unique_ptr> BufferVector为啥不用原始指针,std::unique_ptr 有啥好处?2. 为啥?原创 2020-07-22 11:35:35 · 399 阅读 · 0 评论 -
muduo -- eventloop分析
几个问题:1. currentActiveChannel_->handleEvent(pollReturnTime_); 如果handleEvent内某个事件响应函数很慢或者卡住,岂不是会影响后续事件处理延迟,且影响该eventloop thread的poll执行。 ----------------------------------------------...原创 2018-07-02 21:31:20 · 808 阅读 · 2 评论 -
muduo库的 poller 接口类和Channel分析
muduo库内的 timerfd eventfd socketfd 等文件描述符,一般注册读写事件一般通过以下流程:当一个fd想要注册可读事件时,首先通过Channel::enableReading()-> Channel::update(this)-> EventLoop::updateChannel(Channel)-> Poller::updateChanne...原创 2018-07-03 19:02:50 · 564 阅读 · 2 评论 -
muduo -- TimerQueue分析
定时器 时序图 对于定时任务的原理:muduo采用timerfd_*将超时任务转换成文件描述符进行监听 当时间一到,timerfd变为可读,相应的Channel调用回调函数(TimerQueue::handleRead) 回调函数中将所有在TimerQueue中的超时任务找出,一次调用其回调函数 对于周期性定时任务,再添加回TimerQueue中 ...原创 2018-07-03 20:46:39 · 373 阅读 · 0 评论 -
muduo -- Buffer分析
/// A buffer class modeled after org.jboss.netty.buffer.ChannelBuffer////// @code/// +-------------------+------------------+------------------+/// | prependable bytes | readable bytes | writa...原创 2018-11-23 18:05:54 · 640 阅读 · 0 评论 -
muduo -- Channel分析
Channel的作用和成员变量1. Channel fd 封装类,封装套接字、timefd等fd。2. Channel类一般不单独使用,它常常包含在其他类中(Acceptor、Connector、EventLoop、TimerQueue、TcpConnection)使用。Channel对象生存期由这些类控制。3. Channel类有EventLoop的指针 loop_,通过这个指...原创 2018-11-23 18:49:25 · 838 阅读 · 0 评论 -
boost::weak_ptr 观察者
boost::weak_ptr 作为 boost::shared_ptr 的观察者,更像是助手,观察 shared_ptr 对象是否内存有效。boost::weak_ptr内几个重要成员函数:1. 成员函数use_count() 观测资源引用计数2. 成员函数expired() 功能相当于 use_count()==0 表示被观测的资源(也就是shared_ptr的管理的资源)是否被...原创 2018-11-19 22:21:14 · 508 阅读 · 0 评论 -
muduo -- TcpServer分析
测试输出:20181126 12:09:43.678496Z 24491 INFO pid = 24491, tid = 24491 - main.cpp:22220181126 12:09:43.680307Z 24491 INFO epollfd_=3 - EPollPoller.cc:4820181126 12:09:43.680378Z 24491 INFO wakeu...原创 2018-11-26 20:37:23 · 327 阅读 · 0 评论 -
muduo -- eventloop分析1
几个问题:currentActiveChannel_-&amp;amp;gt;handleEvent(pollReturnTime_);如果handleEvent内某个事件响应函数很慢或者卡住,岂不是会影响后续事件处理延迟,且影响该eventloop thread的poll执行。muduo 对虚基类接口,类似如下定义class ICallBcak {public: virtual ...原创 2018-12-27 15:45:38 · 557 阅读 · 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函数。...转载 2017-06-22 09:49:47 · 519 阅读 · 0 评论 -
linux 定时器
在开发高性能服务器中,定时器总是不可或缺的。 常见的定时器实现三种,分别是:排序链表,最小堆,时间轮。 之前用的定时器是基于最小堆的,在定时器数量不多时可以使用, 目前公司用的框架中的定时器是基于简单时间轮的,但是为了支持大范围的时间,每个齿轮的所维护的链表为有序链表,每次插入时先mod出spoke,再从头遍历链表以便将定时器插入到合适位置, 所以本质上还是基于有序链表的。时间复杂度并未减少。转载 2017-06-30 16:36:29 · 325 阅读 · 0 评论 -
Muduo 网络库源码分析 之 关键技术点总结
最近又把muduo网络库仔细研究了一遍,收获良多。本文将对muduo中的设计思想以及关键的技术细节进行总结和分析,当然由于篇幅的原因这里更多的是对关键技术的简略提及,具体细节还需要读者自己去查找学习资料。muduo/baseDate类 日期类的封装,使用Julian(儒略日)可以方便的计算日期差。具体公式和思想见 儒略日的计算Exception类 异常类转载 2017-06-20 17:11:30 · 437 阅读 · 0 评论 -
Muduo网络库源码分析(三)线程间使用eventfd通信和EventLoop::runInLoop系列函数
先说第一点,线程(进程)间通信有很多种方式(pipe,socketpair),为什么这里选择eventfd?eventfd 是一个比 pipe 更高效的线程间事件通知机制,一方面它比 pipe 少用一个 file descripor,节省了资源;另一方面,eventfd 的缓冲区管理也简单得多,全部“buffer” 只有定长8 bytes,不像 pipe 那样可能有不定长的真正 buffer。...原创 2017-06-20 18:40:37 · 517 阅读 · 0 评论 -
Muduo网络库源码分析(六)TcpConnection 的生存期管理
TcpConnection是使用shared_ptr来管理的类,因为它的生命周期模糊。TcpConnection表示已经建立或正在建立的连接,建立连接后,用户只需要在上层类如TcpServer中设置连接到来和消息到来的处理函数,继而回调TcpConnection中的 setConnectionCallback和setMessageCallback函数,实现对事件的处理。用户需要关心的事件是有限的,转载 2017-06-20 19:12:11 · 338 阅读 · 0 评论 -
Muduo网络库源码分析(四)EventLoopThread和EventLoopThreadPool的封装
muduo的并发模型为one loop per thread+ threadpool。为了方便使用,muduo封装了EventLoop和Thread为EventLoopThread,为了方便使用线程池,又把EventLoopThread封装为EventLoopThreadPool。所以这篇博文并没有涉及到新鲜的技术,但是也有一些封装和逻辑方面的注意点需要我们去分析和理解。EventLoop转载 2017-06-20 19:21:17 · 415 阅读 · 0 评论 -
Muduo网络库源码分析(二) 定时器TimeQueue,Timer,TimerId
首先,我们先要明白为什么需要设计这样一个定时器类?在开发Linux网络程序时,通常需要维护多个定时器,如维护客户端心跳时间、检查多个数据包的超时重传等。如果采用linux的SIGALARM信号实现,则会带来较大的系统开销,且不便于管理。Muduo 的 TimerQueue 采用了最简单的实现(链表)来管理定时器,它的效率比不上常见的 binary heap 的做法,如果程序转载 2017-06-20 19:40:03 · 406 阅读 · 0 评论 -
muduo -- Timing wheel 踢掉空闲连接
通过boost::circular_buffer + boost::unordered_set来模拟轮盘。 typedef boost::unordered_set<EntryPtr> Bucket; typedef boost::circular_buffer<Bucket> WeakConnectionList; WeakConnection...原创 2017-06-30 15:06:01 · 1055 阅读 · 0 评论