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

主进程如何将客户端连接分配到房间进程

这是一个多进程+多线程的高并发架构,各组件协同工作如下:

系统架构概览

主进程 (main.cpp)
├── 线程池 (userdeal.cpp)  // 处理客户端连接请求
└── 进程池 (房间进程, room.cpp)  // 管理房间内通信├── 接收线程 (accept_fd)  // 接收主进程分配的连接└── 发送线程池 (send_func) // 转发房间内消息

一、线程池(主进程内)

1. 创建与作用
  • 位置main.cppmain()函数
  • 创建代码
    tptr = (Thread *)Calloc(nthreads, sizeof(Thread));
    for(i = 0; i < nthreads; i++) {thread_make(i);  // 创建线程池
    }
    
  • 作用
    • 监听并接受客户端连接(accept()
    • 解析客户端初始请求(创建/加入房间)
    • 不处理具体业务,仅作为"调度器"将连接分配给房间进程
2. 工作流程 (userdeal.cpp)
ClientThreadPoolRoomProcess连接请求accept(connfd)解析请求类型通过管道发送 'C'+connfd标记为房主通过管道发送 'J'+connfd广播新成员加入alt[创建房间][加入房间]ClientThreadPoolRoomProcess
3. 关键代码 (userdeal.cpp)
void dowithuser(int connfd) {// 解析请求头部...if(msgtype == CREATE_MEETING) {// 找到空闲房间进程char cmd = 'C';write_fd(room->pptr[i].child_pipefd, &cmd, 1, connfd);close(connfd); // 主进程关闭连接} else if(msgtype == JOIN_MEETING) {char cmd = 'J';write_fd(room->pptr[i].child_pipefd, &cmd, 1, connfd);close(connfd); // 主进程关闭连接}
}

二、进程池(房间进程)

1. 创建与作用
  • 位置main.cppprocess_make()
  • 创建代码
    for(i = 0; i < nprocesses; i++) {process_make(i, listenfd);  // 创建房间进程
    }
    
  • 特点
    • 每个进程独立管理一个"房间"
    • 进程间完全隔离,避免全局锁竞争
    • 通过socketpair与主进程通信
2. 进程内部线程架构
房间进程 (process_main)
├── 接收线程 (accept_fd):1个
│   └── 接收主进程分配的连接
└── 发送线程池 (send_func):多个└── 转发房间内消息

三、关键协作机制

1. 连接传递机制
1. accept
connfd
2. 解析请求
3. write_fd
'C'/'J'+connfd
4. read_fd
主线程
线程池
房间进程管道
房间进程的accept_fd线程
获取connfd
加入房间用户池
2. 线程/进程职责对比
组件所属进程数量职责
主线程主进程1管理线程/进程池,监听进程状态
线程池主进程N接收连接并分配到房间进程
房间进程子进程M管理独立房间
accept_fd线程房间进程1/进程接收主进程分配的连接
send_func线程房间进程5/进程转发房间内消息

四、资源管理关键点

  1. 连接生命周期

    • 主进程的线程池accept()获取connfd
    • 通过write_fd()connfd传递给房间进程
    • 主进程立即关闭connfd(房间进程接管)
  2. 房间进程状态同步

    // main.cpp的主循环
    if(Read(pipefd, &rc, 1) == 'E') {pthread_mutex_lock(&room->lock);room->pptr[i].child_status = 0; // 标记房间空闲room->navail++;
    }
    
  3. 线程安全控制

    • 主进程:room->lock保护进程池状态
    • 房间进程:user_pool->lock保护连接池

五、设计优势

  1. 层级分离

    • 连接接收 vs 业务处理
    • 房间隔离 vs 进程内并发
  2. 高效资源利用

    主进程:1监听线程 + N接收线程
    房间进程:1连接线程 + 5发送线程
    → 总线程数 = 1 + N + M*(1+5)
    
  3. 错误隔离

    • 单个房间崩溃不影响其他房间
    • 线程崩溃只影响单个房间

六、典型工作流示例

  1. 用户A创建房间

    • 线程池接收连接 → 分配空闲房间进程 → 房间进程标记A为房主
  2. 用户B加入房间

    • 线程池接收连接 → 找到目标房间进程 → 房间进程广播B加入
  3. 房主退出

    • 房间进程检测到房主断开 → 清理房间资源 → 通知主进程房间空闲

这种架构通过三层分配机制(线程池→进程池→线程池)实现高效连接管理和资源隔离,适合高并发会议场景。主进程的线程池专注于连接调度,房间进程内的线程池专注于消息转发,各司其职又通过进程间通信紧密协作。

http://www.dtcms.com/a/331818.html

相关文章:

  • Android UI(一)登录注册 - Compose
  • 基于Python和Dify的成本对账系统开发
  • OpenCV Canny 边缘检测
  • 软考中级【网络工程师】第6版教材 第3章 局域网 (上)
  • Linux中tty与8250-uart的虐恋(包括双中断发送接收机制)
  • Linux中Samba服务配置与使用指南
  • YouBallin正式上线:用Web3重塑创作者经济
  • 会议通信系统核心流程详解(底稿1)
  • JVM的逃逸分析深入学习
  • 17.2 修改购物车商品
  • RLVR(可验证奖励的强化学习):大模型后训练的客观评估策略
  • 负载因子(Load Factor) :哈希表(Hash Table)中的一个关键性能指标
  • AI大模型+Meta分析:助力发表高水平SCI论文
  • 多任务并发:进程管理的核心奥秘
  • 【记录】Apache SeaTunnel 系统监控信息
  • 使用ETL工具同步Oracle的表到Doris
  • 使用load data或insert导入10w条数据
  • 51单片机-GPIO介绍
  • 网络组播技术详解
  • 深入理解 `std::any`:C++ 中的万能容器
  • 俄罗斯加强互联网管控,限制 WhatsApp 和 Telegram 通话
  • P5663 [CSP-J2019] 加工零件
  • 腾讯K8S环境【TKE】中,如何驱逐指定pod重新部署?
  • Kafka下载和安装
  • Python:如何处理WRF投影(LCC, 兰伯特投影)?
  • 深度学习 --- ResNet神经网络
  • 【递归完全搜索】CCC 2008 - 24点游戏Twenty-four
  • 【完整源码+数据集+部署教程】膝关节屈伸运动检测系统源码和数据集:改进yolo11-RFAConv
  • pip和dnf只下载不安装离线包
  • 沈帅波出席茅台红缨子高粱节探讨产业赋能新模式