muduo网络库学习(1)

文章目录

  • muduo网络库学习(1)
  • 前言
  • 一、muduo是什么?
  • 二、代码结构
    • 1.base库
    • 2.net库
    • 3.附属库
  • 二、网络库结构
  • 总结

前言

本章节主要介绍muduo网络库的整体架构!

一、muduo是什么?

muduo是一款基于reactor的网络库,整个网络库采用oneloopperthread+threadpool的方法,代码简洁,性能优越·。

二、代码结构

1.base库

base库如下:

base库主要是分装了一些net中需要的调用,列如为net库提供高性能日志,线程封装,线程池封装等!

2.net库

net如下:

net部分使用base中的工具类实现更高层次的逻辑,网络编程无非是对socket和其使用的epoll/poll等进行封装,使其便于使用,屏蔽掉底层网络库的一些 “坑”, 在满足了基础的网络IO之后,就需要考虑高性能,高并发的问题,muduo 的是由poll/epoll 这些IO复用模型构成,但是单个IO线程在面对大量请求时难免处理不过来,所以就需要结合多线程或者线程池,一个线程对应一个epoll进行网络IO,这样就可以充分利用硬件多核系统。从软硬两方面综合提升性能。net部分封装的较为彻底,对上层提供的接口简单易用,所以涉及复杂的内部处理,接下来就对其内部实现进行探究。(图中灰色的类是内部类,白色的是外部类)

3.附属库

如下:

不是muduo库的核心,主要是对muduo库进行一些应用

二、网络库结构

其中灰色部分是用户不可见的,白色部分是用户可见的,黑色箭头代表着一对一关系,白色箭头代表着多对一关系,同时黑色箭头代表着后者控制前者的生存期。

EventLoop:是对时间循环的抽象

Poller是对IO复用的抽象,它有两个派生类PollPoller以及EpollPoller,分别封装了epoll和poll,这个是muduo唯一一个基于面向对象思想编写的类。EventLoop与Poller是组合关系,一个EventLoop包含一个poll,EventLoop控制Poller的生存期。EventLoop中的loop调用Poller中的poll函数进行实现。

Channel是对IO事件(对应一个套接字)的响应注册的封装,其中函数update()负责将IO事件通过EventLoop中的updateChannels–>poller中的updateChannels,从而实现了对IO事件的注册。其中handleEvent负责对IO事件中发生可读可写等事件进行处理。与EventLoop的关系:EventLoop对应着多个Channel对象。
Channel的生存期不由TcpConnection,Acceptor,Connctor等拥有channel的来控制,而不是由EventLoop来控制(EventLoop中包含着一个WakeupChannel,这个channel由Event Loop控制)。虽然Channel对应着一个文件描述符fd,但是文件描述符的生存期确实由Socket来控制。

Acceptor是被动连接的抽象,它包含了一个监听文件描述符对应的Channel,将这个Channel注册到Eventloop中一旦由可读事件到来,触发Channel的handleEvent从而回调了Acceptor中handleread()。

Connector是一个对主动连接的抽象,包含了一个主动发起连接文件描述符的Channel,注册了handleWrite,handleerror等!

TcpConnction是一个已连接的抽象,包含了一个标志着连接文件描述符的Channel,对改Channel注册了handleread,handlewrite,handleerror等!

TcpServer是对服务器的抽象,一个TcpServer对应着一个Acceptor,一个TcpsServer对应着多个TcpConnection。TcpServer控制Acceptor的生存期,但是不控制Tcpconnection的生存期(列如:TcpClient关闭连接同样会导致Tcpconnction的销毁)

TcpClient是对客户端的抽象,一个TcpClient对应着一个Connector,一个TcpClient对应着多个TcpConnection。TcpClient控制Connector的生存期,但是不控制Tcpconnection的生存期(列如:TcpServer关闭连接同样会导致Tcpconnction的销毁)

总结

` 牢记muduo是一个oneloop perthread +threadpool框架。

muduo网络库学习(1)相关推荐

  1. muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool

    muduo是支持多线程的网络库,在muduo网络库学习(七)用于创建服务器的类TcpServer中也提及了TcpServer中有一个事件驱动循环线程池,线程池中存在大量线程,每个线程运行一个Event ...

  2. muduo网络库学习(七)用于创建服务器的类TcpServer

    目前为止,涉及到的绝大多数操作都没有提及线程,EventLoop,Poller,Channel,Acceptor,TcpConnection,这些对象的执行都是在单独线程完成,并没有设计多线程的创建销 ...

  3. muduo网络库学习(四)事件驱动循环EventLoop

    muduo的设计采用高并发服务器框架中的one loop per thread模式,即一个线程一个事件循环. 这里的loop,其实就是muduo中的EventLoop,所以到目前为止,不管是Polle ...

  4. muduo网络库学习总结:基本架构及流程分析

    muduo网络库学习:基本架构及流程分析 基本架构 Basic Reactor Mutiple Reactor + ThreadPool muduo库的基本使用 基本结构介绍 EventLoop类 P ...

  5. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  6. muduo网络库学习(三)定时器TimerQueue的设计

    Linux下用于获取当前时间的函数有 time(2) / time_t (秒) ftime(3) / struct timeb (毫秒) gettimeofday(2) / struct timeva ...

  7. muduo网络库学习(一)对io复用的封装Poller,面向对象与基于对象

    高效并发的网络框架大多离不开io多路复用函数,Linux下有三种 select poll epoll 关于三者的区别可以参考 linux网络编程-–几种服务器模型及io多路复用函数 前段时间看Libe ...

  8. muduo网络库学习(九)日志类Logger和LogStream,将日志信息打印到屏幕

    每一个成熟的项目都有大大小小的日志系统,在关键的地方打印日志信息,常用来跟踪程序运行,查找错误原因等,可以节省大量的debug时间 muduo的日志信息有5个级别 TRACE,细粒度最高的日志信息,打 ...

  9. muduo网络库学习(六)缓冲区Buffer及TcpConnection的读写操作

    在tcp的通信过程中,内核其实为tcp维护着一个缓冲区 当调用write/send时,会向内核缓冲区中写入数据,内核和tcp协议栈负责将缓冲区中的数据发送到指定<ip,port>的目标位置 ...

最新文章

  1. 大数据、数据挖掘、机器学习三者的区别和联系
  2. Netty详解(六):Netty 编解码技术
  3. 从零搭建自己的SpringBoot后台框架(七)
  4. python图标的演变_python day 22 CSS拾遗之箭头,目录,图标
  5. 整型数据类型java_Java 六种基本整型数据类型变量的取值范围
  6. net core 3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”
  7. 夺命雷公狗---linux NO:19 linux下的vi交换文件
  8. Ardence BXP 3.5 - 4.1 PNP 方法
  9. 个所税服务器没有企业信息,【重要】企业纳税申报一定要看进来!
  10. python 生成word,插入图片如何居中显示
  11. python实现excel表格图片识别,并转换成excel文件
  12. tomcat之连接器
  13. 迷你助手世界隐私条款
  14. Python爬取wfxnews 小说网站,实现批量下载小说
  15. Whai_springmvc笔记
  16. 3dmax顶点动画导入unity_从3dmax如何导入物体到unity3d
  17. 【软考-中级】系统集成项目管理工程师-【3信息系统集成专业技术知识】
  18. CloseableHttpClient设置Timeout 设置超时时间
  19. 激光测距仪构造原理及激光安全说明——TFN BKD系列双目军绿激光测距测高仪
  20. 舍斯托夫与尼采和《圣经》思想--舍斯托夫的著作《雅典与耶路撒冷》 [ZZ]

热门文章

  1. python和易语言抓包_易语言调用抓包工具 易语言网页抓包教程
  2. Photoshop制作格子图片效果
  3. 你尝过被人误会的委屈吗?看完本篇…
  4. x.squeeze()、x.unsqueeze()用法
  5. WEB后端服务第15天-Django第五天
  6. HBuilderX中的个人主题配置参数json
  7. 史上最全js数组,字符串方法汇总
  8. JS 去除数组空字符串、undefined、null
  9. css修改图片形状,用css绘制各种形状
  10. 关乎爱情与无关爱情--由阿里上市想到的