proactor模式

最近在开发一个叫做medis的项目,虽然进度很缓慢,但是可以不断的去思考如何可以做的更好。

对于网路IO中的事件处理模式最常见的方式是reactor模式,这种模式一般是每一个线程一个poller或者多个线程共享一个poller。这种事件处理模式是将准备就绪的Socket放入队列交给业务线程去读取数据和处理。

而在Windows的开发中有一个非常特别的poller叫做IOCP,它的特别之处在什么地方呢?IOCP的工作方式,是将一个Socket和一个Buffer关联起来,然后发起读或者写的操作。当IOCP接到这个请求后,它会记录Socket和Buffer的关联,当Socket上相应的可读或可以事件发生时,就将Buffer中的数据填充好或发送出去。当完成上面那些工作后IOCP直接发送信号通知应用数据已经被读取了或者已经被发送了,这样应用面对的是数据而不是一个Socket。这样会让应用更加清晰,同时IOCP这么实现减少了不必要的系统调用。

先写到这里,Proactor在Unix/Linux上的意义还没有想的非常清晰。

时间: 2024-11-11 12:15:25

proactor模式的相关文章

对于观察者模式,Reactor模式,Proactor模式的一点理解

最近就服务器程序IO效率这一块了解一下设计模式中的Reacotr模式和proactor模式,感觉跟观察者模式有些类似的地方,网上也看了一些其他人对三者之间区别的理解,都讲得很仔细,在此根据自己的理解做一点简单的记录和总结,如果理解不对的地方,以后再慢慢深入和更新. 观察者模式: 也可以称为为 发布-订阅 模式,主要适用于多个对象依赖某一个对象的状态并,当某对象状态发生改变时,要通知其他依赖对象做出更新.是一种1对多的关系.当然,如果依赖的对象只有一个时也是一种特殊的一对一关系.通常,观察者模式适

高性能IO设计中的Reactor模式与Proactor模式

在高性能的IO设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作.在比较这两个模式之前,我们首先要搞明白几个概念.什么是阻塞和非阻塞?什么是同步和异步?同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知).而阻塞和非阻塞是针

(原创)拨开迷雾见月明-剖析asio中的proactor模式(二)

在上一篇博文中我们提到异步请求是从上层开始,一层一层转发到最下面的服务层的对象win_iocp_socket_service,由它将请求转发到操作系统(调用windows api),操作系统处理完异步请求之后又是如何返回给应用程序的呢,这里是通过iocp(完成端口)来实现的.让我们先来简要的看看iocp的基本步骤: 创建IOCP对象: 创建io object对象: 将io object IOCP对象绑定: 4.进行异步调用: 创建线程或者由线程池等待完成事件的到来: asio实际上也是按照这个步

两种高效的事件处理模型:Reactor模式和Proactor模式

随着IO多路复用技术的出现,出现了很多事件处理模式.同步I/O模型通常由Reactor模式实现,而异步I/O模型则由Proactor模式实现. Reactor模式: Reator类图如上所示,Reactor模式又叫反应器或反应堆,即实现注册描述符(Handle)及事件的处理器(EventHandler),当有事件发生的时候,事件多路分发器(Event Demultiplexer)做出反应,调用事件具体的处理函数(ConcreteEventHandler::handle_event()). Rea

Proactor模式(三)

文中所有的Proactor模式,均指模拟Proactor模式,而不是操作系统级别的Proactor 先说下Erlang的check_io是做什么用的.Erlang中的check_io实质是调用系统的epoll/select/kevent/poll对IO事件进行检查. 那么问题就产生了,Erlang的网络模型不是Proactor模式嘛,它和scheduler有什么关系? 为了回答这个问题,我们先说下Erlang的Proactor模式和常规的Proactor模式有什么样的差异. Erlang所采用P

Proactor模式(二)

上次写Blog的时候Proactor并没有说的十分清楚. 这次用aio_read工作流程来举个例子: 主线程调用aio_read函数向内核注册fd的读完成事件以及buffer,期望读取多少字节,偏移是多少和怎么回馈给应用程序(Linux上一般都是信号). 主程序继续执行自己的业务,不需要等待aio_read.这时候aio_read存在两种可能性,一种是数据已经读入buffer,另一种书数据还没读入buffer. 当fd的数据读取到用户缓冲区之后,内核立刻通知程序数据读取完成(Linux上一般是信

Reactor和Proactor模式的讲解(关于异步,同步,阻塞与非阻塞)

在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知).而阻塞和非阻塞

Reactor模式与Proactor模式

该文章总结了网上资源对这两种模式的描述 原文地址:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html 1.标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer).分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler).开发人员预先注册需要处理的事件及其事件

reactor与proactor模式

在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步. 同步和异步是针对应用程序和内核的交互而言的. 同步是指用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪, 异步是指用户进程触发IO操作之后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知. 阻塞和非阻塞是进行系统调用的时候函数的实现方式. 阻塞方式下读取或者写入函数将一直等待,写入即将数据从IO缓冲区写入到内核缓冲区.也就是说返回的时候并不是真正的传入对端. 非阻塞方式下,读取或者

高性能IO设计的Reactor和Proactor模式(转)

在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知.而阻塞和非阻塞是针对于进程在访问数据