Muduo阅读
创建了EventLoop对象的线程是IO线程,其主要功能是运行事件循环EventLoop::loop(), one loop per thread
事件循环必须在IO线程中运行
Reactor关键结构
Channel
- 每个Channel对象自始至终只属于一个EventLoop, 只负责一个fd的IO事件分发(如ReadCallback, WriteCallback),但它并不拥有这个fd, 也不会在析构时关闭这个fd
- 成员函数都只在IO线程中使用,因此更新数据成员不用加锁
Poller
- IO复用的封装,Poller并不拥有Channel,Channel在析构之前必须先unregister(EventLoop::removeChannel),避免空悬指针
- 目前供EventLoop调用的有poll和updateChannel
- poll函数:进行IO复用,并调用fillActiveChannel函数, 填充activeChannels, 返回return的时刻
- fillActiveChannel函数:监听pollfds数组,将在活跃的fd对应的channel中设置该fd对应活跃的事件,并将这个channel加入activeChannels中来进行后续的事件分发,只负责IO复用,不负责IO分发,一方面防止分发事件改变Channel, 另一方面简化Poller职责,方便替换为其他高效的IO机制(如epoll)
- updateChannel函数:更新并pollfds数组(可以增加一个新的fd,或者更改原有的pollfd),输入为channel,更新时也要更新Channel
- channel中有个idx记录了其在pollfds的位置,方便更新
EventLoop
- 拥有activeChannels,poller
- EventLoop:loop()调用poller::poll()获得当前活动事件的Channel列表,然后调用每个Channel的handleEvent函数
TimerQueue定时器
传统的是通过select和poll的等待时间来实现定时的,现在可以使用timefd以与IO事件相同的方式来处理定时,
TimerQueue需要高效组织目前尚未到期的Timer,能够快速找到已经到期的Timer, 还要高效删除增加Timer
muduo采用map<Timestamp, Timer>,但不是直接使用,因为这样无法处理Timestamp到期时间相同的情况,可以用multimap, muduo采用区分key的方法,将<Timestamp, Timer>作为一个key存储为一个Set
TCP网络库
Acceptor
用于接受新的TCP连接,并通知回调给使用者,供TcpServer使用,生命期由后者控制
数据成员有Socket和Channel, Socket是一个RAII handle, 封装的socket是一个listening socket(server socket),用于观察此socket上的readable事件
TcpServer
管理accept(2)获得的TcpConnection, 供用户使用,生命周期由用户控制,用户只需要设置好callback, 再调用start()即可
新连接到达时,Acceptor会回调newConnection(), 创建TcpConnection并将其加入到ConnectionMap中,设置callback
TcpServer内部使用Acceptor来获得fd, start时让Acceptor去runInLoop
TcpConnection
TcpConnection是最核心也是最复杂的类,也是muduo中唯一默认使用shared_ptr来管理的class, 并且唯一继承enable_shared_from_this,因为其生命周期模糊
TcpConnection表示的是一次TCP连接,断开了就没用了,自己处理可写事件,可读事件通过MessageCallback传达给客户(也就是用户提供MessageCallback)
Muduo阅读的更多相关文章
- Muduo阅读笔记--base(二)
上一篇文章对muduo的入门做了介绍. http://www.cnblogs.com/LCCRNblog/p/5668035.html base文件夹下这么多代码,该如何入手呢?对于我这种第一次接触大 ...
- Muduo阅读笔记---入门(一)
第一步:下载源码和文档 下载muduo项目的源码.<muduo-manual.pdf>文档,以及<Linux多线程服务端编程:使用muduo C++网络库.pdf>,这些是前期 ...
- Muduo阅读笔记---net(三)
muduo-manual手册一开始就介绍了“Muduo是基于Reactor模式的网络库”,因此必须对Reactor模式有一定的了解才行:另外,文中还提到EventLoop,这些知识点我目前都不太了解.
- 陈硕muduo
https://github.com/chenshuo/muduo muduo 阅读 https://www.cnblogs.com/qbits/p/11101678.html
- 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市
<Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...
- muduo库整体架构简析
muduo是一个高质量的Reactor网络库,采用one loop per thread + thread loop架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范. muduo的代码分为两部 ...
- muduo网络库架构总结
目录 muduo网络库简介 muduo网络库模块组成 Recator反应器 EventLoop的两个组件 TimerQueue定时器 Eventfd Connector和Acceptor连接器和监听器 ...
- muduo 的 shutdown() 没有直接关闭 TCP 连接?
http://blog.csdn.net/Solstice/article/details/6208634 今天收到一位网友来信: 在 simple 中的 daytime 示例中,服务端主动关闭时调用 ...
- 长文梳理muduo网络库核心代码、剖析优秀编程细节
前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工 ...
随机推荐
- 学习Yii(2)
Yii拥有很好的手册,还是中文的,官方的手册很详细.还是应该好好看一下.今天就开始跟着项目代码调试. 上次看到入口脚本,学习一定要快,要用心,抓住时间.不然时间拖久了就忘了.延续不上,大打折扣.而且要 ...
- 【FFMPEG】不要试图用msvc来编译ffmpeg
原文:http://blog.csdn.net/hn756si/article/details/41147497 出于学习目的,想建一个vs2010工程来编译ffmpeg(http://www.ffm ...
- Guava源码阅读-base-Charsets
package com.google.common.base; 今天在找base包下的源码阅读时,看到了Charsets,肯定是定义字符集的类,本来就想简单的看一下.(部分内容摘抄自:http://b ...
- IDEA操作之test case coverage的方法
作用: 用于自动化测试,检查单元测试的覆盖率情况. 安装: 1.点击 Run * with coverage 或者右键已经定义为test source的package选择(单个test class同 ...
- 【洛谷】P4202 [NOI2008]奥运物流
[洛谷]P4202 [NOI2008]奥运物流 感觉有点降智 首先设环长为\(len\),很容易推导出 \[ R(1) = \frac{\sum_{i = 1}^{N} C_{i} k^{dep[i] ...
- JAVA开发者大会:拍拍贷MQ系统原理与应用
--喜欢记得关注我哟[shoshana]-- 前记: 5月12号参加了JAVA开发者大会,就<拍拍贷消息系统原理及应用> 作者:李乘胜老师 关于PMQ的分享整理一下笔记以及笔记的思考 和复 ...
- 三种SpringSecurity方法级别权限控制
一 JSR-250注解 1.在pom.xml添加 <dependency> <groupId>javax.annotation</groupId> <arti ...
- shell如果文件夹不存在则创建
#!/bin/bash build_dir="build" if [ ! -d "$build_dir" ]; then mkdir $build_dir fi ...
- vscode+php+xdebug won't stop at breakpoint 断点不起作用
not stopping on breakpoints breakpoint not working 原因: 1) php.ini xdebug 端口不配置的情况下,默认是 9000,如果vscode ...
- Python学习2——使用字符串(完整版)
""" 在C语言入门的时候字符串没有好好学习,导致后期语言根本没有入门, 更导致之后大量的codeing时间浪费,效率低下. 因此,借助这次Python入门,好好地将字符 ...