Reactor和Proactor模式

在高性能的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设备. 
相关文章
相关标签/搜索