muduo学习笔记(一)——TimerQueue

本文解析了muduo库中的定时器模块,该模块基于timerfd_settime实现,并针对网络IO线程进行了优化。文章介绍了muduo定时器的设计原理,包括对文件描述符的节约使用以及通过有序列表实现的简单高效的定时任务管理方式。

  muduo的timer模块其实并不是完整的timer解决方案,而是建立在timerfd_settime上的适用于muduo网络io线程的封装模块。
  第一,muduo之所以需要封装,是因为对fd的节约,如果每一个定时器需求都使用一个fd,那么连接量很大的情况下,fd的数量将会很容易被耗尽。
  第二,muduo对于管理的定时,采用的是比较粗暴的有序列表:

typedef std::set<Entry> TimerList;
TimerList timers_;

  每次需要加入新的timer时,直接强塞

  {
    std::pair<TimerList::iterator, bool> result
      = timers_.insert(Entry(when, timer));
    assert(result.second); (void)result;
  }

  并且如果发现新塞入的定时器时间小于列表里第一个定时器时间(在上一步之前判断)

  if (it == timers_.end() || when < it->first)
  {
    earliestChanged = true;
  }

  就调用

resetTimerfd(timerfd_, timer->expiration());

  将timerfd_对应的时间设置为新时间
  相比之下,像linux内核对于定时器的管理就复杂多了
linux内核定时器
  这是因为muduo的使用特性决定的,单纯做网络io也不需要多少定时器,不像操作系统。在单loop定时器数量有限的情况下,这种简单的自动sort的列表,反而比复杂的管理系统更高效。不过做上层应用尤其做游戏,就别想着用这个定时器了,还是自己撸一套更好,一个单位几十个定时器,分分钟教你做人。

### 关于Chun哥手写的muduo库课程笔记 #### muduo库简介 muduo库是在Linux环境下使用C++实现的个多Reactor多线程的高性能网络服务器[^1]。该库由陈硕开发,并且他撰写了本书《Linux多线程服务端编程:使用muduo C++网络库》,深入介绍了此库的设计理念与应用实例。 #### Buffer类解析 Buffer类主要用于封装用户缓冲区并提供系列用于操作这些数据的方法。重点在于理解`Buffer`类中的读写机制、内部调整逻辑以及动态扩容特性[^2]。以下是简化版`Buffer`类的部分代码: ```cpp class Buffer { public: void append(const char* data, size_t len); ssize_t readFd(int fd, int* savedErrno); private: std::vector<char> buffer_; }; ``` #### Reactor模式下的关键组件分析 在muduo框架内,Reactor模式通过几个重要组成部分得以体现,即`EventLoop`, `Poller` 和 `Channel` 类之间的协作关系。具体来说,`EventLoop` 作为整个系统的中心调度者;而`Poller`则负责监听文件描述符上的事件变化情况;最后,`Channel`对象表示单个I/O通道的状态和行为[^3]。 对于接受新连接的功能模块而言,会创建个名为`acceptChannel_`的对象来专门处理来自客户端的新请求。它不仅包含了实际套接字资源(`acceptSocket_`)的信息,还定义了当有新的TCP连接到来时应该执行的动作[^4]。 #### Epoll接口调用说明 为了高效管理大量并发连接,在Linux系统上通常采用epoll机制来进行I/O多路复用。这里给出了个简单的例子展示如何向epoll实例注册感兴趣的文件描述符及其对应的操作类型[^5]: ```c++ // 向epoll实例添加/修改/删除监视项 int ctlResult = ::epoll_ctl(epfd_, EPOLL_CTL_ADD | EPOLL_CTL_MOD | EPOLL_CTL_DEL, sockfd_, &event_); if (ctlResult < 0) { // 错误处理... } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值