| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Reactor & Proactor 设计模式 -> 正文阅读 |
|
[Java知识库]Reactor & Proactor 设计模式 |
Reactor & Proactor 设计模式? 平时接触的开源产品如Redis, 事件模型都使用的Reactor模式; 而同样做事件处理的Proactor, 由于操作系统的原因, 相关的开源产品较少. 1. Reactor 模式简介一种为处理并发服务请求, 并将请求提交到一个或者多个服务处理程序的事件设计模式. 当客户端请求抵达后, 服务处理程序使用多路分配策略, 由一个非阻塞的线程来接收所有的请求, 然后派发这些请求至相关的工作线程进行处理. 基本组成
用于管理Event Handler, 定义注册, 移除EventHandler等; 还作为Reactor模式的入口调用Synchronous Event Demultiplexer的select方法以阻塞等待事件返回, 当阻塞等待返回时, 根据事件发生的Handle将其分发给对应的Event Handler处理, 即回调EventHandler中的handle_event()方法
无限循环等待新事件的到来, 一旦发现有新的事件到来, 就会通知初始事件分发器去调取特定的事件处理器.
操作系统中的句柄, 是对资源在操作系统层面上的一种抽象, 它可以是打开的文件、一个连接(Socket)、Timer等 由于Reactor模式一般使用在网络编程中, 因而这里一般指Socket Handle, 即一个网络连接(Connection, 在Java NIO中的Channel). 这个Channel注册到Synchronous Event Demultiplexer中, 以监听Handle中发生的事件, 对ServerSocketChannnel可以是CONNECT事件, 对SocketChannel可以是READ、WRITE、CLOSE事件等
定义事件处理方法, 以供Initialization Dispatcher回调使用. 一部分是由Boss组成, 另一部分是由worker组成. 优缺点并发系统常使用reactor模式代替常用的多线程的处理方式, 节省系统的资源, 提高系统的吞吐量. 多线程的处理为每个单独到来的请求, 专门启动一条线程, 这样的话造成系统的开销很大, 并且在单核的机上, 多线程并不能提高系统的性能, 除非在有一些阻塞的情况发生. 否则线程切换的开销会使处理的速度变慢. Reactor模式的处理服务器端启动一条单线程, 用于轮询IO操作是否就绪, 当有就绪的才进行相应的读写操作, 这样的话就减少了服务器产 生大量的线程, 也不会出现线程之间的切换产生的性能消耗. 本质两种处理方式都是基于同步的, 多线程的处理是我们传统模式下对高并发的处理方式, Reactor模式的处理是现今面对高并发和高性能一种主流的处理方式. 类设计各个类图含义:
2. Proactor模式运用于异步I/O操作, Proactor模式中, 应用程序不需要进行实际的读写过程, 它 只需要从缓存区读取或者写入即可, 操作系统会读取缓存区或者写入缓存区到真正的IO设备. Proactor中写入操作和读取操作, 只不过 感兴趣的事件是写入完成事件. 基本组成
从时序角度分析 Proactor 模式:
3. Reactor vs Proactor模式实现角度Reactor实现了一个被动的事件分离和分发模型, 服务等待请求事件的到来, 再通过不受间断的同步处理事件, 从而做出反应. Proactor实现了一个主动的事件分离和分发模型; 这种设计允许多个任务并发的执行, 从而提高吞吐量, 并可执行耗时长的任务 (各个任务间互不影响). 主动和被动方面Reactor将handle放到select(), 等待可写就绪 然后调用write()写入数据; 写完处理后续逻辑. Reactor 被动的等待 指示事件的到来并做出反应它有一个等待的过程, 做什么都要先放入到监听事件集合中等待handler可用时再进行操作 . Proactor调用aoi_write后立刻返回, 由内核负责写操作, 写完后调用相应的回调函数处理后续逻辑. Proactor 直接调用 异步读写操作, 调用完后立刻返回. 优点? Reactor 对于耗时短的处理场景处理高效; 操作系统可以在多个事件源上等待, 并且避免了多线程编程相关的性能开销和编程复杂性; 事件的串行化对应用是透明的, 可以顺序的同步执行而不需要加锁; 事务分离: 将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来. ? Proactor性能更高, 能够处理耗时长的并发场景 . 缺点? Reactor处理耗时长的操作会造成事件分发的阻塞, 影响到后续事件的处理. ? Proactor实现逻辑复杂; 依赖操作系统对异步的支持, 目前实现了纯异步操作的操作系统少. 而Unix/Linux系统对纯异步的支持有限, 应用事件驱动的主流还是通过select/epoll来实现. 4. 场景? Reactor: 同时接收多个服务请求, 并且依次同步的处理它们的事件驱动程序; ? Proactor: 异步接收和同时处理多个服务请求的事件驱动程序 Reference
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:44:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |