操作系统-深入理解IO模型与Reactor、Proactor模式

C++高性能跨平台网络编程实战:从IO模型到Boost.Asio应用 网络编程是构建分布式系统的基石,其核心在于高效管理海量并发连接与数据传输。从原理层面看,IO模型决定了程序处理网络请求的基本方式,其中IO多路复用技术通过单线程监控多个连接,显著提升了资源利用率。在技术价值上,高性能网络框架能够支撑游戏服务器、金融交易等低延迟、高吞吐场景。应用层协议设计(如长度前缀格式)与缓冲区优化(如零拷贝技术)是保障通信效率的关键实践。本文聚焦于C++领域,探讨如何利用Boost.Asio等现代库实现跨平台高性能网络服务,涵盖Reactor/Proactor模式选型、连接生命周期管理及 阅读详情

本文总结了Linux I/O模型、Proactor和Reactor模型等相关概念与核心流程,参考自相关教学资源和网络博客,并附上自身理解。如有遗漏或错误,还望海涵并指出。谢谢!

一.基本概念

1.用户空间与内核空间

Linux内核给每个进程都提供了一个独立的虚拟空间,并且这个地址空间是连续的,进程就可以通过这个地址空间很方便地访问虚拟内存。

用户进程所能访问到的地址空间被称为用户空间,而被Linux内核系统调用或使用的地址被称为内核空间。

一个32位的Linux系统,其地址空间为2的32次方,即为4GB;而64位的Linux系统,其寻址空间为2的48次方,即256TB。

其中,32位系统将低位的3GB用于充当用户空间,高位1GB用于充当内核空间;64位系统将低位128TB充当用户空间,中间的2的16次方充当空洞,不会使用,而高128TB充当内核空间。

在这里插入图片描述

一般虚拟内存空间还可划分为一下几个区域:

  • 只读段: 代码和常量
  • 数据段:全局变量
  • 堆:动态分配内存,从低地址开始向上增长
  • 文件映射段: 动态库、共享内存
  • 栈: 局部变量,函数调用的上下文,栈大小一般固定是8MB
2.进程切换与进程阻塞

1.进程切换

进程由CPU来进行调度和分配,通常可以有时间片轮转、优先级队列、多级反馈队列等方式来进行调度,在一个进程运行的过程中,内核有能力挂起进程(通常将进程控制块等数据换入磁盘,需要时再换出),在需要的时候在将其重新调用,这个过程被称为进程切换。进程切换通常需要以下过程:

  1. 保存要切换的进程上下文,包括程序计数器和一些寄存器
  2. 更新PCB信息
  3. 把进程的PCB移入相应的队列,如就绪或阻塞队列
  4. 选择另一个进程执行,并更新其PCB
  5. 更新内存管理的数据结构
  6. 如果要换回原先的进程,则重复1~5这个过程

由于进程切换需要进行许多的步骤与操作,所以这是一个很消耗CPU资源的过程。

2.进程阻塞

进程阻塞指的是进程由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。

进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU时间片),才可能将其转为阻塞状态。当进程进入阻塞状态,不占用CPU资源。

3.文件描述符

文件描述符(File Descriptor,fd)是一个用于表述指向文件的引用的抽象化概念,实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。进程就可以通过文件描述符表(fd_set)来找到所需的文件。

在这里插入图片描述

4.Buffer I/O过程

一般Linux系统的I/O过程都是具有缓冲区(Buffer)支持的,以减少读取的次数和提升读取效率。

在进程请求读取数据时(例如请求读取Socket连接数据),内核会将数据先拷贝到内核缓冲区(Kernel Buffer)中,当缓冲区被打满后,会将其拷贝到相应进程的地址空间。

在这里插入图片描述

二.Linux I/O模型

由于Linux存在Buffer I/O的过程,需要将数据拷贝到内核缓冲区,然后再拷贝到相映的进程地址空间中,所以这个拷贝的过程存在的多样性就构成了Linux的I/O模型的多样性,这也是IO模型存在的基本原因。

我们可以将数据获取的过程分为两个阶段:

1.数据准备阶段(打满内核缓冲区)

2.内核数据复制到进程用户空间

Linux系统由此产生了五种网络模式的方案。

  • 阻塞 I/O(Blocking IO)
  • 非阻塞 I/O(Nonblocking IO)
  • I/O 多路复用( IO Multiplexing)
  • 信号驱动 I/O( Signal Driven IO)
  • 异步 I/O(Asynchronous IO)

下面来简单地看看每一种网络模型的工作过程:

1.阻塞I/O

在这里插入图片描述

在阻塞I/O中,应用进程相内核发出接收调用(recvfrom),内核会在数据缓存区打满后,将数据拷贝到用户进程空间,然后返回一个成功的标示,应用进程获取到数据。

在上述过程中,发起recvfrom的应用进程是完全阻塞在该条请求链路中的,直到内核将数据准备好返回给它。

所以可以看出,阻塞I/O有性能上的不足,一个进程在一段时间内都需要阻塞在一条请求链路之中,如果产生了大量的请求那么就需要开启大量的进程去完成数据读取的过程。

2.非阻塞I/O

在这里插入图片描述

非阻塞I/O与阻塞I/O最大的不同在于,用户进程需要不断的主动轮询内核数据准备好了没有,如果数据没有准备好,那么内核会立即返回错误,此时用户进程无需在链路中阻塞,而是做其他的操作,在一定时间后继续发起轮训。当内核准备好了数据时,用户进程才开始正式地阻塞在这条请求链路之中,直到数据拷贝到用户空间完成,响应成功。

可以看出,非阻塞I/O相对于阻塞I/O来说,对于应用进程的利用效率更高了,因为应用进程不需要每次发送read请求后就阻塞,而是可以继续做自己的事情,直到内核准备好了数据才开始阻塞,处理数据。

但是需要注意的是,非阻塞I/O仍不能解决大量请求的问题,因为在发生数据拷贝的过程中,进程仍然是需要阻塞的。

3.I/O多路复用

在这里插入图片描述

I/O多路复用有三个特别的系统调用select、poll、epoll函数。select调用是内核级别的,select轮询相对非阻塞I/O的轮询的区别在于:

1.select可以等待多个socket文件描述符,只需要一个进程就能实现同时对多个IO端口进行监听,当其中任何一个socket的数据准好了,就能返回进行可读,然后调用其他进程再进行recv系统调用,将数据由内核拷贝到用户进程。

2.select或poll调用之后,会阻塞当前进程,但与阻塞I/O、非阻塞I/O不同在于,此时的select不是等到内核数据全部到达再处理, 而是有了一部分数据就会调用用户进程来处理,这个过程看起来就像是“非阻塞的”(实在发生recv时还是阻塞的)。

I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降底了系统的维护工作量,节省了系统资源,I/O多路复用的主要应用场景如下:

  1. 服务器需要同时处理多个处于监听状态或者多个连接状态的套接字。

  2. 服务器需要同时处理多种网络协议的套接字。

4.事件通知I/O

在这里插入图片描述

允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

5.异步非阻塞I/O

在这里插入图片描述

相对于同步IO,异步IO不是顺序执行。用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。在I/O的两个阶段,进程都是非阻塞的。

6.5种I/O模型总结

在这里插入图片描述

总体上看,阻塞I/O、非阻塞I/O、I/O多路复用、事件事件通知I/O都属于同步式I/O,只有异步I/O属于非同步式I/O。

因为区分同步或非同步的重要一点在与,整个进程对于数据的I/O过程是否需要阻塞,也就是在内核将数据拷贝到用户进程空间时需不需要阻塞。

三.select、poll与epoll

select、poll和epoll都是操作系统为了支持I/O多路复用所提供的内核调用,它们使得单个进程监听多个连接Socket成为现实,极大地减少了进程的创建数量。

1.select

select函数的定义为:

int select (int n, 
    fd_set *readfds, 
    fd_set *writefds, 
    fd_set *exceptfds, 
    struct timeval *timeout);

select 函数监视的文件描述符分3类,分别是

  1. readfds:(可选)指针,指向一组等待可读性检查的Socket。
  2. writefds:(可选)指针,指向一组等待可写性检查的Socket。
  3. exceptfds:(可选)指针,指向一组等待错误检查的Socket。

其中,timeout为select()最多等待时间,对阻塞操作则为NULL。

select大致的实现过程:

  1. 从用户空间拷贝fd_set到内核空间
  2. 对fd_set中的fd进行遍历操作,获取到fd的状态(可读、可写、异常)
  3. 只要有事件触发,系统调用返回,将fd_set从内核空间拷贝到用户空间,回到用户态,用户就可以对相关的fd作进一步的读或者写操作
  4. 如果没有发生事件触发,经过短暂等待后,继续执行上述遍历过程

在这里插入图片描述

可以看出,select的实现是基于对fd_set中的fd遍历,并且依次判断该fd是否具备可读、可写或异常的情况发生。

select有以下缺点:

1.监听的fd有限:当系统为32位时,只可监听1024个fd;当系统为64位时,最多可监听2048个fd。

2.效率低下:由于select采用的是轮询fd_set的方式来判断fd的状态,所以效率低下。

3.需要维护fd_set,当触发事件时,需要将其从内核地址空间拷贝到用户地址空间以让相应的进程得以使用,消耗资源。

当然,select也有优点,譬如几乎所有主流操作系统都实现了select函数,所以select可以作为IO多路复用的最基础实现函数。

2.poll
int poll (struct pollfd *fds, 
unsigned int nfds, 
int timeout);

poll的本质和select一样,都是对fd_set中的fd进行遍历然后获取到触发的事件,但是poll是基于链表来描述fd的,所以对于监听的fd数量没有限制。

poll的水平(LT)触发:

当poll遍历到的fd发生了触发事件时,如果该次没有进行处理,那么下次遍历到时还会有提示请求处理。

3.epoll

通过select和poll的缺点发现,如果能给套接字注册某个回调函数,当他们活跃时(可读、可写或异常),发起通知完成相关操作,那就避免了轮询,也可以提升效率。这就是epoll的本质改变:通知机制。

epoll的操作过程涉及到三个接口:

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

在这里插入图片描述

1.int epoll_create(int size)

创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大,这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值,参数size并不是限制了epoll所能监听的描述符最大个数,只是对内核初始分配内部数据结构的一个建议。

2.int epoll_ctl(int epfd,
int op,
int fd,
struct epoll_event event)

epoll_ctl函数是epoll体系中的核心,它使得epoll可以基于事件通知的机制,而不需要通过轮询fd,大大地提高了效率。

  • epfd:是epoll_create()的返回值
  • op:表示操作,用三个宏来表示:添加EPOLL_CTL_ADD,删除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分别添加、删除和修改对fd的监听事件
  • fd:是需要监听的fd
  • epoll_event:是告诉内核需要监听什么事,当发生了该事件则进行回调

3.int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)

epoll_wait函数用于获取到epoll_ctl返回的fd触发回调,然后执行相应的操作。

TIP:epoll的水平触发与边缘触发:

  • 水平触发模式(Level Trigger,LT):当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。(默认)
  • 边缘触发模式(Edge Trigger,ET):当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。(效率高)

四.Reactor与Proactor模式

说完了I/O模型和IO多路复用、select、poll和epoll,现在来看看两种网络设计中常使用的模式:Reactor模式和Proactor模式;

通常,同步I/O模型通常用于实现Reactor模式,异步I/O模型则用于实现Proactor模式。

1.Reactor模式

Reactor模式要求主线程(I/O处理单元)只负责监听fd上是否有事件发生,有的话就立即将该事件通知工作线程来对这个fd进行处理。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。

在这里插入图片描述

例如,使用epoll实现的I/O多路复用基于Reactor模式实现如下:

  1. 主线程通过epoll_create创建对socket fd列表上的监听
  2. 主线程调用epoll_wait等待socket fd上的事件触发
  3. 当socket fd上有事件触发时,epoll_wait接收到回调并通知主线程将socket fd上的事件放入请求队列
  4. 睡眠在请求队列上的某个工作线程被唤醒,它从socket读取数据,并处理客户请求
  5. 工作线程将事件处理完成之后,通知epoll_wait
  6. 不断执行上述过程

许多高性能网络应用都应用了Reactor模式,譬如Redis、Netty、Nginx等。Reactor模式只需要一个线程/进程来处理所有的socket fd,并且将其注册到epoll_wait中,当socket fd中有事件触发时即通知epoll_wait,然后主线程/进程将事件放入请求队列,唤醒工作线程/进程来对事件进行处理。

2.Proactor模式

与Reactor模式不同,Proactor模式将所有I/O操作都交给主线程和内核来处理,工作线程仅仅负责业务逻辑。这是一种典型的异步I/O模型,因为I/O操作都交给主线程和内核来处理,这就要求I/O处理必须是非阻塞的。

在这里插入图片描述

使用了异步I/O的Proactor模式经典的工作流程:

  1. 主线程调用aio_read函数向内核注册socket上的读事件,并通知内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序
  2. 主线程继续处理其他业务逻辑
  3. 当socket上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,已通知应用程序数据已经可以使用了
  4. 应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求
  5. 主线程继续处理I/O操作
  6. 不断执行上述流程
3.总结

简单地讲,Reactor模式适用于I/O多路复用模式(select、poll、epoll等),主线程只负责监听fd并且在fd触发时将其分发给工作线程处理,是一种经典的同步模式;Proactor模式适用于异步I/O模型下,主线程需要监听fd并且完成I/O读取操作,然后通知工作线程来完成业务逻辑即可。

C++ WebServer项目深度解析:从Reactor模型到高并发实战 网络编程是构建现代互联网服务的基石,其核心在于高效处理海量并发连接。Reactor模式作为事件驱动架构的经典实现,通过非阻塞I/O与I/O多路复用技术,将连接管理与事件分发解耦,是实现高性能服务器的关键。该模式的技术价值在于能够以有限的线程资源支撑数万甚至数十万的并发连接,有效解决C10K问题。在实际应用场景中,Nginx、Redis等知名软件均采用类似架构处理高并发请求。本文以C++实现的WebServer项目为例,深入探讨了如何运用epoll的边缘触发模式与线程池技术构建高性能服务器,其中涉及连接定时器 阅读详情

相关推荐

深入理解并发架构与Proactor模式

本文深入探讨了并发架构的设计与实现,重点分析了Reactor模式与Proactor模式的差异及其在C++中的应用。通过具体的代码示例,展示了如何利用Asio库实现Proactor模式,以及该模式在处理多线程和异步操作中的优势与挑战。

weixin_32287387的博客 471

【netty系列】一文讲透传统IO模型与reactor模型

单 Reactor 单线程,前台接待员和服务员是同一个人,全程为顾客服。 单 Reactor 多线程,1 个前台接待员,多个服务员,接待员只负责接待。 主从 Reactor 多线程,多个前台接待员,多个服务生。

叁滴水 的博客 4429

Linux显卡管理避坑指南:为什么Xorg总是占用你的NVIDIA GPU?

本文深入解析了在Linux系统上,尤其是双显卡笔记本中,Xorg显示服务器进程占用NVIDIA GPU的根本原因。文章从Xorg的驱动加载机制和NVIDIA驱动的独占性入手,详细对比了禁用配置文件、手动配置xorg.conf、使用官方PRIME方案以及切换到Wayland等主流解决方案的优缺点与适用场景,旨在帮助用户有效释放GPU资源,确保深度学习、游戏等计算任务能独占显卡性能。

xgboost6farmer的博客 270

Apache Dubbo 源码搭建与解读(十一)—— Netty网络编程(上)

Netty Netty是一个开源的异步事件驱动的网络应用程序框架(基于Java NIO技术封装的一套框架),用于快速开发可维护的高性能协议服务器和客户端。 JDK NIO 与 Netty JDK 本身提供了一套 NIO 的 API,但是这一套原生的 API 存在一系列的问题。 Java NIO 的 API 非常复杂。 要写出成熟可用的 Java NIO 代码,需要熟练掌握 JDK 中的 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等组件,还

D_A_I_H_A_O的博客 404

Windows 11安装realtek audio control

Windows 11安装realtek audio control,解决无法链接RPC问题

m0_46144825的博客 8万+

【Docker】如何让docker容器正常使用nvidia显卡

描述了如何在docker容器中使用英伟达显卡的过程和问题解决方法。

NameLoadingFailed的博客 8372

网络IO模型与Reactor模式

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

oshhh的博客 238

【AI 智能体】Windows 环境 Hermes Agent(爱马仕)安装详细过程

Windows 环境 Hermes Agent(爱马仕)安装详细过程

congge_study的博客 1832

Unix/Linux编程:服务器模型Reactor和Proactor

网络IO,会涉及到两个系统对象,一个是用户空间调用IO的进程或者线程,另一个是内核空间的内核系统,比如发生IO操作read时,它会经历两个阶段 等待数据准备就绪 将数据从内核拷贝到进行或者线程中 因为在以上两个阶段各有不同的情况,所以出现了多种网络IO模型 服务器模型Reactor和Proactor 对高并发编程,网络连接上的消息处理,可以分为两个阶段: 等待消息准备好 消息处理 当使用默认的阻塞套接字时(例如上面提到的 1 个线程捆绑处理 1 个连接),往往是把这两个阶段合二为一,这样操作套接字的

OceanStar的博客 750

OpenHarmony Stage模型深度解剖:从Ability Kit到沙箱隔离的全链路底层原理

基于微内核架构,提供进程管理、内存管理、IPC通信等基础能力:包含V8引擎、ArkTS运行时、渲染引擎等核心组件:Ability Kit框架,提供应用生命周期管理、组件调度等能力:基于Stage模型的应用程序。

m0_67505153的博客 192

基于matlab的形态学的权重自适应图像去噪

数学形态学以图像的形态特征为研究对象,通过设计一套独特的数字图像处理方法和理论来描述图像的基本特征和结构,通过引入集合的概念来描述图像中元素与元素、部分与部分的关系运算。因此,数学形态学的运算由基础的集合运算(并、交、补等)来定义,并且所有的图像矩阵都能被方便地转换为集合。随着集合理论研究的不断深入和实际应用的拓展,图像形态学处理也在图像分析、模式识别等领域起着重要的应用。实验结果表明,如果仅通过串联滤波器去噪,则往往具有一定的局限性,在结果图像中也保留着较为明显的噪声。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 759

IO模型、Reactor、Proactor(半同步/半反应堆)

IO模型、Reactor、Proactor,半同步/半异步模式,领导者/追随者模式,半同步/半反应堆模式

weixin_44806108的博客 615

手把手教你学simulink(90.1)--直流电动机实例:基于Simulink的基本模型的直流电动机(DC Motor)建模

直流电动机(DC Motor)因其结构简单、控制方便和良好的调速性能,广泛应用于各种工业自动化、机器人技术、家用电器以及航空航天等领域。为了更好地理解和应用直流电动机的工作原理及其控制系统,本项目旨在通过Simulink对直流电动机进行基本模型的建模与仿真。

MHD0815的博客 441

I/O并发模式:Reactor模式与Proactor模式

要理解这两个模式还是有点困难。从网上找了几篇关于这两个模式的讲解,特此在这里记录下。看了很多总感觉不能深入精髓,可能实际经验太少。希望日后自己自己能理解的很好了,再来好好总结下。以下是别人的一些总结:      首先最好拜读下《Unix网络编程第一卷:套接口API》第6章关于I

success041000的专栏 1万+

matlab 受约束的 Delaunay 三角剖分【2025最新版】

matlab内置调用函数实现受约束的 Delaunay 三角剖分并将结果保存为STL文件

点云侠的博客 1876

Camera2Demo

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

深入理解Java IO模型

Java IO模型演进:从BIO到NIO再到AIO 摘要: 本文系统分析了Java三种核心IO模型的原理与实现。BIO采用同步阻塞模式,简单但线程开销大;NIO通过多路复用实现单线程管理多连接,性能显著提升;AIO基于事件回调实现真正的异步非阻塞。文章详细对比了三者的优缺点,并通过代码示例展示了NIO的Selector机制如何利用epoll实现高效IO处理。技术选型建议:低并发用BIO,高并发选NIO,超大规模考虑AIO,同时需结合业务场景和团队技术栈综合考量。

qq_844085127的博客 1418

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux网络编程基础之Reactor模式和Proactor模式

在Linux平台下的服务器开发中,如何去构建高性能的网络通信框架是重中之重,自然就绕不开网络通信模型的选择和应用;目前网络通信模型中涉及到的模式有两个:Reactor模式和Proactor模式。 在介绍这两个模式之前,先详细地阐述下阻塞IO、非阻塞IO、同步、异步的概念,因为经常有很多同学能把这些词汇编出各种奇怪的组合出来,连自己都不知道是什么意思。 阻塞IO:当应用层发起read请求时,发出read请求的线程会被挂起,直到操作系统完成数据从内核区到应用层缓冲区的拷贝,read调用才返回;write操作也是

边城梦溪 1285

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入理解gaio的Proactor模式:为什么它比传统Reactor更高效

在高并发网络编程领域,选择合适的I/O模型直接决定了系统性能的上限。GitHub加速计划中的gaio库(Goroutine-based Async IO)通过创新的Proactor模式实现,彻底改变了Go语言传统网络编程中"每连接一个goroutine"的性能瓶颈。本文将深入解析gaio的Proactor架构设计,揭示其如何通过边缘触发I/O多路复用技术,实现C10K+级并发连接的高效处理。 #

gitblog_00470的博客 403

高性能网络编程的两种核心模式:Reactor与Proactor深度解析

本文探讨了高性能网络编程中Reactor和Proactor模式的演进与应用。从C10K问题引出传统阻塞I/O模型的局限性,分析了线程资源、上下文切换和锁竞争等性能瓶颈。重点解析了Reactor模式的同步非阻塞设计,包括其核心组件、工作流程及三种线程模型变体(单线程、多线程、主从多线程)的适用场景。同时对比了Proactor的异步非阻塞哲学,指出Reactor在资源效率、响应速度方面的优势,但也提到其编程复杂度问题。这两种模式为突破网络性能瓶颈提供了不同思路,需根据具体场景选择实现。

weixin_42108533的博客 461

netty学习笔记-Reactor模式

反应器模式Reactor What,Reactor模式是什么 反应器模式是一种编程模型,由Reactor反应器和Handlers处理器两部分组成,一个负责处理对外交互,一个负责内部事务处理 Reactor反应器线程的职责:负责响应IO事件,并且分发到Handlers处理器 Handlers处理器的职责:非阻塞的执行业务处理逻辑 Why,为什么需要反应器模式 在传统IO即BIO模型下,socket编程是通过不断增加线程的方式来扩展服务器性能的,但是线程资源在操作系统中是有限的,如何更好的利用cpu

u011512223的专栏 220

IO设计模式:Reactor和Proactor对比

平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点; 反应器Reactor Reactor模式结构 Reactor包含如下角色: Handle 句柄;用来标识socket连接或是打...

weixin_34392906的博客 78

Netty源码解析2-Reactor

请戳GitHub原文: github.com/wangzhiwubi… 更多文章关注:多线程/集合/分布式/Netty/NIO/RPC Java高级特性增强-集合 Java高级特性增强-多线程 Java高级特性增强-Synchronized Java高级特性增强-volatile Java高级特性增强-并发集合框架 Java高级特性增强-分布式 Java高级特性增强-Zookeeper ...

weixin_34138521的博客 116

BIO与NIO、AIO的区别(这个容易理解)

本文系统介绍了Java中的三种I/O模型:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。BIO每个连接对应一个线程,适合连接数少的场景;NIO通过多路复用实现单线程处理多个连接,适合高并发短连接;AIO由操作系统完成I/O操作后回调通知应用,适合大数据量长连接。文章分析了三种模型的工作原理、代码实现及适用场景,并对比了Reactor和Proactor模式。建议根据实际业务需求选择适合的I/O模型,短连接高并发选NIO,大数据量选AIO,简单场景可用BIO。

ywl470812087的博客 10万+

03 分布式 01 Netty:Netty之Reactor模式

Netty、NIO 理清NIO与Netty的关系之前,我们必须先要来看看Reactor模式。Netty是一个典型的多线程的Reactor模式的使用,理解了这部分,在宏观上理解Netty的NIO及多线程部分就不会有什么困难了。 Reactor模式 Reactor的由来 Reactor模式究竟是个什么东西呢?这要从事件驱动的开发方式说起。我们知道,对于应用服务器,一个主要规律就是,CPU的处理速...

好刹那的专栏 234

Netty与Reactor模式

一:Netty、NIO、多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手。过年期间@李林锋hw发布了一个Netty5.0架构剖析和源码解读 http://vdisk.weibo.com/s/C9LV9iVqH13rW/1391437855,看完也是收获不少。前面的文章我们分析了Netty的结构,这次咱们来分析最错综复杂的一部分-Netty中的多线程以及NIO的

gadbee5的专栏 681
上一篇: 分布式基础-分布式一致性之CAP和BASE理论
下一篇: 分布式基础-分布式共识之Paxos、Raft算法
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值