I/O事件处理模型之Reactor和Proactor 【转】
这篇博客说的很清楚,赞一个:
在编写服务端软件的时候,如何处理各种I/O事件是其中很重要的一部分。在Unix Network Programming中介绍了5种Unix/Linux下可用的I/O编程模型:1)阻塞式I/O; 2)非阻塞式I/O; 3)I/O复用; 4)信号驱动式I/O; 5)异步I/O。这几种都是基本的I/O编程模型,可以单独使用其中一种,也可以组合使用。为了应对高并发量的情形,在C10K Problem中另外总结了5种高性能的I/O编程模型:1) 单线程非阻塞式水平触发I/O(Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification); 2) 单线程非阻塞式边沿触发I/O(Serve many clients with each thread, and use nonblocking I/O and readiness change notification); 3) 多线程异步I/O模型(Serve many clients with each server thread, and use asynchronous I/O); 4) 单个服务线程对应单个客户(Serve one client with each server thread); 5) 将服务线程放到内核(Build the server code into the kernel)。本文介绍的两种模型都是基于I/O多路复用的单线程处理模型。
Reactor模型
Reactor模式是处理并发I/O比较常见的一种模式,中心思想就是,将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边沿触发还是水平触发),多路复用器返回并将相应I/O事件分发到对应的处理器中。
这里有三个重要的组件:
- 多路复用器:由操作系统提供,在linux上一般是select, poll, epoll等系统调用。
- 事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中。
- 事件处理器:负责处理特定事件的处理函数。
因为这种模型经常使用,所有不少人对简单的系统调用做了一层封装,形成跨平台的事件处理库,比较典型的有:libevent,libev,boost asio等。
Proactor模型
与Reactor模型相对应,Proactor最大的特点是使用异步I/O。所有的I/O操作都交由系统提供的异步I/O接口去执行。Proactor多路复用器等待异步I/O完成,并调用相应的用户处理函数。为了对比Reactor模型,以一个read操作为例:
在Reactor中:
- 将要读的文件描述符注册到多路复用器中。
- 多路复用器等待上述描述符的可读事件以及其它所有已经注册过的事件。
- 描述符变成可读之后,多路复用器返回,并调用用户提供的处理函数,开始读文件操作。
在Proactor中:
- 用户函数启动一个异步读文件的操作。同时将这个操作注册到多路复用器上。多路复用器并不关心文件是否可读而是关心这个异步读操作是否完成。
- 异步读文件是操作系统完成,用户程序不需要关心。多路复用器等待直到有完成通知到来。
- 当操作系统完成了读文件操作——将读到的数据复制到了用户先前提供的缓冲区之后,通知多路复用器读操作已完成。
- 多路复用器再调用相应的处理程序,处理数据。
I/O事件处理模型之Reactor和Proactor 【转】的更多相关文章
- IO模型之三Reactor 和 Proactor IO设计模式
反应器Reactor: 在事件驱动的应用中,应用中的请求总是通过事件(如CONNECTOR.READ.WRITE等)来表示,当多个请求同时到来时,这些请求最终还是会被序列化地处理,在序列化处理这些服务 ...
- 两种高效的事件处理模型:Reactor模式和Proactor模式
随着IO多路复用技术的出现,出现了很多事件处理模式.同步I/O模型通常由Reactor模式实现,而异步I/O模型则由Proactor模式实现. Reactor模式: Reator类图如上所示,Reac ...
- actor、reactor与proactor模型:高性能服务器的几种模型概念(转)
actor模型: 实体之通过消息通讯,各自处理自己的数据,能够实现这并行. 说白了,有点像rpc. skynet是actor模型. reactor模型: 1 向事件分发器注册事件回调 2 事件发生 4 ...
- I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...
- I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- I/O模型之四:Java 浅析I/O模型(BIO、NIO、AIO、Reactor、Proactor)
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- Reactor和Proactor模型
背景 前面介绍了I/O多路复用模型,那有了I/O复用,有了epoll已经可以使服务器并发几十万连接的同时,还能维持比较高的TPS,难道还不够吗?比如现在在使用epoll的时候一般都是起个任务,不断的去 ...
- Java NIO 与 基于reactor设计模式的事件处理模型
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...
- 【Network】一张图看懂 Reactor 与 Proactor 模型的区别
首先来看看Reactor模式,Reactor模式应用于同步I/O的场景.我们以读操作为例来看看Reactor中的具体步骤:读取操作:1. 应用程序注册读就需事件和相关联的事件处理器2. 事件分离器等待 ...
随机推荐
- 理解TensorFlow的Queue
https://www.jianshu.com/p/d063804fb272 这篇文章来说说TensorFlow里与Queue有关的概念和用法. 其实概念只有三个: Queue是TF队列和缓存机制的实 ...
- linux下性能分析命令[总结]
1.前言 在linux下开发程序,为了追求高性能,经常需要测试程序的性能,包括cpu.内存.io.网络等等使用情况.liunx下提供了众多命令方便查看各种资源的使用情况.经常用的有ps.top.fre ...
- JAVA 报错exe4j中this executable was created with an evaluation 怎么办
如果使用未破解注册的exe4j打包JAR文件为EXE,运行EXE的时候就会出现下面的提示 打开exe4j软件,Change License或者是输入序列号,然后用注册机算一个注册码即可
- Discuz常见小问题-如何关闭验证码
进入后台,在防灌水,验证设置中可以切换哪些情况下是否使用验证码 如果启用验证码,也客户修改验证码的难度,样式.最后点击提交,完成之后可以退出到前台,测试是否能够不用验证码自动登录
- windows安装mycat(转)
http://blog.csdn.net/sc9018181134/article/details/53063798 1.先到github上下载mycat 2.下载完成后,解压.应该是这样一个样子 3 ...
- iOS 获取设备型号 ip6更新
//获得设备型号 + (NSString *)getCurrentDeviceModel:(UIViewController *)controller { ]; size_t len; char *m ...
- iOS 真机上图标不显示
今天在调试时发现模拟器上图标显示了.但真机上测试时发现图标不显示. 解决办法 57*57 的图标然后命名为: Icon.png 这样显示就正常了. 参考资料:http://www.cnblogs.c ...
- ZH奶酪:使用PHP调用REST API
原文:http://yuguo.us/weblog/php-rest-api/ 表征状态转移(英文:REpresentational State Transfer,简称REST)是Roy Fieldi ...
- JS实现拖动(2)
getBoundingClientRect() 来获取页面元素的位置 document.documentElement.getBoundingClientRect 该方法返回一个对象,从而获得页面中某 ...
- Eclipse经常使用快捷键
Eclipse经常使用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(中文简体操作系统是Alt+/) 高速修正:Ctrl+1 单词补全:Alt+/ 打开外部Java文档:Shift+F2 ...