高性能网络编程-反应堆模型(reactor)
reactor反应堆模式
对反应堆构架模式的分析,我们使用参考文献的分析风格,着重分析意图、上下 文、问题、解决方案、结构和实现 6个方面的内容。
意图
在事件驱动的应用中,将一个或多个客户的服务请求分离(demultiplex)和事件分发器 (dispatch)给应用程序。
上下文
在事件驱动的应用中,同步地、有序地处理同时接收的多个服务请求。
问题
在分布式系统尤其是服务器这一类事件驱动应用中,虽然这些请求最终会被序列化地处理,但是必须时刻准备着处理多个同时到来的服务请求。在实际应用中,这些请求总是通过一个事件(如CONNECTOR、READ、WRITE等)来表示的。在有 序地处理这些服务请求之前,应用程序必须先分离和调度这些同时到达的事件。为了有效地解决这个问题,我们需要做到以下4方面:
为了提高系统的可测量性和反应时间,应用程序不能长时间阻塞在某个事件源上而停止对其他事件的处理,这样会严重降低对客户端的响应度。
为了提高吞吐量,任何没有必要的上下文切换、同步和CPU之间的数据移动都要避免。
引进新的服务或 改良已有的服务都要对既有的事件分离和调度机制带来尽可能小的影响。
大量的应用程序代码需要隐藏在复杂的多线程和同步机制之后。
解决方案
在一个或多个事件源上等待事件的到来,例如,一个已经连接的Socket描述符就是一个事件源。将事件的分离和调度整合到处理它的服务中,而将分离和调度机制从应用程序对特定事件的处理中分离开,也就是说分离和调度机制与特定的应用程序无关。
具体来说,每个应用程序提供的每个服务都有一个独立的事件处理器与之对应。由 事件处理器处理来自事件源的特定类型的事件。每个事件处理器都事先注册到Reactor管理器中。Reactor管理器使用同步事件分离器在一个或多个事件源中等待事件的发生。当事件发生后,同步事件分离器通知Reactor管理器,最后由Reactor管理器调度和该事件相关的事件处理器来完成请求的服务。
结构
在Reactor模式中,有5个关键的参与者。
描述符(handle):
由操作系统提供,用于识别每一个事件,如Socket描述符、文 件描述符等。在Linux中,它用一个整数来表示。事件可以来自外部,如来自客户端 的连接请求、数据等。事件也可以来自内部,如定时器事件。
同步事件分离器 (demultiplexer):
是一个函数,用来等待一个或多个事件的发生。调用者会被阻 塞,直到分离器分离的描述符集上有事件发生。Linux的select函数是一个经常被使 用的分离器。
事件处理器接口(event handler):
是由一个或多个模板函数组成的接口。这些模板函数描述了和应用程序相关的对某个事件的操作。具体的事件处理器:是事件处理器接口的实现。它实现了应用程序提供的某个服务。每个具体的事件处理器总和一个描述符相关。它使用描述符来识别事件、识别应用程序提供的服务。
Reactor管理器(reactor):
定义了一些接口,用于应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符。它是事件处理器的调度核心。Reactor管理器使用同步事件分离器来等待事件的发生。一旦事件发生,Reactor管理器先是分离每个事件,然后调度事件处理器,最后调用相关的模板函 数来处理这个事件。通过上述分析,我们注意到,是Reactor管理器而不是应用程序负责等待事件、分离事件和调度事件。实际上,Reactor管理器并没有被具体的事件处理器调用,而是管理器调度具体的事件处理器,由事件处理器对发生的事件做出处理。这就是类似Hollywood原则的“反向控制”。应用程序要做的仅仅是实现一个具体的事件处理器,然后把它注册到Reactor管理器中。接下来的工作由管理 器来完成。这些参与者的相互关系如图2-1所示。
注意:这里提及的反应堆模型,实际上就是外国人设计的一个概念,将我们从面向过程编程转换为一个面向对象编程的一个东西,我们可以简单的认为,直接操作IO模型,是一个面向过程的操作,而由一个反应堆来操作的,是一个面向对象的操作,期间,面相对象操作会提高部分性能。
高性能网络编程-反应堆模型(reactor)相关推荐
- 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型
本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...
- 深入了解 Reactor 网络编程架构模型
Reactor网络编程架构模型 常见的网络编程模型有:Reactor Proactor Asynchronous Completion Token and Acceptor_Connector 这里介 ...
- 高性能网络编程6--reactor反应堆与定时器管理
反应堆开发模型被绝大多数高性能服务器所选择,上一篇所介绍的IO多路复用是它的实现基础.定时触发功能通常是服务器必备组件,反应堆模型往往还不得不将定时器的管理囊括在内.本篇将介绍反应堆模型的特点和用法. ...
- Linux网络编程7——epoll反应堆模型
学习视频链接 16-epoll反应堆main逻辑_bilibili_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=81& ...
- linux网络编程 epoll水平触发、边沿触发、反应堆模型、线程池思想
打开文件上限的设置可修改配置文件: etc/security/limits.conf 水平.边沿触发: 若客户端发送1000B数据,服务器一次只读500B.在水平触发的模式下,服务器会再调用一次epo ...
- 高性能网络编程总结及《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
http://blog.csdn.net/column/details/high-perf-network.html http://blog.csdn.net/russell_tao/article/ ...
- 高性能网络编程--陶辉
1 高性能网络编程1-accept建立连接 编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开 ...
- ACE高性能网络编程——学习大纲
ACE高性能网络编程 一.课程目标 本次课程针对使用ACE工具包进行高性能网络应用开发,通过本次课程的学习,学员将具备以下能力: 了解ACE的架构和组件: 理解现代操作系统线程模型.并发以及同步机制: ...
- 【原创】高性能网络编程技术
高性能网络编程技术 作者:jmz (360电商技术组) 如何使网络服务器能够处理数以万计的客户端连接,这个问题被称为C10K Problem.在很多系统中,网络框架的性能直接决定了系统的整体性能,因此 ...
- linux高性能网络编程,Linux高性能网络编程的介绍
Linux高性能网络编程 一.课程目标 本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果: 熟练使用so ...
最新文章
- 音频编辑软件_Audacity2.12版
- 独家 | 用随机森林预测“美版拼多多”商品销量
- 5G的3大应用场景落地开花,中国或将引领全球5G产业发展
- Spring中的循环依赖及解决,2021Java精选面试实战总结整理
- Java学习笔记六 常用API对象二
- Python 35个内置函数,你都ok吗?
- 【渝粤教育】国家开放大学2019年春季 0177-22T电机学(二) 参考试题
- 两台服务器ubuntu20.x 直接文件共享,文件挂载 nfs
- 通用设备的动态DMA映射
- 带滤镜拍照的app_这8款拍照修图APP,简直就是逼格神器
- sdr 软件_将永远改变我们业余无线电爱好的SDR软件定义无线电技术
- 控制Tello无人机扫描条形码
- 公司简介ppt模板如何利用曲线时间轴提升质感
- Excel树状数据绘制导出
- IPFS占据10%存储份额?预测FIL价格千U?现在挖FIL晚吗?
- python opencv生成背景透明图标
- antd ellipsis
- 雅可比(Jacobian)矩阵简介
- 8.Python之文件
- 【Lua 教程系列第 4 篇】Lua 中的第一行代码 hello world