Reactor模式与Proactor模式理解
一、前言
Reactor模式与Proactor模式均为高性能网络模式。关于网络模式的演变,可移步前文Reactor模型认识-CSDN博客。其中介绍了为何会出现Reactor模式,个人理解针对IO多路复用的实现方式,如果不用Reactor模式进行开发,写起来更像是面向过程开发,如果业务逻辑复杂有些混乱。后续面向对象思想更加适合各部分解耦,针对该思想可以对其拆解,后续更优雅更规范的Reactor模式就出现了。纯粹个人拙见解....
二、Proactor模式
Reactor模式相关介绍可移步前文Reactor模型认识-CSDN博客,此处不再过多介绍Reactor模式。下面大概说下Proactor模式。
Reactor模式作为一种同步网络模式,与其对比肯定相关,对应Proactor模式作为一种异步网络模式。同步与异步两者区别,对于个人理解看,我认为理解异步和同步首先要关注两个主体任务,如何完成这两个主体任务可以分为同步和异步。
举个例子:我想吃饭,整个流程是我去食堂,然后告诉食堂阿姨我想吃啥,然后食堂阿姨做饭,之后我拿到对应饭菜开吃。
同步阻塞方式:我到达食堂告诉食堂阿姨我想吃红烧肉请帮我做一份红烧肉,然后在食堂原地等阿姨做红烧肉,阿姨做完后我就开吃。
同步非阻塞方式:我到达食堂告诉食堂阿姨我想吃红烧肉请帮我做一份红烧肉,然后食堂阿姨开始做饭,过了5秒我又告诉食堂阿姨我想吃红烧肉请帮我做一份红烧肉,过了5秒我又告诉食堂阿姨我想吃红烧肉请帮我做一份红烧肉......问了10次,阿姨做好了,然后我开吃。(阿姨烦死了....)
异步方式:我到达食堂告诉食堂阿姨我想吃红烧肉请帮我做一份红烧肉,然后我不在原地等也不来回问阿姨,我直接回宿舍打把游戏,然后食堂阿姨以某种方式告诉我红烧肉做好了,然后我回到食堂开吃。
所以通过上面例子可以理解在网络模式设计的场景下,异步IO对于内核数据准备过程(红烧肉)是不需要等待的,这个等待期间应用程序可以执行其他任务,所以对比同步方式阻塞等待或者非阻塞方式对于CPU的利用率而言更高,因此异步IO方式效率更高。当发起一个异步IO后,程序直接返回,内核开始处理这个IO事件,对应网络就涉及网卡数据的IO,这部分都是由内核自动完成的。如下图:
三、两者对比
对比两者区别:
Proactor模式他最终处理的事件是已经处理完成的IO事件,而Reactor模式最终处理的还是一个数据已经准备就绪,但是数据需要程序再次触发系统调用取出数据或者写入数据。他面对的是刚准备好的IO事件。整体流程梳理:Proactor模式可以理解为应用层提交一个IO事件,然后内核层会一条龙处理完该事件,将最终的结果再通知给应用层。而Reactor模式可以理解为应用层提交一个IO事件,然后内核层会通知应用层这个IO事件现在可以开始处理了,应用层再提交一个处理IO任务的系统调用,内核层才开始处理该事件。这里的处理流程看Reactor模式就多了一步,这一步在Linux下的开销就包含:提交一次系统调用,内核层与应用层的数据拷贝。而异步IO这两个部分是没有的。所以他的效率要更高。不过两种模式均为事件分发模型,区分两者不能单一的从最终效率差异这个结果出发,而是理解Proactor模式是基于已完成的IO事件,Reactor模式是基于待完成且当前可以开始执行的IO事件。
更多资料:0voice · GitHub