大家好,我是大明哥。

上篇文章我们分析了高性能 IO模型Reactor模式,了解了什么是Reactor 模式以及它的三种常见的模式,这篇文章,大明再介绍另外一种高性能IO模型: Proactor

为什么是 Proactor 模式

上篇文章 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?大明哥分析了 Reactor模式,我们知道Reactor性能确实非常高,适合高并发场景,但是它依然存在一个问题,那就是它是 同步IO。同步IO会有一个什么问题呢?同步IO需要线程自己等待内核准备好数据,在内核准备数据的过程中,当前线程是阻塞的,这样就会导致如果某个线程因为读取IO的时间过长(比如读取文件、写文件),则它势必会影响其他线程的执行。如果对 同步IO、 异步IO 不了解的同学,可以看如下两篇文章:

既然 同步IO有缺陷,那我们是不是可以调整为 异步IO呢?完全可以,这就是 Proactor 模式

什么是 Proactor 模式

Proactor 模式整体与Reactor 模式一致,区别就在于Proactor模式将所有I/O操作都交给主线程和内核来处理,工作线程仅仅负责业务逻辑。模型如下:

  • Procator Initiator:负责创建Handler和Procator,并将Procator和Handler都通过Asynchronous operation processor注册到内核。

  • Handler:执行业务流程的业务处理器。

  • Asynchronous operation processor:负责处理注册请求,并完成IO操作。完成IO操作后会通知Procator。

  • Procator:根据不同的事件类型回调不同的handler进行业务处理。

这里需要注意的是: Proactor关注的不是就绪事件,而是完成事件,这是区分Reactor模式的关键点

然而可惜的是,Linux下的异步 I/O 是不完善的,aio 系列函数是由 POSIX 定义的异步操作接口,不是真正的操作系统级别支持的,而是在用户空间模拟出来的异步,并且仅仅支持基于本地文件的 aio 异步操作,网络编程中的 socket 是不支持的,这也使得基于 Linux 的高性能网络程序都是使用 Reactor 方案。

而 Windows 里实现了一套完整的支持 socket 的异步编程接口,这套接口就是 IOCP,是由操作系统级别实现的异步 I/O,真正意义上异步 I/O,因此在 Windows 里实现高性能网络程序可以使用效率更高的 Proactor 方案。

优缺点

  • 优点

    • 性能确实是强大,效率也高
  • 缺点

    • 复杂。性能好,效率高,东西是好东西,但是使用起来就是复杂。

    • 操作系统支持。上面提到过,Linux系统对异步IO支持不是很好,不是很完善

Proactor 模式与Reactor 模式

Proactor模式与Reactor模式 的区别有如下几点:

  • Reactor 模式注册的是文件描述符的就绪事件。当Reactor 模式有事件发生时,它需要判断当前事件是读事件还是写事件,然后在调用系统的read或者write将数据从内核中拷贝到用户数据区,然后进行业务处理。

  • Proactor模式注册的则是完成事件。即发起异步操作后,操作系统将在内核态完成I/O并拷贝数据到用户提供的缓冲区中,完成后通知Proactor进行回调,用户只需要处理后续的业务即可。

  • Reactor模式实现同步I/O多路分发

  • Proactor模式实现异步I/O分发

在 Linux 操作系统下实现高并发网络编程依然以Reactor 模式为主。

参考资料

【死磕 NIO】— Proactor模式是什么?很牛逼吗?的更多相关文章

  1. 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?

    大家好,我是大明哥,我又来了. 为什么是 Reactor 一般所有的网络服务,一般分为如下几个步骤: 读请求(read request) 读解析(read decode) 处理程序(process s ...

  2. 【死磕 NIO】— 深入分析Buffer

    大家好,我是大明哥,今天我们来看看 Buffer. 上面几篇文章详细介绍了 IO 相关的一些基本概念,如阻塞.非阻塞.同步.异步的区别,Reactor 模式.Proactor 模式.以下是这几篇文章的 ...

  3. 【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚

    万事从最基本的开始. 要想完全掌握 NIO,并不是掌握上面文章([死磕NIO]- NIO基础详解)中的三大组件就可以了,我们还需要掌握一些基本概念,如什么是 IO,5 种IO模型的区别,什么是阻塞&a ...

  4. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  5. 【死磕NIO】— 跨进程文件锁:FileLock

    大家好,我是大明哥,一个专注于[死磕 Java]系列创作的程序员. [死磕 Java ]系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码 死磕 ...

  6. 不推荐别的了,IDEA 自带的数据库工具就很牛逼!

    MySQL 等数据库客户端软件市面上非常多了,别的栈长就不介绍了, 其实 IntelliJ IDEA 自带的数据库工具就很牛逼,不信你继续往下看. 本文以 IntelliJ IDEA/ Mac 版本作 ...

  7. 【死磕NIO】— 探索 SocketChannel 的核心原理

    大家好,我是大明哥,一个专注于[死磕 Java]系列创作的程序员. [死磕 Java ]系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码. 死磕 ...

  8. 【死磕NIO】— NIO基础详解

    Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计.Java NIO 由三个核心组件组件: Buffer Channel Sele ...

  9. copy and paste ,做到这样也很牛逼了

    db笔记本 mysql资源 mysql5.1中文参考手册 mysql管理 基于linux使用mysql二进制包安装mysql5.5 mysql client命令行选项 mysqld服务器系统变量和状态 ...

随机推荐

  1. requests接口自动化-assert断言

    断言,自动判断接口返回的结果与预期结果是否一致 from common.get_mysql import * def test_assert(): a=0 b=1 # assert a,'断言失败打印 ...

  2. session与cookie的联系与区别

    一.Session与Cookie介绍 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你 ...

  3. python学习2-博客-蓝图

    #!/usr/bin/env python # -*- coding: UTF-8 -*- from flask import Blueprint,Flask #这里创建了一个名称为 'admin' ...

  4. sublime text 3 在Windows下配置sublimelinter-php的路径问题

    首先用package control安装sublimelinter和sublimelinter-php,然后依次点击菜单preference-package settings-sublimelinte ...

  5. 解决 Asp.Net5 在视频文件下载预览时无法快进的问题

    前情提要 https://www.cnblogs.com/puzhiwei/p/15265005.html 在解决.Net5 如何修改Content-Disposition实现在线预览的功能后,我又遇 ...

  6. 实验1:SDN拓扑实践

    作业链接:实验1:SDN拓扑实践 一.实验目的 能够使用源码安装Mininet: 能够使用Mininet的可视化工具生成拓扑: 能够使用Mininet的命令行生成特定拓扑: 能够使用Mininet交互 ...

  7. Incorrect datetime value: 时间添加失败原因

    在进行单元测试中通过 new Date() 方式添加时间时,报了 Data truncation: Incorrect datetime value:这样的错误(我数据库表的时间类型是 datetim ...

  8. 终端进程启动失败: shell 可执行文件“C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”的路径不存在。

    因为某些原因重新安装1了vscode 和node  遇到了两个棘手的问题 ctrl + ~  打开终端提示 " 终端进程启动失败: shell 可执行文件"C:\Windows\S ...

  9. C++学习笔记:07 类的继承与派生

    课程<C++语言程序设计进阶>清华大学 郑莉老师) 基本概念 继承与派生的区别: 继承:保持已有类的特性而构造新类的过程称为继承. 派生:在已有类的基础上新增自己的特性(函数方法.数据成员 ...

  10. 从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点

    西方经典管理理论认为,组织效率可以归为劳动效率.组织效率和人的效率.美国管理学家泰勒所著的<科学管理原理>被德鲁克誉为"20 世纪最伟大的发明",劳动效率说认为分工提升 ...