当前位置: 首页 > news >正文

基于多反应堆的高并发服务器【C/C++/Reactor】(下)

Listerner 有监听端口和用于监听的文件描述符。把用于监听的文件描述符或者通信的文件描述符进行了封装,封装好了之后对应一个通道。我如果想要接收客户端的连接,需要一个文件描述符。所有的客户端向我发起了连接请求,都需要通过这个文件描述符来完成对应的动作。如果要通信,每个客户端都对应一个通信的文件描述符。所以就可以把每个通信的文件描述符理解为专属的路径。在封装Channel的时候,都有什么样的关键性要素呢?

文件描述符可以是通信的,也可以是监听的
监听/通信文件描述符最终都要把它放入I/O多路复用模型里边进行检测
Dispatcher有三种I/O多路复用技术供我们选择,分别是poll、select、epoll(三选一,并非同时使用)
通过Dispatcher检测一系列的文件描述符所对应的事件,因此在Channel中我们除了封装这些文件描述符之外,还需要指定这些文件描述符需要检测的事件。有三类,包括读、写、读写。另外,反应堆模型的基本要素是回调,有了回调之后,才能实现一个反应堆模型。因此需要注册事件对应的处理动作(回调函数)。我们需要告诉Channel,如果这个读事件触发了,它所对应的处理动作是什么?把这些注册好了之后,什么时候调用呢?Dispatcher在检测fd事件的时候,如果检测到了读事件,它会帮助程序员去调用对应的处理动作。

文件描述符如何封装为Channel?文件描述符被封装为通道式通过将通信的文件描述符或用于监听的文件描述符进行封装实现的。封装后的通道对应一个专属的文件路径,用于接收客户端连接和通信。在封装过程中,关键性要素包括文件描述符,它可用于通信或监听。这些文件描述符最终被放到一个IO多路复用模型中进行检测,该模型是反应堆模型的核心组件之一。通过封装的ChannelMap模块,根据文件描述符找到对应的channel实例,从而根据事件触发对应的回调函数或处理动作。

反应堆模型中的Channel是一个封装了文件描述符的通道,用于通信和监听,这个Chanel 对应一个文件描述符,可以是通信的,也可以是监听的。在Channel中,除了封装这些文件描述符之外,还需要指定这些文件描述符需要检测的事件,包括读、写、读写。这些事件对应的处理动作就是回调函数,由Dispatcher模型来调用。

ChannelMap:反应堆模型中的ChannelMap是一个关键的模块,用于存储每个文件描述符与对应的Channel实例之间的对应关系。通过ChannelMap,程序能够根据文件描述符找到对应的Channel,进而确定文件描述符对应的事件触发后所对应的回调函数(处理动作)。因此,ChannelMap在反应堆模型中起着重要的桥梁作用,帮助程序实现时间驱动的处理机制。

EventLoop:事件循环,因为服务器启动起来之后,一直有事件不停地触发,这个事件包括客户端的新连接,以及已经建立连接的客户端和服务器之间的数据通信。例如数据的发送:服务器给客户端发送数据,有两种方式:
————————————————
版权声明:本文为CSDN博主「呵呵哒( ̄▽ ̄)"」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41987016/article/details/135147682

待续~

相关文章:

  • XML简介 (EXtensible Markup Language)
  • mybatis-plus阻止全表更新与删除
  • Wavesurfer.js绘制波形图
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • 软考高级难度排行榜,哪个科目相对较容易呢?
  • web前端游戏项目-堆木头游戏【附源码】
  • apache poi_5.2.5 实现表格内某一段单元格的复制
  • 通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能
  • 【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】
  • 3. BlazorSignalRApp 结合使用 ASP.NET Core SignalR 和 Blazor
  • 【计算机视觉中的多视图几何系列】深入浅出理解针孔相机模型
  • 华为---登录USG6000V防火墙---console、web、telnet、ssh方式登录
  • Pycharm报的一些Python语法错误
  • SpringIOC之MethodBasedEvaluationContext
  • Springboot+vue的装饰工程管理系统(有报告),Javaee项目,springboot vue前后端分离项目
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [iOS]Core Data浅析一 -- 启用Core Data
  • ERLANG 网工修炼笔记 ---- UDP
  • java中具有继承关系的类及其对象初始化顺序
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Map集合、散列表、红黑树介绍
  • webpack入门学习手记(二)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 记录:CentOS7.2配置LNMP环境记录
  • 开发基于以太坊智能合约的DApp
  • 来,膜拜下android roadmap,强大的执行力
  • 听说你叫Java(二)–Servlet请求
  • 线上 python http server profile 实践
  • 用jquery写贪吃蛇
  • 再谈express与koa的对比
  • UI设计初学者应该如何入门?
  • 正则表达式-基础知识Review
  • ​iOS实时查看App运行日志
  • ​Linux·i2c驱动架构​
  • $.proxy和$.extend
  • (二)JAVA使用POI操作excel
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十一)手动添加用户和文件的特殊权限
  • (转)程序员疫苗:代码注入
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [20160807][系统设计的三次迭代]
  • [Android 数据通信] android cmwap接入点
  • [android] 练习PopupWindow实现对话框
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ1008][HNOI2008]越狱
  • [bzoj1324]Exca王者之剑_最小割
  • [C++] sqlite3_get_table 的使用
  • [delphi]保证程序只运行一个实例
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?