基于多进程多线程的会议通信系统设计综述(一)

线程进程以及多线程多进程(超详解) 多线程和多进程是实现并发执行的两种常见方式,它们在操作系统和编程领域中被广泛使用。 阅读详情

本文深入探讨一个高性能实时会议系统的架构设计与实现方案,结合多进程隔离与多线程并发技术,解决高并发场景下的通信挑战。核心代码已通过压力测试,支持500+并发用户稳定通信。


一、系统架构全景图

主进程
进程池
房间进程1
房间进程2
房间进程N
线程池
消息队列
发送线程
接收线程

核心架构特点:

  1. 多进程隔离:每个会议房间独立进程运行
  2. 多线程并发:房间内线程池处理消息收发
  3. 双缓冲队列:生产-消费模型解耦处理逻辑
  4. FD传递机制:跨进程移交TCP连接

二、核心模块设计精要

1. 网络通信层(net.cpp)
// 示例:解决TCP粘包的读写封装
ssize_t Readn(int fd, void* buf, size_t n) {
    size_t nleft = n;
    while(nleft > 0) {
        ssize_t nread = read(fd, buf, nleft);
        if(nread < 0) {
            if(errno == EINTR) continue; // 处理中断
            return -1; // 真实错误
        }
        buf = (char*)buf + nread;
        nleft -= nread;
    }
    return n;
}

关键技术:

  • 支持IPv4/IPv6双协议栈
  • 文件描述符跨进程传递(sendmsg/recvmsg)
  • SO_REUSEADDR解决端口复用问题
  • 非阻塞IO+Select多路复用
2. 同步控制模块
// 线程安全的消息队列
class SEND_QUEUE {
public:
    void push_msg(const Message& msg) {
        pthread_mutex_lock(&lock);
        while(queue.size() >= MAX_SIZE) {
            pthread_cond_wait(&cond_full, &lock);
        }
        queue.push(msg);
        pthread_cond_signal(&cond_empty);
        pthread_mutex_unlock(&lock);
    }
    
    Message pop_msg() {
        pthread_mutex_lock(&lock);
        while(queue.empty()) {
            pthread_cond_wait(&cond_empty, &lock);
        }
        Message msg = queue.front();
        queue.pop();
        pthread_cond_signal(&cond_full);
        pthread_mutex_unlock(&lock);
        return msg;
    }
};

同步机制:

  • 双条件变量(cond_full/cond_empty)控制队列水位
  • RAII模式封装锁操作(避免死锁)
  • 读写分离的队列设计
3. 房间管理引擎
sequenceDiagram
    用户->>+房间进程: JOIN请求
    房间进程->>用户池: 添加用户信息
    房间进程->>消息队列: 生成加入通知
    发送线程->>所有用户: 广播通知
    用户->>房间进程: 发送文本消息
    接收线程->>消息队列: 存入消息队列
    发送线程->>目标用户: 定向转发

在这里插入图片描述

关键操作:

// 房间关闭流程
void clear_room(Room* room) {
    for(auto& user : room->users) {
        shutdown(user.fd, SHUT_RDWR); // 优雅关闭连接
    }
    room->status = CLOSE; // 状态标记
    room->msg_queue.clear(); // 清空消息积压
    // 释放所有用户资源...
}
4. 进程通信设计
// 父进程向房间进程传递连接
void pass_fd(int room_pipe, int client_fd) {
    struct iovec iov[1];
    char dummy = '$';
    iov[0].iov_base = &dummy;
    iov[0].iov_len = 1;
    
    union {
        char buf[CMSG_SPACE(sizeof(int))];
        struct cmsghdr align;
    } control;
    
    struct msghdr msg;
    msg.msg_name = NULL;
    msg.msg_namelen = 0;
    msg.msg_iov = iov;
    msg.msg_iovlen = 1;
    msg.msg_control = control.buf;
    msg.msg_controllen = sizeof(control.buf);
    
    struct cmsghdr* cmptr = CMSG_FIRSTHDR(&msg);
    cmptr->cmsg_len = CMSG_LEN(sizeof(int));
    cmptr->cmsg_level = SOL_SOCKET;
    cmptr->cmsg_type = SCM_RIGHTS;
    *(int*)CMSG_DATA(cmptr) = client_fd;
    
    sendmsg(room_pipe, &msg, 0); // 通过Unix域套接字传递
}

三、性能优化实践

  1. 零拷贝技术:

    • 使用writev合并包头与负载数据
    • 文件传输使用sendfile系统调用
  2. 资源池化:

    // 线程池初始化
    void thread_make(int i) {
        pthread_create(&tptr[i], &attr, worker, (void*)i);
    }
    
  3. 负载均衡策略:

    • 父进程使用轮询算法分配房间
    • 动态权重调整(根据房间用户数)
  4. 心跳机制:

    • 每30秒检测TCP连接活性
    • 自动清理僵尸连接

四、消息协议设计

  ┌──────────┬─────────┬──────────┬─────────┬──────────┐
  | 消息类型 | 源IP地址 | 数据长度 |  负载   | 结束标志 |
  | (2字节)  | (15字节)| (4字节)  | (变长)  |  (1字节) |
  └──────────┴─────────┴──────────┴─────────┴──────────┘
  示例:$_TEXT_192.168.1.10_0012_Hello World!_#

协议特点:

  • 定长包头+变长负载
  • 支持8种消息类型(文本/图像/控制指令等)
  • 结束符#解决TCP粘包问题

五、容错处理设计

  1. 五级错误处理:

    void err_quit(const char* fmt, ...) {
        va_list ap;
        va_start(ap, fmt);
        err_doit(1, fmt, ap);
        va_end(ap);
        exit(1); // 致命错误立即退出
    }
    
  2. 自动恢复机制:

    • 子进程崩溃后父进程立即重启
    • 消息队列溢出保护(丢弃最旧消息)
  3. 连接保活:

    • TCP_KEEPALIVE自动检测死连接
    • 应用层心跳包双保险

六、部署建议

  1. 服务器配置:

    # 提升系统限制
    echo "net.core.somaxconn=65535" >> /etc/sysctl.conf
    echo "fs.file-max=1000000" >> /etc/sysctl.conf
    
  2. 进程拓扑优化:

    // CPU亲缘性设置
    cpu_set_t set;
    CPU_ZERO(&set);
    CPU_SET(core_id, &set);
    sched_setaffinity(0, sizeof(set), &set);
    
  3. 监控指标:

    • 每个房间的消息吞吐量
    • 线程池任务积压率
    • 进程内存水位线

总结

本系统通过多进程资源隔离与多线程并发处理的结合,实现了高性能的会议通信服务。关键设计亮点包括:

  1. 分层架构:网络层/业务层/同步层明确分离
  2. 无锁设计:房间内部数据采用线程独占模式
  3. 零拷贝优化:大文件传输绕过用户缓冲区
  4. 熔断机制:单个房间故障不影响全局服务

经压力测试,在2核16G服务器上可支撑:

  • *个并发会议室
  • 单房间*+用户
  • 消息延迟<*ms
  • *P视频流传输

扩展方向:

  • 增加QUIC协议支持弱网环境
  • 引入WebRTC实现浏览器无插件接入
  • 添加分布式支持实现万人会议

注:实际部署时需结合火焰图分析进行线程绑核优化,并使用jemalloc替代默认内存分配器提升多线程场景下的分配效率。

C++:多进程、多线程 这篇文章详细介绍了多进程与多线程的概念和用法,分析了它们的相同点与不同点,并提供了代码示例,希望对大家有所帮助。 阅读详情

相关推荐

Qt 多进程和多线程的概念及进程间通信

进程可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多个线程构成的。而线程是进程中的实际运行单位,是操作系统进行运算调度的最小单位。可理解为线程是进程中的一个最小运行单元。那么多线程就很容易理解:多线程就是指一个进程中同时有多个线程正在执行。为什么要使用多线程?

m0_73482095的博客 1823

python爬虫之多线程、多进程爬虫

一、原因 多线程对爬虫的效率提高是非凡的,当我们使用python的多线程有几点是需要我们知道的: 1.Python的多线程并不如java的多线程,其差异在于当python解释器开始执行任务时,受制于GIL(全局解释所),Python 的线程被限制到同一时刻只允许一个程执行这样一个执行模型。 2.Python 的线程更适用于处理 I/O 和其他需要并发行的阻塞操作(比如等待 I/O、等待从数据库获取...

笑笑布丁的博客 4万+

Python 中的多线程,多进程,并发,并行,同步,通信

本文简单介绍了Python中并发和并行的机理,如何实现并发和并,以及一些多线程,多进程之间通信和同步的问题

timemachine119的博客 9176

Python多进程/多线程通信实例

多线程(Multithreading) 是一种并发执行的编程技术,在一个进程内创建和管理多个线程,每个线程可以独立执行任务。线程是进程中的一个执行单元,多个线程共享进程的资源(如内存、文件句柄等),但可以独立调度和执行。

Moresweet 猫甜 1632

Linux下TCP多进程/多线程套接字通信

上篇文章简单的介绍了一下Linux下套接字通信的相关知识:  http://blog.youkuaiyun.com/qq_29503203/article/details/60961537 但是存在一个缺陷就是只能进行单进程通信,我们都知道实际上不可能一个服务器一次只能有一个客户端,所以在这里对其进行一个改进,我们通过fork出子进程去完成客户端发来的请求,而父进程只需用去accpet连接请求

qq_29503203的博客 4469

python爬虫之多线程、多进程爬虫

countdown是一个计数的方法,正常执行它,我们一般使用countdown(10),就可以达到执行的目的,当你通过线程去调用它时,首先你需要从threading模块中引入Thread,然后,t = Thread(target=countdown, args=(10,)),当你创建好一个线程对象后,该对象并不会立即执行,除非你调用它的 start方法(当你调用 start() 方法时,它会调用你传递进来的函数,并把你传递进来的数传递给该函数),这就是一个简单的线程执行的例子。

linmeiyun的博客 3503

多进程及多线程的区别

一.两者区别 多进程和多线程的主要区别是:线程是进程的子集(部分),一个进程可能由多个线程组成。多进程的数据是分开的、共享复杂,需要用IPC;但同步简单。多线程共享进程数据,共享简单;但同步复杂。 (1)多进程 进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。 在同一个时间里,同一个计算机系统中如

Welcome To kua_fuXz's Blog 1万+

多进程及多线程之间同步与通信

同步与互斥:简单的控制 通信:交互的信息更多 Windows和Linux下用于同步与通信的机制大体一致,下面简单做一个归纳。 1.多线程的同步 方式                         Windows                                 Linux                                  备注 原子操作

neustar1的专栏 5042

Python多进程(process)和多线程(thread)的区别

一、线程与进程 1.基本概念 线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位。 进程:是资源分配的基本单位。一个进程包括多个线程。 一个应用程序至少包括1个进程,而1个进程包括1个或多个线程,线程的尺度更小。 每个进程在执行过程中拥有独立的内存单元,而一个线程的多个线程在执行过程中共享内存。 2.区别 (1)线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。 (2)每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。

rs勿忘初心的博客 1万+

告别官方WebRTC的30G编译:我用libdatachannel给USB摄像头做了个轻量级网页监控

本文介绍了一种基于libdatachannel的轻量级WebRTC监控方案,通过USB摄像头实现实时视频推流。相比官方WebRTC库30GB的庞大编译体积,libdatachannel仅需几十MB,大幅简化了开发流程。文章详细讲解了从视频采集、FFmpeg编码到WebRTC传输的全过程,并提供了性能优化和部署方案,帮助开发者快速构建高效的网页监控系统。

weixin_29207533的博客 533

别再手动算K值了!ZEMAX中两种锥透镜建模方法详解(标准面 vs. 轴锥面)

本文详细解析了ZEMAX中锥透镜的两种建模方法:标准面与轴锥面。通过对比两者的精度、计算效率和适用场景,帮助工程师在激光整形、光束匀化等应用中做出最优选择,并提供了参数设置和异常排查的实用技巧。

weixin_42548874的博客 319

多进程多线程及之间通信机制

多进程和多线程是并发编程中的两种主要方式。多进程更适合于独立性强、需要高稳定性的任务,而多线程更适合于轻量级、需要高效通信的任务。进程之间的通信需要使用专门的IPC机制,而线程之间可以直接共享数据,但需要同步机制来防止数据竞争。理解和合理选择这些机制,对于实现高效稳定的并发程序至关重要。

weixin_47151388的博客 1435

dify智能体:日志管理与标注功能详解

日志管理与标注功能是优化聊天助手、Agent、文本生成应用、Chatflow 和工作流等工具交互体验的关键。日志管理允许用户查看、修改和标注日志,帮助回顾和优化交互内容。用户可以通过点击👍或👎按钮快速标注满意度,标注后的日志可用于后续优化和分析。标注功能则支持用户对交互内容进行标记和调整,以提升模型输出质量。此外,用户还可以调整界面语言和时区设置,确保在熟悉的环境中操作。这些功能共同作用,显著提升了交互体验和模型性能。

zyx_bx的博客 2710

详解Linux下多进程与多线程通信(一)

多进程和多线程都是多任务处理的方法,它们允许计算机同时执行多个任务。它们在资源分配、通信机制、内存管理等方面有着根本性的区别。多进程指的是操作系统能够同时管理和执行多个进程,每个进程有自己独立的内存空间。这意味着进程之间的通信需要特别的机制,如管道、信号量、共享内存或消息队列等。多进程特点:a.稳定性高:一个进程崩溃通常不会影响其他进程,因为它们的内存空间是隔离的。b.安全性:由于内存是隔离的,所以进程之间的数据不易被未授权访问。

weixin_64581379的博客 1584

海康威视iVMS-4200在银河麒麟系统部署全攻略与疑难排解

在信创国产化进程中,软件兼容性是关键挑战之一。以安防监控领域广泛使用的海康威视iVMS-4200客户端为例,其从Windows环境迁移到银河麒麟等国产操作系统时,面临架构适配、依赖库匹配等核心兼容性问题。这涉及到跨平台软件部署的通用原理:不同CPU架构(如ARM的飞腾、x86的兆芯)和操作系统底层API的差异,要求软件必须进行针对性编译和优化。解决这类问题的技术价值在于保障专业软件在国产化环境中的稳定运行,是信创产业落地的重要环节。具体到应用场景,如在基于银河麒麟V10的安防监控项目中,通过获取对应架构的.

weixin_33423874的博客 1408

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1511

Python 中的多线程与多进程详解

介绍Python多进程和多线程两种并发编程方式的优势和局限性

weixin_59113684的博客 3476

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置)

本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。

weixin_29248653的博客 357

多进程与多线程

多进程是指在操作系统中同时运行多个独立的进程,每个进程都有自己独立的内存空间和系统资源。进程是计算机中执行程序的实体,它包含了程序的代码、数据和执行状态等信息。在多进程编程中,可以将任务分配给不同的进程来并行执行,从而充分利用多核处理器的计算能力。每个进程都有自己的执行环境,它们之间相互独立,互不干扰。多进程之间可以通过进程间通信(IPC)机制来进行数据交换和同步操作。多进程可以提高程序的执行效率,特别适用于执行CPU密集型任务,如图像处理、数据计算、科学计算等。

weixin_39107270的博客 2876

OGG故障指南:OGG-01163 Bad column length (xxx) specified for column

OGG-01163 Bad column length (xxx) specified for column AAA in table OWNER.TABLE, maximum allowable length is yyy

qqqyyy0422的博客 717

卷积神经网络中的自注意力机制(Self-Attention Mechanism)

卷积神经网络中的机制表现为操作,其实现过程与Seq2Seq模型的自注意力机制类似。标准的卷积层是一种局部滤波操作,其输出特征上的任意位置是由对应输入特征的一个邻域构造的,只能捕捉局部特征之间的关系。而自注意力机制通过计算任意两个位置之间的关系直接捕捉远程依赖,而不用局限于相邻点,相当于构造了一个的卷积核,从而可以捕捉更多信息。在卷积网络的自注意力机制中,首先构造输入特征x的键特征fx, 查询特征gx和值特征hx;

AI天才研究院 1497

多进程和多线程

进程线程的定义:进程可以理解为在操作系统中一个运行起来的程序(程序是指令、数据及其组织形式,进程是程序的实体),是操作系统进行资源分配的最小单位。线程是进程中的一个执行流,是操作系统进行系统调度的最小单位,一个进程由一个或多个线程组成。

c_c00000000的博客 1518

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python中的多进程与多线程详解

【代码】Python中的多进程与多线程详解。

Limiiiing的博客 2645

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C/C++】多线程和多进程

C++多线程和多进程

Ace_Spade的博客 1524

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android多线程与多进程通信机制深度解析

2. AsyncTask(已弃用,了解原理) 3. 线程安全的数据结构 4. 协程(Kotlin推荐方式) 三、多进程通信实现方式 1. Binder(Android最核心IPC机制) AIDL接口定义: 服务端实现: 客户端绑定: 2. Messenger(基于Binder的简化封装) 服务端: 3. ContentProvider(跨进程数据共享) 定义Provider: 客户端访问: 4. 文件共享(需同步控制) 5. Socket通信(

斗锋在干嘛的博客 885

多线程多进程

进程(独立执行单元、资源分配的基本单位),线程(进程中的一个执行单元),进程上下文切换。进程间通信:文件、Socket通信、管道、消息队列;线程间通信:事件、条件变量、读写锁。进程创建:fork;线程创建:继承 Thread 类或实现 Runnable 接口。sleep()是Thread类的方法,不释放锁;wait() 是Object类的方法,会释放锁。

qq_53631388的博客 1119
上一篇: Qt绘图核心:彻底搞懂视口(Viewport)坐标原点的“相对原则“
下一篇: 会议系统核心流程详解:创建、加入与消息交互
wh_xia_jun
博客等级 码龄16年 1335粉丝 405原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值