文档章节

Reactor和Proactor模式

ksfzhaohui
 ksfzhaohui
发布于 2012/12/14 14:20
字数 1160
阅读 787
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

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

I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO 
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事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。 

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

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

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

© 著作权归作者所有

ksfzhaohui

ksfzhaohui

粉丝 426
博文 167
码字总数 261352
作品 3
南京
高级程序员
私信 提问
加载中

评论(0)

网络编程:Reactor与Proactor的概念

1、标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应...

欧阳俊文
2015/03/16
148
0
服务器高效I/O设计模式

前言 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员...

满小茂
2016/04/13
6K
15
为何Boost的asio要使用proactor模式实现?

Linux下高性能的网络库中大多使用的Reactor 模式去实现,Boost Asio在Linux下用epoll和select去模拟proactor模式,影响了它的效率和实现复杂度, 看陈硕的自己的Linux下Reactor网络库和ASIO的性...

天下杰论
2014/12/08
389
0
Java的中BIO、NIO、AIO-2

Java的中BIO、NIO、AIO-2 java 举个栗子 接上一篇接着说,C/S模式、Reactor模式、Proactor模式是服务器处理IO常用的处理模型,这一篇就来解释一下这几种模式: 以一个餐饮为例,每一个人来就...

osc_apej9ed1
2018/06/25
2
0
关于Reactor和Proactor的差别

/ Author : Samson Date : 07/12/2015 Test platform: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) * Nginx version: * Nginx 1.6.2 * Nginx 1.......

技术mix呢
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何制作出色的R可重现示例 - How to make a great R reproducible example

问题: This post is a Community Wiki . 这篇文章是社区维基 。 Edit existing answers to improve this post. 编辑现有答案以改善此职位。 It is not currently accepting new answers. 它......

技术盛宴
30分钟前
24
0
windows下修改默认mysql编码

查看编码格式: 进入mysql执行下面语句 show variables like '%character%'; 修改编码格式: set character_set_client=utf8;set character_set_connection=utf8;set character_set_da......

珞木橘子
35分钟前
21
0
ArrayList与LinkList性能对比----新增元素

在聊到 ArrayList 和 LinkList 的时候都会这么说 ArrayList 底层是基于数组实现的内存地址物理上是连续的,新增,删除效率低,查询效率高 LinkList 是基于链表实现的,逻辑地址是连续的内存地...

Lbj虞
55分钟前
34
0
Nginx

想了解nginx的代理可以先看这篇: https://baijiahao.baiducom/s?id=1652608869911988442&wfr=spider&for=pc nginx常用命令 nginx -t ##检查配置文件,一般修改完配置文件都建议一定先执行这...

UItraman
昨天
24
0
新基建的福音:智慧楼宇可视化监控系统引领智能化新时代

前言 智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注。目前智慧楼宇可视化监控的主要优点包括: 智慧化 -- 智...

xhload3d
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部