linux服务器网络编程之线程模型

【后端开发】Reactor 模型详解 Reactor模型具有如下优点响应速度快,不必为单个同步事件所阻塞,因为是事件轮询机制可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销扩展性好,可以方便的通过增加Reactor实例个数来充分利用CPU资源复用性好,Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性。... 阅读详情

前言

  本文将主要介绍传统的和目前流行的进程/线程模型,在讲进程/线程模型之前需要先介绍一种设计模式: Reactor 模式。Reactor 模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。如果用图表示的如下:

关于 Reactor 模式不了解的朋友大家可以看看以下几个视频的详细讲解:

手操Reactor设计和线程池实现高并发服务

服务器模型,reactor的5种实现方式

epoll原理剖析以及reactor模型应用

C/C++Linux后台开发免费学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

  不知道读者有没有发现 Reactor 模式跟 IO 模型中的 IO 多路复用模型非常相似 ,在学习网络编程过程中也被这两个概念迷惑了很久。其实在设计模式层面 IO 多路复用也是采用 Reactor 模式的。IO 多路复用模型可以看成是 Reactor 模式在 IO 模型上的应用,而今天我们要讲的是 Reactor 模式在进程/线程模型上的应用。

  在我的看来,进程/线程模型可以分为非 Reactor 模式和 Reactor 模式两种(当然还有 Proactor 模式,这种本文先不讲,因为使用的比较少,而且我也还没搞懂这种模式)。非 Reactor 模式和 Reactor 模式的两种进程/线程模型下具体又分很多种,后面会一一列举。非 Reactor 模式的进程/线程模型是传统的模型,现在已经很少见,放在这里主要是让读者做个了解同时与 Reactor 模式的进程/线程模式做个对比。

非 Reactor 模式的进程/线程模型

  传统模型不使用 IO 多路使用,所以问题比较多。初学者建议看下这部分,如果你觉得被迷糊了或者不感兴趣可以跳过该部分,直接看 Reactor 模式的部分即可。但该部分的第 1、2 点需要了解下。

1、单进程单线程

  描述:这种模型所有的逻辑都在在一个进程中,包括建立连接->Read 连接上的数据->业务处理->Write 回一些数据然后一直循环下去。该模型一次只能处理一个连接,这个在真正的应用中是没有的。初学者在模仿《Unix网络编程卷 I》例子编写网络程序时应该会使用这种模型,当然例子中一般会在 Write 后面多个 Close 连接的动作,以免在处理下一个连接的时候造成前一个句柄泄露。

  优点:代码简单,无需去了解进程、线程的概念,适合学习网络编程的初学者。在不了解进程/线程模型情况下的默认模型。

  缺点:没有任何实用价值。

2、单进程多线程

  描述:进程只做建立连接的动作,每接收一个连接就创建一个线程,在此连接上的读->业务处理->写->关闭连接都在线程中去做,可以采用线程池的方式减少线程的创建和销毁。这种线程模型有一定的应用场景,Tomcat 三种线程模型之 BIO 用的就是这种进程/线程模型。初学者在学习完单进程单线程模型后对线程有所了解即可开始学习该种模型,可以实现一个简单的聊天室程序。

  优点:可以同时与多个 Client 建立连接,接收连接和处理连接业务分开。

  缺点:每个连接占用一个线程,当连接上没有数据的时候造成线程资源浪费,可以建立的连接数比较有限。

3、多进程单线程

  描述:

  (1) 主进程启动时创建监听套接字并监听,然后 fork 出 N 个子进程。

  (2) 由于父子进程的继承性,子进程同时也在端口监听,然后在父进程中关闭监听。

  (3) 父进程负责子进程的创建、销毁、资源回收等,子进程负责连接的建立->Read->业务处理->Write 等。

  由于所有进程都在同一个端口监听,该模型会出现一个比较知名的现象---惊群现象:当有一个连接来临时,所有子进程都会被唤醒,但是最后能与 Client 建立连接的只有一个,造成资源浪费(系通调度也是消耗 CPU 的)。不过 linux 2.6 版本以后已经在内核消除了惊群,当有连接来临只会唤醒一个等待在 accept() 上的进程。即使内核没修复,在应用层也可以用锁的方式防止惊群。

  缺点:这种模型是单进程单线程的进化版本,然而并没有什么卵用。且增加了开发的难度。所以不列出它的优点,介绍这种模型主要是引出惊群的概念,在后面的 Reactor 模型中的多进程情况下也会出现类似的情况。

C/C++Linux后台服务器开发高级架构师学习视频 点击 linux服务器学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。免费学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

Reactor 模式的进程/线程模型

  该模式一般是 Reactor 模型 + IO 多路复用,下面的任何一种模型都具有一定的实用场景。

1、单进程单线程

  描述:只有一个进程,监听套接字和连接套接字上的事件都由 Select 来处理,

  (1) 如果有建立连接的请求过来,Acceptor 负责接受并与之建立连接,同时将连接套接字加入 Select 进行监听;

  (2) 如果某个连接上有读事件则进行 Read->业务处理->Write 等操作;

  (3) 如此循环反复。

  优点:编程简单,对于业务处理不复杂的后台,基本能满足服务器端网络编程。老东家的服务器端程序全是这种模式,主要原因有如下

  (1) 如果一台机器性能不行,那就向集群中新增一台。

  (2) 业务处理并不复杂。

  (3) 扩展成多进程的话,如果不是多核意义不大。

  (4) 如果采用单进程多线程,C++ 处理线程不像 Java 简单,还要考虑并发的问题,收益比不大。

  缺点:会有阻塞,在进行业务处理的时候不能进行其他操作:如建立连接,读取其他套接字上的数据等。

2、单进程多线程

  描述:与单进程单线程类似,不同的是该模型将业务处理放在线程中,进程就不会阻塞在业务处理上。

  优点:比较完美的进程/线程模型,在 Java 实现中复杂度也不高。很多网络库都是基于此,比如 Netty 。

  缺点:待补充。

3、多进程单线程:

  描述:与非 Reactor 模式中的多进程单线程相似,只是本模式在子进程中使用了 IO 多路复用,实用性以下就上来了。大名鼎鼎的 nginx 就采用这种进程/线程模型

  优点:编程相对简单,充分利用多核。能满足高并发,不然 nginx 也不可能采用这种模式。

  缺点:子进程还是会阻塞在业务处理上。

4、多进程多线程

  描述:这里不再画出图形,就是在在子进程上将业务处理交给多线程处理,参考单进程多线程里的线程池那里。

  优点:充分利用多核同时子进程不会阻塞在业务处理上

  缺点:编程复杂。

5、主从进程 +多线程:

  描述:前面几种 Reactor 模式的进程/线程模型中,连接的建立和连接的读写都是在同一进程中。本模型中将连接的建立和连接读写放在不同的进程中。

  (1) 主进程在监听套接字上 Select 阻塞,一旦有请求过来则与之建立连接,并将连接套接字传递给从进程。

  (2) 从进程在连接套接字上 Select 阻塞,一旦连接上有数据过来则进行 Read,并将业务处理通过线程来处理。如果有必要还会向连接 Write 数据。

  优点:连接的建立和连接的读写分开在不同进程中,处理效率会更高。该模型比单进程多线程模式还更优一点,且也可以利用多核。

  缺点:编程复杂。

总结

  以上就是常见的进程/线程模型,使用了 IO 多路复用的线程模型一般都可以称为 Reactor 模型,所以不用纠结 IO 多路复用与 Reactor 模式之间的关系。

Linux后端服务器网络编程之线程模型丨reactor模型详解 前言   上一篇文章《后端服务器网络编程之 IO 模型》中讲到服务器端高性能网络编程的核心在于架构,而架构的核心在于进程/线程模型的选择。本文将主要介绍传统的和目前流行的进程/线程模型,在讲进程/线程模型之前需要先介绍一种设计模式: Reactor 模式,不明白的看这里《Reactor 模式详解》,文中有一句话对 Reactor 模式总结的很好,引用下。 对Reactor 模式还不了解的朋友可以看看这个视频讲解:详解网络编程相关的细节处理丨 reactor模型 Reactor 模式首先是事件驱动的, 阅读详情

相关推荐

同步异步阻塞非阻塞与BIO/NIO/AIO本质解析

I/O模型是高并发系统设计的底层基石,涉及操作系统内核调度、线程资源管理与应用层编程范式。同步与异步关注调用方对结果交付时间的控制权,阻塞与非阻塞则决定线程在等待I/O时是否让出CPU;BIO、NIO、AIO分别代表连接与线程的三种绑定关系:一对一硬绑定、事件驱动多路复用、内核代劳全异步。其技术价值在于精准平衡CPU、内存、上下文切换与延迟之间的工程取舍。典型应用场景包括Web网关、消息中间件、实时通信服务等对吞吐与响应有严苛要求的系统。本文深入Linux内核`epoll`机制与Java NIO缓冲区契约,

dejz8829的专栏 428

一文搞懂Reactor模型与实现

在网络IOReactor模型和Proactor模型。Reactor基于同步IO模式,Proactor基于异步IO模式。Netty网络框架,Redis等中间件中都有使用到Reactor模型。本文将对Reactor模型的如下三种分类进行学习和实现。单Reactor单线程模型;单Reactor多线程模型;主从Reactor多线程模型。Reactor模型主要就是监听事件分发事件和处理事件。其中Reactor角色会负责监听事件和分发事件Handler角色和Acceptor角色会负责处理事件。Reactor。

Java技术攻略的博客 1万+

新年美食鉴赏——基于注意力机制CBAM的美食101分类

新年美食鉴赏——基于注意力机制CBAM的美食101分类一、数据预处理1.数据集介绍2.读取标签3.统一命名4.整理图片路径5.划分训练集与验证集6.定义美食数据集二、注意力机制1.简介2.卷积块注意力网络——CBAM通道注意力模块CAM空间注意力模块SAM3.将通道、空间注意力模块合并三、基于卷积块注意力模块的ResNet-CBAM1.代码实现2.模型测试3.查看网络结构4.模型训练5.模型预测四、总结与升华个人简介 春节是一年当中最隆重、最盛大的节日,吃得最好的一餐可能就是年夜饭了,想想就很激动呢!随着新

zbp_12138的博客 1万+

高性能服务器端java_高性能服务器端网络编程模型

上一篇文章《Java程序员也需要了解的IO模型》中讲到服务器端高性能网络编程的核心在于架构,而架构的核心在于进程-线程模型的选择。本文将主要介绍传统的和目前流行的进程-线程模型,在讲进程-线程程模型之前需要先介绍一种设计模式:Reactor模式,不明白的看这里《设计模式详解》,文中有一句话对 Reactor 模式总结的很好,引用下。Reactor 模式首先是事件驱动的,有一个或多个并发输...

weixin_39959505的博客 213

从零部署DeepSeek V4 Flash:NVIDIA DGX Spark实战指南

GPU加速计算已成为现代人工智能基础设施的核心,其原理是通过并行处理架构大幅提升深度学习模型的训练与推理效率。在AI工程实践中,NVIDIA GPU凭借CUDA生态和专用驱动栈,为大规模语言模型部署提供了硬件基础。本文聚焦于企业级AI服务器部署场景,针对NVIDIA DGX Spark多节点系统的硬件初始化、驱动兼容性配置、容器化部署等关键环节,提供从系统层到应用层的完整解决方案。通过vLLM推理框架的实战配置,演示如何将DeepSeek V4 Flash模型高效部署于多GPU环境,涵盖Tensor Par

weixin_32296621的博客 379

从编解码芯片看Tesla T4的隐藏实力:双NVDEC如何实现70路1080P解码?

本文深入剖析了英伟达Tesla T4显卡的隐藏实力,重点解读其独特的双NVDEC硬件解码器设计如何突破性能瓶颈。通过分析Turing架构、对比HEVC/H.264解码差异,并结合驱动与SDK优化,揭示了实现高达70路1080P视频流并发解码的原理与实战配置,为云游戏、直播转码等高并发场景提供高效解决方案。

weixin_29209801的博客 485

Reactor 线程模型

线程模型 不同的线程模型,对程序段的影响很大,先来看看各个线程模型。 目前存在的线程模型有: 传统阻塞I/O服务模型 Reactor模型 根据 Reactor 的数量和处理资源池线程的数量不同,有3种典型的实现: 单Reactor-单线程 单Reactor-多线程 主从Reactor-多线程 传统阻塞IO服务模型 黄色框表示对象;蓝色框表示线程;灰色框表示方法(API) 模型特点: 采用阻塞IO模式获取输入的数据 每个连接都需要独立的线程完成数据的输入、业务处理、数据返回 问题分析:

weixin_44471490的博客 8144

LD分析实战:基于Plink和R的连锁不平衡计算与可视化全流程

本文详细介绍了基于Plink和R的连锁不平衡(LD)分析全流程,包括基因型数据预处理、LD计算参数设置及结果可视化技巧。通过实战案例解析PLINK文件格式转换、r²值计算关键参数,并展示如何使用ggplot2绘制高质量LD热图,帮助研究人员高效完成基因组关联分析。

weixin_29074295的博客 320

Reactor线程模型

doAccept为主要处理连接接收代码, selector接收到客户端请求, 接收到一个SocketChannel, 将其添加到selecor thread(IO检测线程)中, 其中获取selecor thread时采用迭代器实现轮询(round robin)的效果, 目的将SocketChannel平均分配到selecor thread的队列中。在业务线程BusinessHandler中, 反序列化接收到的数据, 处理业务逻辑, 最终在上下文中写出响应数据。变种reactor线程比例。

沉浸式Study 2049

PubMedBERT:生物医学NLP中的垂直领域预训练实践与性能突破

本文深入探讨了PubMedBERT在生物医学NLP领域的应用与性能突破。作为专为生物医学文本设计的预训练模型,PubMedBERT通过全词掩码策略和BLURB基准测试,显著提升了命名实体识别、关系抽取等任务的准确率。文章还提供了PubMedBERT的实战应用案例和代码示例,展示了其在医学文献检索和电子病历结构化中的卓越表现。

kite3的博客 285

全局特征描述子 CVFH (Clustered Viewpoint Feature Histogram) 原理

特性VFHCVFH处理对象整个物体点云物体点云被分割后的稳定表面块(簇)对遮挡的鲁棒性弱。遮挡会破坏全局形状,导致描述子失效。极强。只依赖于稳定存在的部分。描述子维度263 维308 维 (263 + 45 SC)输出数量一个物体产生1 个描述子一个物体可能产生多个签名计算复杂度相对较低较高(需先聚类)主要应用场景完整、分割良好的物体存在遮挡、背景杂波的不完整物体。

weixin_37079656的博客 619

linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

一、posix 线程概述 我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门

Meditation 1万+

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

perseverance51博客 8833

并发服务器设计(网络编程)

并发服务器设计(网络编程)

m0_73932536的博客 656

【雕爷学编程】Arduino智慧交通之RF24通信实现车队之间的实时通信和协调

通过这些示例,车队领导可以发送指令给车队成员,车队成员可以接收指令并执行相应的操作,同时车队成员也可以发送自己的位置信息给车队领导或其他成员,以实现车队之间的实时通信和协调。例如,在高速公路上,车队中的车辆可以根据前方车辆的速度和位置信息,自动调整自身的速度和距离,以保持车队的整体稳定和安全。Arduino智慧交通系统利用RF24通信模块实现车队之间的实时通信和协调,通过无线通信技术,车辆之间可以实时传输数据和指令,以实现车队的协同行驶和交通优化。通过数据处理和分析,可以生成实时的交通信息和统计数据。

雕爷学编程 1075

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Linux】socket网络编程之TCP

TCP网络编程,有启动服务器的多种版本,一篇详细学习

s_little_monster的博客 8676

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【笔记】互联网架构之Netty4.X

7-5 Netty案例实战之LineBasedFrameDecoder解决TCP半包读写。5-5 Netty核心模块指ChannelHandlerContext模块讲解。3-2 (BAT面试核心知识)Linux网络编程中的五种IO模型讲解上。3-3 (BAT面试核心知识)Linux网络编程中的五种IO模型讲解下。2-2 BIO网络编程实战之编写BioClient客服端。4-2 Netty实战之Echo服务-服务端程序编写实战。4-3 Netty实战之Echo服务-客户端程序编写实战。

ladymorgana的博客 572

muduo网络库1

select实现多路复用的方式是,将已经连接的socket都放到一个文件描述符集合中,然后调用select函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生,检查的方式很粗暴,就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此socket标记为可读或可写,接着再把整个文件描述符集合拷贝回用户态,然后用户态还需要再通过遍历的方法找到可读或可写的socket,然后对其处理。因此,基于select模型的服务器程序,要达到100万级别的并发访问,是一个很难完成的任务。

m0_73839343的博客 842

【Linux网络编程】高并发服务器编程 -- Reactor模式与Proactor模式

【Linux网络编程】高并发服务器编程 -- Reactor模式与Proactor模式 【1】Reactor 模式 Reactor 模式构成示意图 EventHandler 抽象类表示 IO 事件处理器,它拥有 IO 文件句柄 Handle(通过get_handle获取),以及对 Handle 的操作handle_event(读/写等)方法; Concrete EventHand...

CopperSun 技术博客 1573

多线程服务器

陈硕

floweronwarmbed的专栏 3044

c10k问题

所谓c10k问题,指的是:服务器如何支持10k个并发连接,也就是concurrent 10000 connection(这也是c10k这个名字的由来)。由于硬件成本的大幅度降低和硬件技术的进步,如果一台服务器能够同时服务更多的客户端,那么也就意味着服务每一个客户端的成本大幅度降低。从这个角度来看,c10k问题显得非常有意义。 一、C10K问题由来 互联网的基础是网络通信,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多,一台服务器同时在线100个用户,在当时已经算是大型应用了,所以并不存在

weixin_44705391的博客 528

游戏服务器开发校招笔试:核心考点与实战解析

网络并发、内存模型、数据一致性是后端开发的核心基础,尤其在游戏服务器这类高并发、长连接场景下,TCP/IP协议细节、多线程安全、C++内存管理直接影响系统稳定性。游戏服务器与Web后端不同,需处理粘包拆包、锁竞争、状态同步等工程问题。本文以网易经典校招笔试卷为线索,系统梳理操作系统、网络编程、算法与系统设计等高频考点,解析技术原理与项目实践中的真实坑点,帮助开发者构建从底层原理到高并发架构的完整知识体系,高效备考游戏后端岗位。

weixin_30972263的博客 286

高性能网络编程(一)----accept建立连接

最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。 编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目

陶辉:聚焦分布式系统的程序员 6万+

多线程服务器的常用编程模型

多线程服务器的常用编程模型     陈硕 (giantchen_AT_gmail) Blog.youkuaiyun.com/Solstice 2009 Feb 12   建议阅读本文 PDF 版下载: http://files.cppblog.com/Solstice/multithreaded_server.pdf   本文主要讲我个人在多线程开发方面的一些粗浅经验。总结了一两种常用的

yinchuofan1985的专栏 831

高性能网络编程(六):一文读懂高性能网络编程中的线程模型

1、前言 本文接上篇《高性能网络编程(五):一文读懂高性能网络编程中的I/O模型》。随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力。本文(和上篇《高性能网络编程(五):一文读懂高性能网络编程中的I/O模型》)旨在为大家提供有用的高性能网络编程的I/O模型概览以及网络服务进程模型的比较,以揭开设计和实现高性能网络架构的神秘面纱。另外,作者的另一篇《新手入门:目前...

lxt_tiger的专栏 780
上一篇: C++高性能服务器框架——日志系统详解
下一篇: 腾讯跟阿里两位王者之间的对比
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值