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

2023-12-23 07:28

本文主要是介绍基于多反应堆的高并发服务器【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

待续~

这篇关于基于多反应堆的高并发服务器【C/C++/Reactor】(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527197

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块