2022-07-24  阅读(5)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/series/article/2128121655

上篇文章我们分析了高性能 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 模式为主。

参考资料


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文