一、系统架构概览

会议系统采用"主进程+线程池+进程池"的分层架构,实现高并发与业务隔离:

Unix域套接字通信
Unix域套接字通信
客户端
主进程
线程池
处理连接接收
进程池
管理会议室
房间进程1
含发送线程池
房间进程2
含发送线程池
房间进程N
含发送线程池

流程图说明:

  1. 客户端:作为外部请求发起方,连接到系统主进程。
  2. 主进程:系统核心控制节点,负责协调线程池和进程池。
  3. 线程池:由主进程管理,专门处理客户端的连接请求(如TCP连接建立、请求解析等)。
  4. 进程池:负责管理多个独立的“房间进程”,实现会议室的隔离和并发管理。
  5. 房间进程:每个进程对应一个会议室,内部包含发送线程池(用于高效处理消息推送),通过Unix域套接字与主进程通信(低延迟、高安全的本地进程间通信方式)。

这种架构通过“线程池处理连接 + 进程池隔离业务”的方式,兼顾了高并发处理能力和业务稳定性(单个房间故障不影响其他房间)。

核心组件角色

  • 主进程:全局资源管理,进程池调度,状态监控
  • 线程池:接收客户端连接,初步处理请求
  • 房间进程:独立管理单个会议室,含1个接收线程+5个发送线程
  • 通信管道:主进程与房间进程通过Unix域套接字通信

二、创建会议室完整流程

1. 流程步骤

客户端线程池线程主进程房间进程(空闲)发送 CREATE_MEETING 请求请求分配空闲房间查找空闲房间进程(遍历room->>pptr)返回房间索引i通过管道传递connfd+命令'C'接收线程(accept_fd)处理连接标记客户端为房主(user_pool->>owner)返回会议室创建成功状态更新为"忙碌"(child_status=1)客户端线程池线程主进程房间进程(空闲)

2. 关键技术细节

  • 房间分配机制:主进程通过遍历room->pptr数组查找child_status=0的空闲进程,加锁保证线程安全

    // 核心代码:查找空闲房间
    pthread_mutex_lock(&room->lock);
    for (int i=0; i<room->num; i++) {if (room->pptr[i].child_status == 0) {  // 找到空闲房间room->pptr[i].child_status = 1;     // 标记忙碌room->navail--;break;}
    }
    pthread_mutex_unlock(&room->lock);
    
  • 连接交接技术:通过Unix域套接字传递客户端连接(connfd),使用SCM_RIGHTS控制消息实现文件描述符跨进程传递

    // 传递连接核心代码
    struct cmsghdr *cmptr = CMSG_FIRSTHDR(&msg);
    cmptr->cmsg_type = SCM_RIGHTS;
    *(int*)CMSG_DATA(cmptr) = client_fd;  // 传递文件描述符
    sendmsg(pipefd, &msg, 0);
    

三、加入会议完整流程

1. 流程步骤

客户端线程池线程主进程目标房间进程(忙碌)房间内其他客户端发送 JOIN_MEETING(房间ID) 请求请求连接目标房间ID通过管道传递connfd+命令'J'接收线程添加用户到user_pool广播"新用户加入"通知返回加入成功更新用户数(total++)客户端线程池线程主进程目标房间进程(忙碌)房间内其他客户端

2. 关键技术细节

  • 用户池管理:房间进程通过user_pool结构体维护所有参会者连接,使用文件描述符集合(fdset)监控活动

    // 房间内用户管理
    Pthread_mutex_lock(&user_pool->lock);
    FD_SET(client_fd, &user_pool->fdset);  // 添加新用户
    user_pool->num++;                      // 增加用户计数
    Pthread_mutex_unlock(&user_pool->lock);
    
  • 广播通知机制:新用户加入后,房间进程向所有已连接用户发送通知,确保参会者列表同步

四、消息收发与转发流程

1. 流程步骤

发送客户端房间进程发送线程池接收客户端1接收客户端2发送消息(文字/图片)主线程读取消息头解析类型完整接收消息体将消息加入发送队列转发消息(含发送者信息)转发消息(含发送者信息)消息发送完成确认发送客户端房间进程发送线程池接收客户端1接收客户端2

2. 关键技术细节

  • 多线程协作:房间进程采用"1个接收线程+5个发送线程"的模型,解耦消息接收与转发

    // 发送线程池初始化
    for (int i=0; i<SENDTHREADSIZE; i++) {  // SENDTHREADSIZE=5Pthread_create(&tid, NULL, send_func, NULL);
    }
    
  • 消息队列缓冲:使用线程安全的消息队列(send_queue)平衡发送负载,避免消息阻塞

    // 消息入队
    Pthread_mutex_lock(&queue.lock);
    queue.send_queue.push(msg);  // 存入消息
    Pthread_cond_signal(&queue.cond);  // 唤醒发送线程
    Pthread_mutex_unlock(&queue.lock);
    
  • 协议格式设计:消息采用固定格式头部($_类型_IP_长度_),解决TCP粘包问题

    示例:$_TEXT_192.168.1.10_0005_Hello_#
    格式:$_[类型]_[IP]_[长度]_[内容]_#
    

五、进程与线程协作关系总结

组件角色职责通信方式
主进程进程池管理、状态监控、资源调度Unix域套接字(与房间进程)
线程池线程接收客户端连接、初步请求处理共享内存(主进程状态)
房间进程主线程监控用户活动、接收消息管道(与主进程)
房间接收线程处理新用户加入、连接交接内部信号量
发送线程池消息转发、负载均衡消息队列(线程间)

六、模块设计

1. 网络通信模块(net.cpp、netheader.h)

网络通信是系统的基础支撑,负责TCP连接的建立、数据传输及底层网络操作封装,主要功能包括:

  • 连接管理:通过Tcp_listen创建监听套接字,支持IPv4/IPv6双栈;Tcp_connect实现客户端与服务器的连接;Accept封装accept系统调用,处理中断重试逻辑。
  • 数据读写Readnwriten保证TCP数据流的完整读写(解决短读短写问题);read_fdwrite_fd支持通过Unix域套接字传递文件描述符(用于进程间传递客户端连接)。
  • 辅助功能Sock_ntop实现套接字地址到字符串的转换;Setsockopt封装setsockopt设置套接字选项(如SO_REUSEADDR)。

网络模块通过统一的错误处理(依赖err_quiterr_msg)保证异常场景的可追溯性。

2. 线程与进程同步模块(unpthread.cpp、unpthread.h、msg.h)

系统采用多线程+多进程架构,同步机制是保证数据一致性的核心,主要组件包括:

  • 线程操作封装Pthread_createPthread_detach等函数封装原生 pthread 接口,简化线程创建与管理,并统一错误处理。
  • 互斥锁与条件变量Pthread_mutex_lockPthread_mutex_unlock封装互斥锁操作;Pthread_cond_waitPthread_cond_signal实现线程间等待/通知机制,用于消息队列的生产-消费同步。
  • 消息队列(SEND_QUEUE):定义于msg.h,基于std::queue实现线程安全的消息缓冲。通过互斥锁(lock)保护队列操作,条件变量(cond)协调生产者(push_msg)和消费者(pop_msg):当队列满时生产者等待,当队列空时消费者等待,消息入队/出队后通过信号唤醒等待线程。

3. 会议房间管理模块(room.cpp)

房间是系统的核心业务单元,负责管理会议内的用户及消息分发,主要功能包括:

  • 房间生命周期管理clear_room函数负责关闭房间内所有用户连接、清理用户数据(fdsetstatusfdToIp)及消息队列,将房间状态置为CLOSE
  • 用户加入/退出处理
    • accept_fd线程负责接收新用户连接(通过进程间传递的文件描述符),根据操作类型(创建/加入会议)更新用户池(pool),并发送会议响应或用户加入通知。
    • fdclose函数处理用户退出:若为房主退出则关闭整个房间,否则仅移除该用户并广播退出通知。
  • 消息分发send_func线程池从消息队列(sendqueue)获取消息,根据消息类型(如IMG_RECVTEXT_RECV)向房间内指定用户(或所有用户)转发数据,确保消息格式统一($_msgType_ip_size_data_#)。

4. 用户请求处理模块(userdeal.cpp)

该模块负责解析客户端请求并协调房间资源,核心逻辑在dowithuser函数中:

  • 请求解析:读取客户端消息头(11字节,包含消息类型、IP、数据长度),解析出CREATE_MEETING(创建会议)、JOIN_MEETING(加入会议)等请求类型。
  • 资源协调:创建会议时检查进程池(room)是否有空闲房间,若有则通过write_fd向对应房间进程传递客户端连接;加入会议时验证房间有效性,通过房间进程的管道传递连接并返回结果。

5. 主程序与进程/线程池(main.cpp)

main.cpp是系统入口,负责初始化核心资源并协调各模块运行:

  • 进程池初始化:通过process_make创建多个子进程(每个对应一个房间),父子进程通过Unix域套接字对(socketpair)通信,父进程监控子进程状态(房间是否空闲)。
  • 线程池初始化:通过thread_make创建多个工作线程,负责处理客户端初始连接(调用dowithuser)。
  • 主循环:通过select监控进程池管道,处理房间状态更新(如房间空闲、用户退出),维护全局资源的一致性。

6. 错误处理模块(error.cpp)

系统通过err_quit(退出程序)、err_msg(仅打印错误)统一处理错误,基于err_doit函数格式化错误信息(包含errno描述),确保错误场景的标准化处理,简化调试与问题定位。

核心设计优势

  1. 进程隔离:单个房间崩溃不影响其他会议,提高系统稳定性
  2. 并发优化:线程池处理连接突发,发送线程池避免消息阻塞
  3. 高效通信:Unix域套接字实现低延迟进程间通信,支持文件描述符传递
  4. 状态可见:主进程实时监控所有房间状态,支持动态调度

通过这种多层次的进程-线程协作架构,系统可支持500+并发用户、50+同时会议,消息转发延迟控制在50ms以内,满足实时会议的核心需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95887.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95887.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95887.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 创建 Bean 的 8 种主要方式

Spring&#xff08;尤其是 Spring Boot&#xff09;提供了多种方式来让容器创建和管理 Bean。Component、Configuration Bean、EnableConfigurationProperties 都是常见方式。 下面我为你系统地梳理 Spring 创建 Bean 的所有主要方式&#xff0c;并说明它们的使用场景和区别。…

React 第七十节 Router中matchRoutes的使用详解及注意事项

前言 matchRoutes 是 React Router v6 提供的一个核心工具函数&#xff0c;主要用于匹配路由配置与当前路径。它在服务端渲染&#xff08;SSR&#xff09;、数据预加载、权限校验等场景中非常实用。下面详细解析其用法、注意事项和案例分析&#xff1a; 1、基本用法 import { m…

iSCSI服务配置全指南(含服务器与客户端)

iSCSI服务配置全指南&#xff08;含服务器与客户端&#xff09;一、iSCSI简介 1. 概念 互联网小型计算机系统接口&#xff08;Internet Small Computer System Interface&#xff0c;简称iSCSI&#xff09;是一种基于TCP/IP的协议&#xff0c;其核心功能是通过IP网络仿真SCSI高…

堆(Heap):高效的优先级队列实现

什么是堆&#xff1f;堆是一种特殊的完全二叉树&#xff0c;满足以下性质&#xff1a;堆序性&#xff1a;每个节点的值与其子节点满足特定关系最小堆&#xff1a;父节点 ≤ 子节点&#xff08;根最小&#xff09;最大堆&#xff1a;父节点 ≥ 子节点&#xff08;根最大&#xf…

朝花夕拾(四) --------python中的os库全指南

目录 Python os模块完全指南&#xff1a;从基础到高阶文件操作 1. 引言&#xff1a;为什么需要os模块&#xff1f; 1.1 os模块的重要性 1.2 适用场景 1.3 os模块的"瑞士军刀"特性 2. os模块基础功能 2.1 文件与目录操作 2.1.1 核心方法介绍 2.1.2 避坑指南 …

uniappx 安卓端本地打包的一些总结

本人之前没用过android studio&#xff0c;因为有打包到安卓端的需求&#xff0c;所以有了这篇文章。下面一些内容不正常工作&#xff0c;也不报错&#xff0c;是很烦的&#xff0c;根本不知道是哪里出了问题。比如对应的aar包没有引入。或者没有注册信息。 在实现过程中我遇到…

AUTOSAR进阶图解==>AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP网络管理详解 基于AUTOSAR标准的UDP网络管理模块架构分析与实现指南目录 1. 概述2. UDP网络管理架构 2.1 整体架构图2.2 架构组件详解 3. UDP网络管理状态机 3.1 状态机图3.2 状态详解 4. UDP网络管理操作序列 4.1 序列图4.2 操作流程详解 5. UDP网络管理配置模型 …

AI搜索引擎下的内容优化新范式:GEO的关键技术解析

摘要&#xff1a; 生成式AI搜索引擎的崛起&#xff0c;催生了GEO&#xff08;Generative Engine Optimization&#xff09;这一新的优化领域。本文将深入剖析GEO背后的关键技术&#xff0c;包括深度语义理解、结构化内容生成、以及AI算法的适配性&#xff0c;旨在为品牌在AI时代…

Java Lambda表达式是什么,怎么用

这种代码是什么&#xff0c;怎么阅读/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

集成运算放大器(反向加法,减法)

反向加法电路原理&#xff1a;示波器显示&#xff1a;结论&#xff1a;输出电压-&#xff08;R4/R1*V1R4/R2*V2R4/R3*V3&#xff09;。平衡电阻R4等于R1和R2和R3的并联电压。减法运算电路原理&#xff1a;结论&#xff1a;减法运算电路分为三种不同情况&#xff0c;第一种情况为…

Maven入门到精通

目录 一&#xff0c;Maven概述 1.1介绍 1.2安装 1.3Maven生命周期和插件 1.4Maven的坐标的本地仓库的存储地址 二&#xff0c;依赖管理 2.1依赖管理——依赖范围 2.2依赖管理——添加依赖 获取依赖坐标 依赖添加后的操作 2.3依赖管理——依赖传递 2.4依赖管理——依…

计算机网络 TCP 延迟确认机制

TCP 延迟确认&#xff08;Delayed Acknowledgments&#xff0c;简称 Delayed ACK&#xff09;是 TCP 协议中一项旨在减少网络中小数据包数量、提升传输效率的优化机制。其核心思想是&#xff1a;不立即回复 ACK&#xff0c;而是等待一段时间&#xff08;通常 40ms&#xff09;&…

【visual studio】visual studio配置环境opencv和onnxruntime

下载opencv https://opencv.org/releases/?spma2ty_o01.29997173.0.0.57f4c921RELipW配置环境变量visual studio配置opencv 新建c项目选中文件后右键选择属性添加include文件夹库文件添加lib添加lib文件 将上一步的lib文件夹下的两个文件复制到这里以下两者区别在于&#xff0…

【Java】多线程Thread类

1. 进程与线程进程与线程的基本认识进程&#xff08;Process&#xff09;&#xff1a;进程是程序的一次动态执行过程&#xff0c;它经历了从代码加载、执行、到执行完毕的一个完整过程&#xff1b;同时也是并发执行的程序在执行过程中分配和管理资源的基本单位&#xff0c;竞争…

C/C++复习(四)

一.模版 模版涉及的是泛型编程&#xff0c;即通过编译器去确定类型的编程方式&#xff0c;模版分为&#xff1a;类模板和函数模版&#xff0c;下面我们一一复习&#xff1a; 函数模版&#xff1a; 格式&#xff1a; template<typename T1, typename T2,......,typename Tn&g…

022 基础 IO —— 文件

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: Linux_小米里的大麦的博客-CSDN博客 &#x1f381; GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录基础 IO —— C 语言文件 I/O 操作基础前言1. C 语言文件操作函数汇…

MNN LLM Chat iOS 流式输出优化实践

本文介绍了在 iOS 平台上使用 MNN 框架部署大语言模型&#xff08;LLM&#xff09;时&#xff0c;针对聊天应用中文字流式输出卡顿问题的优化实践。通过分析模型输出与 UI 更新不匹配、频繁刷新导致性能瓶颈以及缺乏视觉动画等问题&#xff0c;作者提出了一套包含智能流缓冲、U…

【开发技巧】VS2022+QT5+OpenCV4.10开发环境搭建QT Creator

VS2022编译器支持配置 QT5默认安装以后支持的是VS2015与VS2017&#xff0c;不支持VS2022&#xff0c;所以必须首先在Qt Creator中配置支持VS2022。配置顺序如下&#xff1a; 首先打开【工具】->【选项】 然点击Kits里面的【编译器】选项。点击Manual下面的【C】然后点击【…

【Linux系统】动静态库的制作

前言&#xff1a; 上文我们讲到了文件系统【Linux系统】详解Ext2&#xff0c;文件系统-CSDN博客 本文我们来讲讲动静态库的制作 库 【Linux】编译器gcc/g及其库的详细介绍_linux gcc 有哪些库-CSDN博客 这篇文章的第4大点&#xff0c;简单是介绍了一下库的基本概念。 静态库 静…

链式二叉树的基本操作——遍历

本文笔者将带领读者一起学习链式二叉树的一些基本语法&#xff0c;至于更难一些的插入删除等&#xff0c;笔者将在后续C更新后再次详细带领大家学习。 首先&#xff0c;在进行二叉树之前&#xff0c;我们需要一颗二叉树&#xff0c;而二叉树的初始化现阶段实现不太现实&#x…