1、标准定义

两种I/O多路复用模式:Reactor和Proactor

一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。

在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。

而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。

举个例子,将有助于理解Reactor与Proactor二者的差异,以读操作为例(类操作类似)。
在Reactor中实现读:

- 注册读就绪事件和相应的事件处理器
- 事件分离器等待事件
- 事件到来,激活分离器,分离器调用事件对应的处理器。
- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。
在Proactor中实现读:

- 处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。
- 事件分离器等待操作完成事件
- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。
- 事件分离器呼唤处理器。
- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。

可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。在结构上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler;不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write)。

2、通俗理解

使用Proactor框架和Reactor框架都可以极大的简化网络应用的开发,但它们的重点却不同。

Reactor框架中用户定义的操作是在实际操作之前调用的。比如你定义了操作是要向一个SOCKET写数据,那么当该SOCKET可以接收数据的时候,你的操作就会被调用;而Proactor框架中用户定义的操作是在实际操作之后调用的。比如你定义了一个操作要显示从SOCKET中读入的数据,那么当读操作完成以后,你的操作才会被调用。

Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。

举个例子:

Reactor:到吃饭时间点了,通知你(回调接口),可以去做饭了(实际的io操作需要自己处理)

Proactor:请一个人(操作系统),告诉他餐桌(缓冲区地址)在哪里,吃什么(数据大小),他做好饭后通知你可以吃饭了

首先引用levin的回答让我们理清楚五种IO模型
因为熊吉_22cb提出levin的回答有点不知所云~
我对下面的回答进行了小部分的修改,有哪里错误的还望大家指出~

1.阻塞I/O模型
老李去火车站买票,排队三天买到一张退票。
耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

2.非阻塞I/O模型
老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。

3.I/O复用模型
1.select(监听fd数最大1024)/poll(不限制fd个数)
老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。
耗费:打电话
2.epoll(不限制fd个数)
老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。
耗费:无需打电话

4.信号驱动I/O模型
老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。
耗费:无需打电话

5.异步I/O模型
老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。
耗费:无需打电话

网络编程:Reactor与Proactor的概念相关推荐

  1. 【Java 网络编程】NIO Buffer 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )

    文章目录 I. Buffer 简介 II. Buffer 属性 III. Buffer 数据读写 IV. Buffer 标记 mark() 和重置 reset() V. Buffer 清除 翻转 重绕 ...

  2. Linux网络编程——连接和面向连接的协议之间没有区别

    网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议.虽然本质.两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题 ...

  3. 【Linux网络编程】无连接和面向连接协议

    00. 目录 文章目录 00. 目录 01. 概述 02. 附录 01. 概述 网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议 ...

  4. 【Linux网络编程】无连接和面向连接协议的区别

    网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议.尽管本质上来说,两者之间的区别并不难理解,但对那些刚刚开始进行网络编程的人来说 ...

  5. iOS开发网络篇—网络编程基础

    一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新 ...

  6. linux网络编程之-----基础理论篇

    1.学习linux网络编程首要掌握的基本概念 系统资源 是指CPU和内存等一些活动单元(除存储设备外) 程序 是指由编译好的二进制文件,存储在磁盘上,不占用系统资源 进程 由硬盘中的程序动迁起来,产生 ...

  7. android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术

    本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...

  8. Python进阶三部曲网络编程

    使用Python进行网络编程时,实际上是在Python程序中本身这个进程内,连接到指定服务器进程的通信端口进行通信,所以网络通信也可以看成两个进程间的通信. 提到网络编程必须提到的一个概念是Socke ...

  9. 【Python】【网络编程】

    #[[网络编程]] # 网络通信就是两个进程之间在通信 # [TCP/IP]'''TCP/IP简介 阅读: 125242虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联 ...

最新文章

  1. html video标签问题,用HTML5 video标签的一系列问题
  2. 少儿编程语言python-青少儿编程语言Python的学习紧迫性
  3. linux 远程控制详细安装 -- VNC (转)
  4. SAP Leonardo平台机器学习API的一些错误处理机制
  5. jquery刷新页面
  6. java 和javafx_JavaFX 2 XYCharts和Java 7功能
  7. leetcode1291. 顺次数(回溯)
  8. java虚拟机堆栈工作原理_java虚拟机工作原理?
  9. 自动化测试---Assert
  10. DISPLAY变量和xhost(原创)
  11. STM32.SPI(25Q16)
  12. 安装tif虚拟打印机
  13. python安装graphviz和pydotplus
  14. 2022年3月22日
  15. 如何隐藏C/C++编译生成的函数符号
  16. 设置此计算机的用户已选择屏蔽此网站,已阻止此网站显示有安全证书错误的内容,详细教您已阻止此网站显示有安全证书错误的内容怎么解决...
  17. 服务器终端性能测试之MBW内存测试
  18. SVG进阶-sprite 雪碧图
  19. 搭建Cacti监控(2)
  20. CSS错误 Do not use empty rulesets

热门文章

  1. python版openvino使用
  2. [每天读一点英文:那些给我勇气的句子]Frederic Francois Chopin 钢琴诗人—肖邦
  3. Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯
  4. 开始菜单不见了怎么办 开始菜单不见了解决方法
  5. 大咖说*计算讲谈社|商用车智能驾驶商业化实践
  6. 面向对象——类与对象的概念
  7. MAPI 、 IMAP4、 POP3、 SMTP 都是什么协议?
  8. 服务之星网络评选视频投票小程序如何进行视频投票免费公众号投票
  9. 计算机自带游戏怎么调,如何设置电脑游戏全屏?
  10. 采用直线逼近方式的圆弧插补