I/O事件处理模型之Reactor和Proactor 【转】
2013-09-20 14:31
381 查看
http://blog.ddup.us/?p=280
这篇博客说的很清楚,赞一个:
在编写服务端软件的时候,如何处理各种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多路复用的单线程处理模型。
这里有三个重要的组件:
多路复用器:由操作系统提供,在linux上一般是select, poll, epoll等系统调用。
事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中。
事件处理器:负责处理特定事件的处理函数。
因为这种模型经常使用,所有不少人对简单的系统调用做了一层封装,形成跨平台的事件处理库,比较典型的有:libevent,libev,boost asio等。
多路复用器等待上述描述符的可读事件以及其它所有已经注册过的事件。
描述符变成可读之后,多路复用器返回,并调用用户提供的处理函数,开始读文件操作。
异步读文件是操作系统完成,用户程序不需要关心。多路复用器等待直到有完成通知到来。
当操作系统完成了读文件操作——将读到的数据复制到了用户先前提供的缓冲区之后,通知多路复用器读操作已完成。
多路复用器再调用相应的处理程序,处理数据。
这篇博客说的很清楚,赞一个:
在编写服务端软件的时候,如何处理各种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中:
用户函数启动一个异步读文件的操作。同时将这个操作注册到多路复用器上。多路复用器并不关心文件是否可读而是关心这个异步读操作是否完成。异步读文件是操作系统完成,用户程序不需要关心。多路复用器等待直到有完成通知到来。
当操作系统完成了读文件操作——将读到的数据复制到了用户先前提供的缓冲区之后,通知多路复用器读操作已完成。
多路复用器再调用相应的处理程序,处理数据。
相关文章推荐
- 两种高效的事件处理模型:Reactor模式和Proactor模式
- 两种高效的事件处理模型:Reactor模式和Proactor模式
- I/O事件处理模型之Reactor和Proactor
- I/O事件处理模型之Reactor和Proactor
- Java NIO 与 基于reactor设计模式的事件处理模型
- 服务端处理事件的两种模式--Reactor和Proactor
- reactor/proactor两种高效的事件处理模式和并发模式
- reactor&&proactor 两种高效的事件处理模式
- [ i/o 模型 ] Reactor 事件处理模式流程
- ACE笔记(3) -用ACE_Reactor 实现SOCKET事件处理
- Nginx 进程模型及事件处理机制
- 把Proactor与Reactor事件集成的演示代码
- sax(用于处理XML事件驱动的推模型)解析例子
- JavaScript 事件模型 事件处理机制
- 高性能IO模型浅析-Reactor与Proactor
- 【Network】一张图看懂 Reactor 与 Proactor 模型的区别
- 基于管道化和事件驱动模型的Web请求处理(一)
- reactor/proactor模型简介
- [疯狂Java笔记]事件处理:Java事件处理模型
- Spice工作原理及代码剖析:02 Spice网络事件处理模型