7种常见网络并发模型介绍

news2024/10/5 13:47:06

概述

对于网络服务器后端开发,为满足不同并发场景的需要,一般来说,不外乎几种常见的并发模型,除了一些教学场景常用的单线程、多进程(线程)的服务器实现外,生产用的服务器,一般都会考虑使用IO多路复用模型。

而常见的IO多路复用场景 ,可以设计得很简单,也可以设计得比较复杂,一般根据业务需要而定。本文总结了一些比较常见的服务器并发模型,基本涵盖了 大部分业务场景 。在实际业务开发的技术选型时,可根据场景,选取一款稳定、可靠的网络模型,还是十分关键的。

模型一: 单线程Accept(无IO复用 )

在这里插入图片描述

模型分析

  • 主线程main thread执行阻塞accept, 每次客户端connect连接过来,main thread中accept响应并建立连接
  • 创建连接成功,得到connect fd套接字后,依然在main thread串行处理套接字读写,并处理业务
  • 在处理业务时,如果有新客户端connect过来,server无响应,直到当前socket全部业务处理完毕(结束while循环)
  • 当前客户端处理完毕之后,关闭连接,处理下一个客户端请求

优缺点

优点

  • socket编程流程清晰且简单,适合学习使用,了解socket基本编程流程

缺点

  • 该模型并非并发模型 ,是串行服务器,同一时刻,监听并响应的最大网络请求量为1, 即并发量为1

  • 仅适学习基本socket编程,不适合任何服务器server构建

模型二: 单线程 Accept + 多线程读写业务(无 IO 复用)

在这里插入图片描述

模型分析

  • 主线程main thread阻塞在accept, 每次客户端 connect连接过来,main thread中accept响应并建立连接
  • 创建连接成功,得到connect fd套接字后,创建一个新的线程thread来处理客户端的读写业务,mian thread依然回到accept阻塞等待新客户端
  • thread通过套接字connect fd与客户端进行读写操作
  • server在处理业务时,如果有新的客户端连接过来,main thread中accept依然可以响应并建立连接,重复上述过程

优缺点

优点

  • 基于模型1的优化,支持了并发的特性
  • 使用比较灵活,一个客户端对应一个线程单独处理,server处理业务的内聚性比较高, 客户端无论如何读写 ,服务端 均会有一个 线程做资源响应

缺点

  • 随着客户端梳理增多,需要开辟的线程数量也增加了,和server线程的数量是1:1的关系,因此对于高并发场景,线程数量受到硬件的瓶颈,线程过多也会 增加CPU的切换成本,降低CPU利用率
  • 对于长连接,客户端一旦无业务读写,只要不关闭,server就应该对保持这个连接的状态(心跳检查,健康检查机制),占用连接资源和线程的开销
  • 仅适合客户端数量不大的场景,且可控的场景来使用
  • 该模型仅适合学习基本的socket编程,不适合做并发服务器

模型三: 单线程多路IO复用

在这里插入图片描述

模型分析

  • 主线程main thread创建listen fd之后,采用多路IO复用机制(如select、epoll)进行IO状态阻塞监控,有client连接请求,IO 复用机制检测到listen fd触发读事件,则进行accept建立连接,并将新生成的connect fd加入到监听IO集合中
  • client再次进行正常读写业务请求,main thread的多路IO复用机制阻塞返回,会触发该套接字 的读写事件等
  • 对于client的读写业务,server依然在main thread执行流程继续执行 ,此时如果有新的客户端connect请求过来,server将没有即时响应
  • 等到server处理完一个连接的读写操作,继续回到多路IO复用机制阻塞,其他连接过来才可以正常执行

优缺点

优点

  • 单流程体解决了可以同时监听多个客户端读写状态模型,不需要1:1客户端的线程数量关系
  • 多路IO复用机制 是阻塞的,非忙轮询的状态,不会浪费CPU资源,对CPU的利用率较高
  • 对于连接数较多,但是并发不大的场景,或对实时性没有特别严格的场景,该模型已经足够使用

缺点

  • 虽然可以监听读个客户端的读写状态,但是同一时间内,只能够处理一个客户端的读写操作,实际上读写业务并发为1
  • 当多个客户端访问server,业务是串行执行,大量请求的会有排队延迟现象。

模型四:单线程多路IO复用 + 多线程读写业务 (业务工作池)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jEzEboN-1683502674351)(常见IO多路复用并发 模型介绍.assets/image-20230507101910587.png)]

模型分析

  • 主线程main thread 创建listen fd后,采用多路IO复用机制(如select、epoll)进行IO状态阻塞监控,有client客户端connect请求 ,IO复用机制检测到listenfd触发读事件,则进行accept建立连接,并将新生成的connect fd加入到监听IO集合中
  • 当connect fd有 可读消息,触发读时间,并进行读写消息
  • main thread按照固定协议读取消息,并且交给worker pool工作线程池,工作线程池在server启动之前就已经开启固定数量的thread,里面的线程只处理消息 业务,不进行套接字读写操作
  • 工作池处理完业务,触发connect fd写事件,将回执客户端的消息通过main thread写给对方
  • 即:main thread只处理IO阻塞监听以及具体的读写操作,读写到的数据交给具体的线程池处理,让main thread专注于处理IO事件
  • 类似于Redis的处理机制

优缺点

优点

  • 将业务处理的部分,通过工作池分离出来,能够减少客户端访问server导致业务串行执行会有大量请求排队的延迟时间
  • 实际上读写的业务并发为1,但是业务流程的并发为线程池数量,加快了业务处理的并行效率

缺点

  • 读写依然是main thread单独处理,最高的读写并行通道依然是1
  • 虽然多个worker thread处理业务,最后返回给client依旧也需要排队,因为出口还是main thread的一个通道

模型五:单线程IO复用 + 多线程IO复用

在这里插入图片描述

模型分析

  • server在 启动监听前,开辟固定数量 (N)的 线程,用thread poll线程池管理

  • 主线程main thread创建listen fd之后,采用IO多路复用机制(如select、epoll)进行IO状态阻塞监控 ,有 client 连接请求,IO复用机制 检测到listen fd触发读事件,则进行accept建立连接 ,并将新生成的connect fd分发给thread pool中的某个线程进行监听

  • thread pool中的每个thread都启动IO多路复用机制 ,用来监听main thread建立成功并且分发下来的connect fd的读写事件,处理对应的读写业务,并将处理完的结果通过该thread自己的IO多路复用机制回执给客户端

优缺点

优点

  • 将之前的main thread单流程的读写,分散到多线程来完成,这样就增加了同一时刻 读写的并行通道,并行通道的数量N,N 就是线程池的数量
  • server同时监听connect fd的数量,几乎是成倍增加,之前的全部监控数量取决于main thread的多路IO复用机制的最大限制,所以理论上单点server最高响应并发数量应该是之前的N倍(N是 线程池数量,建议线程数量和 CPU核心数1:1)
  • 如果良好的 线程池数量可CPU核心数适配,那么可以尝试将CPU 与thread绑定,从而降低CPU的切换频率,提高每个thread处理合理业务的效率,降低CPU的切换成本
  • memchached的并发模型与该模型比较类似

缺点

  • 虽然监听的并发数量提升,但是最高的读写并行通道依然为N,并且多个身处于同一个thread的客户端,会出现读写排队现象,实际上每个thread模型与单线程IO多路复用机制是一致的

模型六: 单进程IO 复用 + 多进程IO复用

在这里插入图片描述

模型分析

  • 与单线程IO复用+ 多线程IO 复用(线程池)无太大差异

  • 不同点

    • 进程和线程的内存布局不同,导致main process(主进程)不再进行accept操作,而是将accept过分散到各个子进程中

    • 进程的特性,资源独立,所以main process如果accept成功的fd,其他进程无法资源共享,所以需要各个进程自行accept创建连接

    • main process 只是监听listen fd的状态,一旦触发读事件(有新连接请求),通过一些IPC (进程间通信,如信号、共享内存、管道等),让各自子进程process竞争accpet完成连接建立,并各自监听

优缺点

  • 与单线程IO复用+ 多线程IO 复用(线程池)无太大差异
  • 不同点:
    • 多进程内存资源空间占用稍微大一些
    • 多进程模型安全稳定性较强,这也是各自进程互不干扰的特点导致
    • 实际上每个子进程process都是一个单线程IO多路复用模型

模型七: 单线程IO复用+ 多线程IO复用+ 多线程

在这里插入图片描述

模型分析

  • server在启动监听之前,开辟固定数量(N)的线程,用thread pool线程池管理
  • 主线程main thread创建listen fd之后,采用IO多路复用机制(如select、epoll)进行IO状态阻塞监控 ,有 client 连接请求,IO复用机制 检测到listen fd触发读事件,则进行accept建立连接 ,并将新生成的connect fd分发给thread pool中的某个线程进行监听
  • thread pool中的每个thread都启动IO多路复用机制 ,用来监听main thread建立成功并且分发下来的connect fd的读写事件,一旦有某个connect fd的读写事件被触发,立即开辟一个新的 线程开处理IO读写业务
  • 当某个线程处理完当前的读写业务,如果当前connect fd没有被关闭,那么将当前fd重新加回到thread pool的IO复用集合,并将自身线程销毁

优缺点

优点

  • 除了能够保证同时响应最高的并发数,又能够解决读写并行通道的局限问题
  • 同一时刻读写并行通道,达到最大化极限,一个客户端可以对应一个单独的执行流程处理读写业务

缺点

  • 该模型过于理想化,要求CPU核心数足够大
  • 如果硬件CPU数量有限,那么该模型就造成大量CPU切换的成本浪费。
  • 实际开发中,几乎用不到如此复杂的网络模型,当前流行的开源网络组件中,也没有哪一款软件做到了如此复杂的程度

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对C/C++课程感兴趣的读者,可以点击链接,查看详细的服务:C/C++Linux服务器开发/高级架构师

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多路IO复用:epoll

1. epoll epoll是为克服select、poll每次监听都需要在用户、内核空间反复拷贝&#xff0c;以及需要用户程序自己遍历发现有变化的文件描述符的缺点的多路IO复用技术。 epoll原理 创建内核空间的红黑树&#xff1b; 将需要监听的文件描述符上树&#xff1b; 内核监听红黑树上…

实验室设备管理系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 应用背景 为方便实验室进行设备管理&#xff0c;某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录&#xff0c;查看现有的所有设备&#xff0c; 增加设备等功能。 开发环境 Mac OS PyCha…

JAVA:Springboot 装配数据库Hikari和Druid连接池

1、JDBC Java数据库连接&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。 JDBC API主要位于JDK中的java.sql包中&#xff08;之后…

出现小红书点赞多粉丝少的情况,原因在哪里

刚开始运营自己账号的小伙伴们有时发现明明笔记点赞数量不少&#xff0c;但偏偏账号粉丝数量就是一直不怎么涨&#xff0c;像这样小红书点赞多粉丝少是怎么回事呢?今天就来说说&#xff0c;小红书该如何吸引用户关注。 一、小红书点赞多粉丝少是怎么回事 一般来说&#xff0c;…

从MIMIC学习组织自己的数据

从MIMIC学习组织自己的数据 相对于SEER数据库&#xff08;我们得到的是几乎可以直接进行分析的数据&#xff09;&#xff0c;MIMIC 数据库在数据采集后虽然经过了一定的处理&#xff0c;但是保留了数据库原始的样貌&#xff0c;所以我们除了对MIMIC数据进行分析外&#xff0c;…

推荐算法之DeepFM

论文&#xff1a;DeepFM: A Factorization-Machine based Neural Network for CTR Prediction Github&#xff1a;https://github.com/ChenglongChen/tensorflow-DeepFM https://github.com/shenweichen/DeepCTR IJCAI2017 本文将深度神经网络dnn和因式分解机Factorization-M…

程序中各种异常报错,对于JVM调优记录

一&#xff1a;GC overhead limit exceeded 数据量过大&#xff1a;当应用程序处理大量的数据时&#xff0c;会占用大量的内存和计算资源。如果内存资源不足&#xff0c;则可能会在垃圾回收过程中出现 GC overhead limit exceeded 错误 程序代码有问题&#xff1a;如果 应用程…

Vmware虚拟机问题解决方案

Vmware虚拟机问题解决方案 1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安…

商用密码产品认证中的随机数(一)

1 商密认证中的随机数介绍 如果说密钥的安全是密码产品的基石&#xff0c;那随机数的安全就是密钥安全的基石。密码产品设计和商用密码产品认证中&#xff0c;随机数的合规性也是需要重点关注的环节。 随机数的合规性主要包括&#xff1a; 随机数的来源合规。如果是自行设计的…

一点通路由模拟实验8

首先先设置hostA和hostB和hostC的ip 其次设置路由接口的各个ip 路由A 像这样的&#xff0c;再设置路由B 唯一要记住的是&#xff0c;时钟只要设置一个就行 就是clock rate 6400&#xff0c;之后开启路由&#xff1a;ip routing 然后就是查看路由表了&#xff08;路由A&#…

Lecture 12(Preparation):Reinforcement Learning

目录 What is RL? (Three steps in ML) Policy Gradient Actor-Critic Reward Shaping No Reward: Learning from Demonstration It is challenging to label data in some tasks. 例如下围棋时&#xff0c;下一步下在哪个位置最好是不太好确定的&#xff0c;此时可以考虑…

无线传感器网络路由优化中的能量均衡LEACH改进算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 由于簇的规模和簇头选择对WSN总能耗影响较大&#xff1a;一方面&#xff0c;当簇的规模较小时&#xff0c;易导致WSN能量消耗不…

2021年NOC大赛编程马拉松赛道图形化中高组模拟卷,包含答案

目录 单选题: 判断题: 下载文档打印做题: 2021年NOC大赛编程马拉松赛道图形化中高组模拟卷 单选题: 1.雪球不小心误入了图灵学院旁边山林中的一个洞穴,一直都没有出来,禾木、桃子和小核桃打算进去找她,洞穴里漆黑一片,三人走着走着,不知怎么也走散了。如下图所示,…

加速开放计算产业化,OCTC五大原则瞄准需求痛点

回顾计算产业过去十余载的历程&#xff0c;开放计算始终是一个绕不开的核心焦点。 始于2011年Facebook发起的数据中心硬件开源项目--开放计算项目&#xff08;简称&#xff1a;OCP&#xff09;&#xff0c;开放计算犹如星星之火&#xff0c;不仅迅速形成燎原之势&#xff0c;更…

windows安装GO语言环境

GO语言版本 Windows 平台和 Mac 平台推荐下载可执行文件版&#xff0c;Linux 平台下载压缩文件版。 版本&#xff1a;1.16.8 出现上面这个界面就说明已经安装好了 查看GO版本 可以打开终端窗口&#xff0c;输入go version命令&#xff0c;查看安装的 Go 版本 C:\Users\8617…

python数据可视化开发(5):webAPI百度地图轻量驾车路线规划距离与直线距离计算

webAPI百度地图轻量驾车路线规划规划 一、驾车路线规划说明1.接口说明API服务地址请求参数返回参数 二、python核心代码1.轻量路线规划代码封装2.批量读取起始点信息 三、直线距离计算 轻量级路线规划服务&#xff08;又名DirectionLite API &#xff09;是一套REST风格的Web服…

带你玩转数据结构-单链表(适合初学者的文章,讲解的很仔细哦)

前言: &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解数据结构中链表的知识,;链表的分类,c语言实现单链…

界面控件Telerik UI for WinForms使用指南 - 数据绑定 填充(二)

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件&#xff0c;所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 Telerik UI for WinForms组件为可视化任何类…

使用【SD-WEBUI】插件生成同一张图包含多个人物:分区域的提示词

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;潜变量成对&#xff08;Latent Couple&#xff09;&#xff08;1.1&#xff09;可自组LoRA&#xff08;Composable LoRA&#xff09; &#xff08;二&#xff09;分区扩散&#xff08;Multi Diffusion&#…

测试用例常见设计方法

1.基于需求的设计方法 主要从以下方面进行思考&#xff1a; 2.等价类法 将输入的数据等价划分成几个类&#xff0c;从每个类里面选出一个测试用例&#xff0c;如果这个测试用例通过&#xff0c;说明这一个类的测试用例都通过 有效等价类&#xff1a;满足输入数据要求的类 无…