从epoll构建muduo-11 单线程Reactor网络模型成型

本文介绍了mini-muduo v0.11版本的改进,包括命名规范优化、可读性提升和32/64位兼容性处理。文章深入剖析了muduo库中的三个关键文件描述符——socket fd、event fd和timer fd,以及它们在epoll_wait中的作用。通过单线程Reactor模型,详细阐述了事件循环如何处理这三种描述符的读事件,以及异步调用和定时器的处理流程。
### Muduo 网络库中的 Reactor 模型 Muduo 是一个基于 Reactor 模式的 C++ 网络库,该模式最早由 Douglas C. Schmidt 在 1995 年提出[^1]。Reactor 模式主要用于处理并发 I/O 请求,在服务器应用程序中非常常见。 #### Reactor 模式的核心组件 在 Muduo 中,Reactor 的实现主要依赖于几个关键概念: - **事件分发器(Event Dispatcher)**:负责监控多个文件描述符上的事件,并调用相应的回调函数来响应这些事件。 - **处理器对象(Handler Objects)**:每个注册到 Reactor 上的文件描述符都有对应的处理器对象,当特定类型的事件发生时,处理器会被激活并执行预定义的操作。 - **事件循环(Event Loop)**:这是整个系统的驱动引擎,它不断轮询所有已注册的兴趣点集合,一旦检测到某个兴趣点上有活动,则立即触发关联的回调机制。 具体来说,Muduo 库通过 `Epoll` 或者其他类似的多路复用技术实现了高效的 I/O 多路转接功能[^2]。每当有一个新的连接到来或者现有连接中有数据可读/写时,都会通知给指定的事件处理器来进行进一步操作。 为了提高性能和扩展性,Muduo 支持单线程以及多线程版本的 Reactor 实现方式。特别是在高负载场景下,采用多线程可以显著减少阻塞时间,从而提升整体吞吐量。值得注意的是,在这种情况下几乎不存在同步开销,因为各个连接之间相互独立[^3]。 另外,针对新建立但尚未被任何工作线程所接管的连接请求,Muduo 设计了一套特殊的机制——即将这类任务暂存至 `pendingFunctors` 队列当中;随后,在下一个合适的时机(即当前 Poller 所管理的一组 Channel 出现活跃状态变化之际),再统一取出这批待办事项加以处理[^4]。 ```cpp void EventLoop::doPendingFunctors() { std::vector<Functor> functors; callingPendingFunctors_ = true; // 加锁保护临界区访问 pendingFunctors_ MutexLockGuard lock(mutex_); // 将 pendingFunctors_ 内的任务转移至局部变量 functors 中 functors.swap(pendingFunctors_); // 解除锁定后依次执行每一个 Functor 对象代表的工作单元 for (size_t i = 0; i < functors.size(); ++i) functors[i](); callingPendingFunctors_ = false; } ``` 此方法有效地解决了由于新连接未能即时分配给工作者而导致的服务延迟问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值