首页 > 其他分享 >【Muduo】网络库各模块和交互流程简介

【Muduo】网络库各模块和交互流程简介

时间:2024-05-24 17:56:57浏览次数:21  
标签:std Muduo epoll 简介 交互 fd loop poller Channel

Muduo是由陈硕大佬个人开发的C++网络库,最近在剖析其源码,在此做一些归纳整理。

Channel模块

内含向Poller中注册的文件描述符fd,封装了感兴趣的事件events、Poller返回的发生的事件revents,和一组能够根据fd发生的事件revents进行回调的回调函数callbacks

共有两种Channel,一种是listenfd - acceptorChannel,一种是connfd - connectionChannel

Poller和EPollPoller  -  Demultiplex

std::unordered_map<int, Channel*> channels_; // key为fd

通过epollctl把Channel中包含的fd注册到epoll上,当epoll返回时,可以通过fd找到Channel,进而进行相应的回调。

EventLoop  -  Reactor

std::vector<Channel *> activeChannels_;

std::unique_ptr<Poller> poller_;

一个Eventloop管理一堆Channel和一个poller。Channel想注册到poller上或者在poller上修改自己感兴趣的事件,Channel都是通过EventLoop来获取到poller,进而完成相应任务;同时,poller监听到sockfd有相应事件发生,也要通过EventLoop来调用相应Channel的fd的所发生事件的回调函数。 

int wakeupFd_;  // 一个wakeupfd隶属于一个loop

std::unique_ptr<Channel> wakeupChannel_;

loop执行的时候,驱动底层的事件分发器Demultiplx也即epoll_wait,若没有事件发送,则loop一定阻塞在epoll_wait上;若是想唤醒某个loop的阻塞状态,那就可以通过loop对象获取其对应的wakeupfd,并往wakeupfd写一点数据,来使loop从epoll_wait上返回,这是因为每一个wakeupfd也封装成了一个wakeupChannel,注册在了底层的epoll上。

std::vector<Functor> pendingFunctors_;

如果当前线程要调用其他线程中的loop进行回调操作,则将回调函数存放到pendingFunctors_中,并weakup相应的loop。

Thread、EventLoopThread和EventLoopThreadPool

EventLoop *getNextLoop(); 

通过轮询算法获取下一个subLoop,如果没有setThreadNum设置多线程,那么获取到的永远是baseLoop;如果有设置过多线程,那么threadPool会驱动底层创建新线程,一个thread对应一个loop,即 one loop per thread 

Socket、Acceptor

主要封装了listenfd相关操作,socket创建、bind、listen,listen开启后打包成acceptorChannel,放到baseLoop去执行 

Buffer

缓冲区  应用写数据 =》缓冲区 =》 Tcp发送缓冲区 =》 send

+-------------------+------------------+------------------+
| prependable bytes |  readable bytes  |  writable bytes  |
|      缓冲区头     |     (CONTENT)    |     可写空间     |
+-------------------+------------------+------------------+
|                   |                  |                  |
0      <=      readerIndex   <=   writerIndex    <=     size

TcpConnection

一个连接成功的客户端对应一个TcpConnection,封装了SocketChannel和各种回调函数,还有发送和接收缓冲区

TcpServer

封装AcceptorEventLoopThreadPool,以及

std::unordered_map<std::string, TcpConnectionPtr> connections_;

接下来将在专栏更新各模块的具体重新实现

标签:std,Muduo,epoll,简介,交互,fd,loop,poller,Channel
From: https://blog.csdn.net/qq_20756957/article/details/139091202

相关文章

  • Ollama+Open WebUI本地搭建大模型并发布公网分享好友体验AI交互
    文章目录前言1.运行Ollama2.安装OpenWebUI2.1在Windows系统安装Docker2.2使用Docker部署OpenWebUI3.安装内网穿透工具4.创建固定公网地址前言本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具,并安装OpenWebUI结合cpolar内网穿透软件,实......
  • TS类,接口,泛型的简介
    //1.类的属性和方法classDog{name:string="旺财";age:number=2;shout(){console.log("汪汪汪")}}letdog=newDog()//2.类的构造函数(用于给类中的属性设定初始值,在创建类的实例时会被触发)classCat{name:string;ag......
  • Pytorch-01 框架简介
    智能框架概述人工智能框架是一种软件工具,用于帮助开发人员构建和训练人工智能模型。这些框架提供了各种功能,如定义神经网络结构、优化算法、自动求导等,使得开发人员可以更轻松地实现各种人工智能任务。通过使用人工智能框架,开发人员可以更快速地开发和部署机器学习和深度学......
  • 搜索引擎ElasticSearch18_ElasticSearch简介1
    一、ElasticSearch简介1、什么是ElasticSearchElaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但......
  • Vue搭建移动端h5项目(已开源,附带git地址)Vant+Vue Router+Vuex+axios封装+案例交互+部分
    一、项目介绍以及项目地址             项目介绍:vue2搭建。项目通过amfe-flexible与postcss-pxtorem实现移动端适配;通过Vantui作为项目的组件库;通过Vuex管理数据状态,进行模块化管理;通过VueRouter配置项目路由,进行模块化管理;封装axios进行数据的请求,以及一些页......
  • skynet.newservice简介:服务的启动
    skynet是一个轻量级的游戏服务器框架。简介在skynet的体系中,服务是一个基础概念。通常,我们使用skynet.newservice来启动一个snlua服务。那么,当我们写下localaddr=skynet.newservice("test")这行代码时,系统是怎么运作的呢?思考一下这些问题:调用skynet.newservice会不会发......
  • 封装 ECharts 为 Vue 组件:X-ECharts 简介
    ECharts是一个广泛使用的开源可视化库,它提供了丰富的图表类型和灵活的配置选项,适用于复杂的数据可视化需求。而X-ECharts是一个基于ECharts封装的Vue组件库,旨在提供更简洁的集成方式,同时兼容Vue2和Vue3,使得开发者能够在不同版本的Vue项目中无缝使用ECharts。Eng......
  • containerd 源码分析:kubelet 和 containerd 交互
    0.前言Kubernetes:kubelet源码分析之创建pod流程介绍了kubelet创建pod的流程,其中介绍了kubelet调用runtimecri接口创建pod。containerd源码分析:启动注册流程介绍了containerd作为一种行业标准的高级运行时的启动注册流程。那么,kubelet是怎么和containerd......
  • Flutter 交互组件
    目录前言fluttertoast8.2.5flutter_smart_dialog快速开始Flutter原生组件总结前言现在主流的交互方式是Toast和Dialog。细分下来就是messageinfosuccesserrorwarningloadingconfriminputselect这么多组件,纯自己手写肯定是不可能的,我个人的学习逻辑是能用框架就......
  • 科研单位要在跨网文件交互时保护核心研究数据,该怎么做?
    科研单位是指专门从事科学研究的机构,包括基础研究、应用研究和开发研究等,以推动科技进步和经济发展,提高科研水平和技术创新能力。在我国科研单位类型多样,所发挥的主要作用也有所区别,一般主要包括以下几种:政府科研机构:由政府直接资助和管理的科研机构,主要任务是进行基础研究和应用......