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++网络库>.本人前段时间出于个人学习.找工 ...
随机推荐
- 《剑指offer》Q01-12 (牛客10.11)
目录 T1 二维部分有序数组查找 ☆ T2 字符串字符不等长替换 - 从后往前 T3 返回链表的反序 vector T4 重建二叉树 T5 两个栈模拟队列 T6 旋转数组中的最小元素 - 二分或暴力 ...
- Kubernetes组件-ReplicaSet
⒈简介 最初,ReplicationController是Kubernetes用于复制和在异常时重新调度节点的唯一组件,后来Kubernetes又引入了一个名为ReplicaSet的类似资源.它是新一 ...
- Scala当中什么是Transformation和 Action,以及它们俩的区别是什么?
[学习笔记] 一个完整的RDD任务由两部分组成:Transformation和 Action.Transformation用于对RDD的创建,还可以把老的RDD通过Transformation来生成新 ...
- 文件锁-fcntl flock lockf
这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文 ...
- A司入职面试宝典
=公司介绍============================= 世界500强,每股股票2000刀. 面试难度:**** 加班程度:* =面试-流程介绍====================== ...
- 下载HTMLTestRunner 地址
通过pip安装 HTMLTestRunne失败 则需要通过手动下载. 下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html 下载后,把H ...
- Python 常用外部模块详解
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- HttpContext is null
HttpContext context1 = System.Web.HttpContext.Current; HttpContext context2 = System.Runtime.Remotin ...
- Nopcommerce 项目添加插件
插件是用来扩展nopCommerce功能的.nopCommerce拥有多种类型的插件.例如:支付方式(PayPal),税务机构,送货方式计算方法(UPS, USP, FedEx),小部件(如“在线聊天 ...
- js之数据类型(对象类型——构造器对象——正则)
正则(regular expression)描述了一种字符串的匹配式.一般应用在一些方法中,用一些特殊的符号去代表一些特定的内容,对字符串中的信息实现查找,替换,和提取的操作.js中的正则表达式用Re ...