百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

C++后台开发—网络IO模型与Reactor模式

lipiwang 2024-11-26 06:04 7 浏览 0 评论

一、三种网络IO模型:

分类:

  1. BIO 同步的、阻塞式 IO
  2. NIO 同步的、非阻塞式 IO
  3. AIO 异步非阻塞式 IO

推荐视频:

C/C++ Linux后台服务器开发高级架构师免费学习链接:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

epoll原理剖析以及reactor模型应用:「链接」

linux epoll网络编程细节处理:「链接」

阻塞和同步的概念:

  1. 阻塞:若读写未完成,调用读写的线程一直等待
  2. 非阻塞:若读写未完成,调用读写的线程不用等待,可以处理其他工作
  3. 异步:读写过程完全托管给操作系统完成,操作系统完成后通知调用读写的线程
  4. 同步:读写过程由本线程完成,期间可以处理其他工作,但要轮询读写是否完毕

BIO 虽然可以使用线程池+等待队列进行优化,避免使用过多的线程,但是依然无法解决线程利用率低的问题。

数据通过通道 Channel 传输,往Channel中读写数据需要先经过缓冲区Buffer

NIO为每个客户端连接分配Channel和Buffer,并注册到多路复用器 Selector上,Selector通过轮询,找到有IO活动的连接进行处理,这种处理模式称为Reactor模式

若当前通道无可用数据,线程不会阻塞,而是可以处理其他通道的读写

这样 降低了线程的需求量,提高了线程的利用率 实现了IO 多路复用

IO 多路复用的定义:单个线程 管理多个IO流

二、Reactor模式

Reactor模式基本原理是

1)Reactor:Reactor 在一个单独的线程中运行,负责监听和分发多个客户端的事件,分发给适当的handler线程来对 IO 事件做出反应。

2)Handlers:处理线程 会执行处理方法来 响应 I/O 事件

Reactor 模式就是实现网络 IO 程序高并发特性的关键。

它又可以分为单 Reactor 单线程模式、单 Reactor 多线程模式、主从 Reactor 多线程模式。

这种模式的基本工作流程为:

1)Reactor 通过 select 监听客户端请求事件,收到事件之后通过 dispatch 进行分发

2)若事件是建立连接的请求,则由 Acceptor 通过 accept 处理连接请求,然后创建一个 Handler 对象处理连接建立后的后续业务。

3)若不是建立连接的请求,则分发给此连接对应的 Handler 处理。

4)Handler 会完成 read-->业务处理-->send 的完整处理流程。

简单来说就是:一个线程 处理多个连接的请求、分发、read,send、业务处理 操作

优点是:模型简单,没有多线程、进程通信、竞争的问题,一个线程完成所有的事件响应和业务处理。

文章福利:现在C++程序员面临的竞争压力越来越大。那么,作为一名C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路,技术要做到知其然还要知其所以然。以下视频获取点击:正在跳转

如果想学习C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx源码分析Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux内核,P2P,K8S,Docker,TCP/IP,协程,DPDK的朋友可以看一下这个学习地址C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

缺点是:

1)存在性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈。

2)存在可靠性问题,若线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。

使用场景为:客户端的数量有限,业务处理非常快速,比如 Redis // 在业务处理的时间复杂度为 O(1)的情况。

单 Reactor 多线程模式 使用了

一个Reactor主线程 处理 多个客户端的 监听 连接 分发 read和send

多个Worker线程 处理多个客户端的业务

这种模式的优点是可以充分的利用多核 CPU的处理能力,

缺点是多线程数据共享和控制比较复杂,Reactor 处理所有的事件的监听和响应,在单线程中运行,面对高并发场景还是容易出现性能瓶颈。

主从 Reactor 多线程模式 使用了

一个Reactor主线程 处理 多个客户端的监听,连接,分发

多个Reactor子线程处理多个客户端的 read和send

多个Worker线程 处理多个客户端的业务

MainReactor 只负责监听客户端连接请求,和客户端建立连接之后将连接交由 SubReactor 监听后面的 IO 事件。

这种模式的优点是:

1)MainReactor 线程与 SubReactor 线程职责明确,MainReactor 线程只需要接收新连接,SubReactor 线程完成后续的业务处理。

2)交互简单, MainReactor 线程只需要把新连接传给 SubReactor 线程,由SubReactor 返回数据给客户端

3)多个 SubReactor 线程能够应对更高的并发请求。

这种模式的缺点是编程复杂度较高。但是由于其优点明显,在许多项目中被广泛使用,包括 Nginx、Memcached、Netty 等。

这种模式也被叫做服务器的 1+M+N 线程模式,即使用该模式开发的服务器包含一个(或多个,1 只是表示相对较少)连接建立线程+M 个 IO 线程+N 个业务处理线程。这是业界成熟的服务器程序设计模式。

相关推荐

linux实例之设置时区的方式有哪些

linux系统下的时间管理是一个复杂但精细的功能,而时区又是时间管理非常重要的一个辅助功能。时区解决了本地时间和UTC时间的差异,从而确保了linux系统下时间戳和时间的准确性和一致性。比如文件的时间...

Linux set命令用法(linux cp命令的用法)

Linux中的set命令用于设置或显示系统环境变量。1.设置环境变量:-setVAR=value:设置环境变量VAR的值为value。-exportVAR:将已设置的环境变量VAR导出,使其...

python环境怎么搭建?小白看完就会!简简单单

很多小伙伴安装了python不会搭建环境,看完这个你就会了Python可应用于多平台包括Linux和MacOSX。你可以通过终端窗口输入"python"命令来查看本地是否...

Linux环境下如何设置多个交叉编译工具链?

常见的Linux操作系统都可以通过包管理器安装交叉编译工具链,比如Ubuntu环境下使用如下命令安装gcc交叉编译器:sudoapt-getinstallgcc-arm-linux-gnueab...

JMeter环境变量配置技巧与注意事项

通过给JMeter配置环境变量,可以快捷的打开JMeter:打开终端。执行jmeter。配置环境变量的方法如下。Mac和Linux系统在~/.bashrc中加如下内容:export...

C/C++|头文件、源文件分开写的源起及作用

1C/C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称...

linux中内部变量,环境变量,用户变量的区别

unixshell的变量分类在Shell中有三种变量:内部变量,环境变量,用户变量。内部变量:系统提供,不用定义,不能修改环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环...

在Linux中输入一行命令后究竟发生了什么?

Linux,这个开源的操作系统巨人,以其强大的命令行界面而闻名。无论你是初学者还是经验丰富的系统管理员,理解在Linux终端输入一条命令并按下回车后发生的事情,都是掌握Linux核心的关键。从表面上看...

Nodejs安装、配置与快速入门(node. js安装)

Nodejs是现代JavaScript语言产生革命性变化的一个主要框架,它使得JavaScript从一门浏览器语言成为可以在服务器端运行、开发各种各样应用的通用语言。在不同的平台下,Nodejs的安装...

Ollama使用指南【超全版】(olaplex使用方法图解)

一、Ollama快速入门Ollama是一个用于在本地运行大型语言模型的工具,下面将介绍如何在不同操作系统上安装和使用Ollama。官网:https://ollama.comGithub:http...

linux移植(linux移植lvgl)

1uboot移植l移植linux之前需要先移植一个bootlader代码,主要用于启动linux内核,lLinux系统包括u-boot、内核、根文件系统(rootfs)l引导程序的主要作用将...

Linux日常小技巧参数优化(linux参数调优)

Linux系统参数优化可以让系统更加稳定、高效、安全,提高系统的性能和使用体验。下面列出一些常见的Linux系统参数优化示例,包括修改默认配置、网络等多方面。1.修改默认配置1.1修改默认编辑器默...

Linux系统编程—条件变量(linux 条件变量开销)

条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等...

面试题-Linux系统优化进阶学习(linux系统的优化)

一.基础必备优化:1.关闭SElinux2.FirewalldCenetOS7Iptables(C6)安全组(阿里云)3.网络管理服务||NetworkManager|network...

嵌入式Linux开发教程:Linux Shell

本章重点介绍Linux的常用操作和命令。在介绍命令之前,先对Linux的Shell进行了简单介绍,然后按照大多数用户的使用习惯,对各种操作和相关命令进行了分类介绍。对相关命令的介绍都力求通俗易懂,都给...

取消回复欢迎 发表评论: