Reactor模式与Proactor模式

时间:2022-06-02 18:56:58

  博主一脚刚踏进分布式的大门(看《分布式Java应用》,如果大家有啥推荐的书欢迎留言~),发现书中对NIO采用的Reactor模式、AIO采用的Proactor模式一笔带过,好奇心趋势我找了一下文章,发现两篇挺不错的文章,高性能IO设计的Reactor和Proactor模式reactor模式和proactor模式,接下来是对这两个模式粗略的理解。


  在《高性能IO设计的Reactor和Proactor模式》这篇文章中,Reactor模式的读过程是这么被描述的:

 

读取操作:

1. 应用程序注册读就需事件和相关联的事件处理器

2. 事件分离器等待事件的发生

3. 当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器

4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

写入操作类似于读取操作,只不过第一步注册的是写就绪事件。

  简单画出的图是这样子的,我们可以看到,事件分离器和事件处理器是在等待有事件的到来,同时,一个事件分离器可以将n个事件分配到m个事件处理器上。

Reactor模式与Proactor模式

 

  用《reactor模式和proactor模式》这篇文章中举出的例子,就是服务员收N个桌子的菜单,然后根据菜单将菜名报给炒不同菜系的师傅。

  在《高性能IO设计的Reactor和Proactor模式》这篇文章中,Proactor模式的读过程是这么被描述的:

1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件。

2. 事件分离器等待读取操作完成事件

3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。

4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

  从上述可以看出,Proactor模式有两个特点:① 不关注就绪事件,而是关注完成事件;② 将读取到的内容放入缓存区,所以事件处理器可以直接从缓存区读取数据,而不需要再对这个事件进行读操作。

 Reactor模式与Proactor模式

  这个通俗一点的比喻吧,就像是吃旋转寿司,师傅把寿司做好了放到传送带上(传送带就相当于一个缓冲区),用户自己拿想吃的寿司。

  小记一篇,写着乐呵,这么打比方方便你我他,如果有中心思想的偏差也请大家提点一下啦~