Linux服务器——进程/线程池

进程/线程池

动态创建子进程/线程的缺点:

  • 比较耗时,这将导致较慢的客户响应;
  • 动态创建的子进程/线程通常只是用来为一个客户服务,这将导致系统上产生大量的细微进程/线程。进程/线程之间的切换将消耗大量 CPU 时间;
  • 动态创建的子进程是当前进程的完整映像。当前进程必须谨慎地管理其分配地文件描述符和堆内存等系统资源,否则子进程可能复制这些资源,从而使系统的可用资源急剧下降,进而影响服务器的性能;

1. 进程/线程池概述

以进程池为例,若无特殊说明,下面对进程池的讨论完全适用于线程池。

进程池中的所有子进程都运行着相同的代码,并具有相同的属性,比如优先级、PGID 等。因为进程池在服务器启动之初就创建好了,所以每个子进程都相对干净。

主进程选择哪个子进程来为新任务服务的方式:

  1. 主进程使用某种算法来主动选择子进程。
  2. 主进程和所有子进程通过一个共享的工作队列来同步,子进程都睡眠在该工作队列上。

当选择好子进程后,主进程还需要使用某种通知机制来告诉目标子进程有新任务需要处理,并传递必要的数据:

  1. 在父进程和子进程之间预先建立好一条管道,然后通过该管道来实现所有的进程间通信;
  2. 在父线程和子线程之间传递数据就比较方便,可以把这些数据定义为全局的;

2. 处理多客户

  • 半同步/半反应堆模式:由主进程统一管理监听 socket 和连接 socket 的;
  • 高效的半同步/半异步模式、领导者/追随者模式:由主进程管理所有监听 socket,而各个子进程分别管理属于自己的连接 socket 的(调用 accept())。

考虑到常连接的问题,即一个客户的多次请求可以复用一个 TCP 连接。那么设计进程池时还需要考虑:一个客户连接上的所有任务是否始终由一个子进程来处理。

  1. 如果说客户任务是无状态的,可以考虑使用不同的子进程来处理;
  2. 如果说客户任务是存在上下文关系,则最好一直用同一个子进程来处理;

注:使用 epoll 的 EPOLLONESHOT 事件,确保一个客户连接在整个生命周期中仅被一个线程处理。

相关推荐
开心大爆炸3 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
oushaojun23 小时前
大厂 C++ 面试:深度剖析 Linux Signal 信号机制(转)
linux
苏生Susheng4 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
曹牧4 小时前
C#:文本文件读取
服务器·前端·c#
Ruiery4 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
分支预测失败4 小时前
RISC-V AIA 中断架构实战:从 PLIC 到 APLIC 与 IMSIC 的迁移
linux·后端
GeW4 小时前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux
snow@li5 小时前
服务器运维:Alibaba Cloud Linux 4 LTS 64位 根目录全景深度解析文章
linux·运维·服务器
苏生Susheng5 小时前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
额额额对了5 小时前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议