Java网络编程(四) Reactor和Proactor模式

2023-11-03

[size=medium] 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。
[color=blue][b]同步和异步[/b][/color]
同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。
[color=blue][b]阻塞和非阻塞[/b][/color]
阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

[color=blue]I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO[/color]

1.同步阻塞
用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

2.同步非阻塞
用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

3.异步阻塞
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

4.异步非阻塞
用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。

综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。

[color=blue][b]Reactor模式[/b][/color]
很多地方叫反应器模式,并发系统常使用reactor模式,代替常用的多线程的处理方式,节省系统的资源,提高系统的吞吐量。
例如:在高并发的情况下
[b]多线程的处理:[/b]为每个单独到来的请求,专门启动一条线程,这样的话造成系统的开销很大,并且在单核的机上,多线程并不能提高系统的性能,除非在有一些阻塞的情况发生。否则线程切换的开销会使处理的速度变慢。
[b]Reactor模式的处理:[/b]服务器端启动一条单线程,用于轮询IO操作是否就绪,当有就绪的才进行相应的读写操作,这样的话就减少了服务器产生大量的线程,也不会出现线程之间的切换产生的性能消耗。[color=red](目前JAVA的NIO就采用的此种模式,这里引申出一个问题:在多核情况下NIO的扩展问题)[/color]

以上两种处理方式都是基于同步的,多线程的处理是我们传统模式下对高并发的处理方式,Reactor模式的处理是现今面对高并发和高性能一种主流的处理方式。


[color=blue][b]Proactor模式[/b][/color]
运用于异步I/O操作,Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.
[/color][/size]

参考:[url]http://xmuzyq.iteye.com/blog/783218[/url](高性能IO设计的Reactor和Proactor模式)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java网络编程(四) Reactor和Proactor模式 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • 未找到 MessageSource 的 ResourceBundle [消息]:找不到基本名称消息的包

    在 applicationContext xml 中 我定义了 MessageSource 如下所示
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 某企业每月给其A、B、C 和D 四个门店一共发送6 个集装箱的某种货物,如果各门店出售该种货物的利润(万元)如下表:

    某企业每月给其A B C 和D 四个门店一共发送6 个集装箱的某种货物 如果各门店出售该种货物的利润 万元 如下表 试求这6 箱货物如何分配给各门店 才能获得最大总利润 解题思路 将问题按卖场分为四个阶段 将A B C D四个卖场分别编号为
  • Angular学习---filter过滤器(管道pipe)

    angular核心概念 过滤器 Filter 应用 如当后台传入数据用1 2 代表性别 可以用过滤器进行更改 如上 练习 创建员工信息列表 中 的员工性别 过滤器在angular2以后改名为 管道 pipe 详见新建的sex pipe ts
  • 【H.264/AVC视频编解码技术详解】二十二、熵编码(7):语法元素的CABAC解析

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档
  • 【Java基础】环境搭建+简介(一)

    JAVA语言背景介绍 Java 语言是美国Sun公司 Stanford University Network 在1995年推出的计算机语言 Java之父 詹姆斯高斯林 James Gosling Java语言的发展史 Sun公司于1995年
  • Qt信号和槽绑定实例,点击pushbutton按钮触发QLabel文本显示和关闭

    功能简介 点击qt界面中的open按钮在界面中显示文本 同时按钮变为close按钮 再点击close按钮可以关闭显示文本 同时按钮变为open按钮 继续点击open按钮 关键内容 关联按钮按事件和信号识别槽 connect this gt
  • 2.1.Perl运行方式

    Perl运行方式 B站视频教程 菜鸟学生信 课程参考书 小骆驼书 第六版 1 运行 Perl Perl 有不同的执行方式 1 1 交互式 perl e
  • 压测工具之Locust

    前言 说起压测 我就用过Jmeter 而且仅是简单使用 好用性能强大 最近接触了一个python提供的压测框架Locust 翻译为蝗虫 蝗虫过之 寸草不生 哈哈哈 我感觉很贴切 首先 我们分析一下市面上几种工具的特性 LoadRunner
  • 对FPKM/RPKM以及TPM的理解

    虽然一直在接触FPKM RPKM以及TPM 但是仅仅是知道它们是转录本定量的值 并未究其根本 最近看了几篇文献 对其深层次的含义有了进一步的理解 因而在这里记录下来 首先来看FPKM RPKM的起源 在RNA Seq中 最简单的定量基因表达
  • 现代后端开发者必备技能-2018版

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今天的Web开发与几年前完全不同 有很多不同的东西可以很容易地阻止任何人进入Web开发 这是我们决定制作这些循序渐进的视觉指南的原因之一 这些指南展示了更大的图景 并让任何
  • 「万向区块链专家观点」深度解析“区块链+物联网”与新基建

    本文从属于万向区块链 融合创新 系列行业研究报告 作者为万向区块链首席经济学家邹传伟博士 2020年10月27日至28日 万向区块链实验室将主办主题为 融合创新 的第六届区块链全球峰会 近期 万向区块链蜂巢学院B站直播间也将特别推出 融合创
  • 带你读源码:四大视角多维走读区块链源码

    引子 区块链作为 新基建 的重要组成部分 越来越受技术爱好者关注 区块链极客信奉 code is law 相信通过代码可以构筑一个可信的世界 而作为一门综合学科技术 区块链建立在数学 密码学 计算机原理 分布式网络和博弈论等众多基础学科之上
  • scp命令下载整个目录

    linux文件夹下载 1 压缩文件夹 tar cvzf chinese tar gz usr share fonts chinese 2 下载 sz chinese tar gz 从Linux服务器下载文件夹到本地 1 使用scp命令 sc
  • Python实现快速傅里叶变换(FFT)

    相关文章 傅立叶级数展开初探 Python 这里做一下记录 关于FFT就不做介绍了 直接贴上代码 有详细注释的了 import numpy as np from scipy fftpack import fft ifft import ma
  • 【存档】CSDN社区之星专访:我的蜕变之路

    最近要接受一家技术媒体的专访 想起 10年前CSDN也采访过我一次 于是网上搜了搜 遗憾的是 原文链接已经失效了 幸好有位叫 阿飞冲冲冲 的网友转载了 我再转过来 顺便也读一遍 找找 初心 摘要 社区之星第49期采访了爱奇艺研发总监陆其明
  • angular6学习(九):数据绑定到事件

    实现功能 将html页面中文本框的输入的内容传递到ts文件 然后在html文件中显示ts文件中的这个内容 html文件 一 绑定到事件 ts文件 显示结果 二 双向绑定 html app module ts
  • Swing的布局管理器 --转载

    11月24日 Swing的布局管理器 转载 1 先说说Swing中的不一般的组件 JFrame JDialog JWindow JApplet这四个组件是重量级组件 因为要在操作系统中显示窗口画面 必须使用操作系统的窗口资源 所以JFram
  • java怎么打开_java开不了怎么办?java怎么打开?

    我们在打开java软件的时候 总是提示打不开 这可急坏了小伙伴 软件打不开 就无法写程序了 那么接下来 我们就来给大家讲解一下java开不了的解决方法 1 先保证正确安装了JAVA环境 2 再打开 控制面板 中的 Java 组件设置程序 3
  • 去除lcd图片的摩尔纹_科普必修

    妊娠纹是怀孕期间出现在下腹部 臀部 胸部 背部或四肢近端 呈紫色或是紫红色的条纹 据统计 大约70 90 的孕妇在首次怀孕时 会出现妊娠纹 妊娠纹虽对身体健康没有大的危害 但却给罹患孕妇带来了很大的精神压力和心理负担 从而影响其生活质量 什
  • Unity报错 error CS0246: The type or namespace name ‘UI‘ could not be found

    Unity报错 error CS0246 The type or namespace name UI could not be found 在我导入老版本的UnityPackage到2021年1月份的Unity版本的时候 出现了许多警告和e
  • Java网络编程(四) Reactor和Proactor模式

    size medium 在高性能的I O设计中 有两个比较著名的模式Reactor和Proactor模式 其中Reactor模式用于同步I O 而Proactor运用于异步I O操作 color blue b 同步和异步 b color 同