Proactor模式(二)

上次写Blog的时候Proactor并没有说的十分清楚。

这次用aio_read工作流程来举个例子:

  1. 主线程调用aio_read函数向内核注册fd的读完成事件以及buffer,期望读取多少字节,偏移是多少和怎么回馈给应用程序(Linux上一般都是信号)。
  2. 主程序继续执行自己的业务,不需要等待aio_read。这时候aio_read存在两种可能性,一种是数据已经读入buffer,另一种书数据还没读入buffer。
  3. 当fd的数据读取到用户缓冲区之后,内核立刻通知程序数据读取完成(Linux上一般是信号),需要程序进行处理。

在Erlang中并没有使用aio系列函数,而是使用的模拟Proactor。

先让我说下什么是模拟Proactor,模拟Proactor就是使用一个线程不断的使用select/epoll/kevent等函数等待IO事件,并且当IO事件发生后完成所对应的读写操作,并且通过队列的方式将结果送到工作线程上

为什么Erlang选择了模拟Proactor模式,这个和Erlang的整个模型是息息相关的。Erlang使用的是actor模型,所有的东西都被映射为Erlang的进程,这些进程之间的通信是通过消息进行的。Erlang为了执行它自己的Erlang进程,就需要将Erlang进程和物理线程关联起来,就要自己实现调度,而这个调度是在用户层完成的。所以Erlang的scheduler本身是一个没有阻塞行为的线程(除休眠状态外),它不断的去检查Erlang进程队列,如果发现有Erlang进程可执行,就执行该任务的OPcode或者BIF来完成相应的功能。那么这时候就产生了一个问题,网络IO的select操作,文件读写的阻塞操作会阻碍scheduler检查Erlang的进程队列,那该怎么办?Erlang的大神很自然的想到了模拟Proactor模式。Erlang的inet是一个内连驱动,内部实现了一个队列,当一个Erlang进程发起IO操作的时候,就将这个操作进行一下封装放入这个队列中,等待IO线程被唤醒的时候去执行。当数据读取成功后,IO线程将所有的数据读取好作为一个消息放入相对应的Erlang进程的信箱中,这样当scheduler去再次检查这个进程的时候,就可以进行后续的业务处理。这样IO和业务处理就被很好的分离开来。

时间: 2024-10-12 21:32:54

Proactor模式(二)的相关文章

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

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

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).开发人员预先注册需要处理的事件及其事件

Java进阶知识点5:服务端高并发的基石 - NIO与Reactor模式以及AIO与Proactor模式

一.背景 要提升服务器的并发处理能力,通常有两大方向的思路. 1.系统架构层面.比如负载均衡.多级缓存.单元化部署等等. 2.单节点优化层面.比如修复代码级别的性能Bug.JVM参数调优.IO优化等等. 一般来说,系统架构的合理程度,决定了系统在整体性能上的伸缩性(高伸缩性,简而言之就是可以很任性,性能不行就加机器,加到性能足够为止):而单节点在性能上的优化程度,决定了单个请求的时延,以及要达到期望的性能,所需集群规模的大小.两者双管齐下,才能快速构建出性能良好的系统. 今天,我们就聊聊在单节点

微信扫描支付订单数据生成类[模式二]

* *必要条件: *1.微信公共号 *2.微信公共号APPID *3.微信公共号 [微信支付] 绑定的 商户号MCH_ID *4. 微信公共号 商户支付密钥 * * 支付流程: * 1.调用统一下单,取得code_url,生成二维码 * 2.用户扫描二维码,进行支付 * 3.支付完成之后,微信服务器会通知支付成功 * 4.在支付成功通知中需要查单确认是否真正支付成功 业务流程说明: (1)商户后台系统根据用户选购的商品生成订单. (2)用户确认支付后调用微信支付[统一下单API]生成预支付交易:

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

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

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

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

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

C++设计模式之建造者模式(二)

3.省略指挥者Director的建造者模式 指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象.Direcotr针对抽象的建造者进行编程,如果需要不同的建造者,只需把建造者传入指挥者类,无需修改之前的代码. 在有些情况下,为了简化系统结构,可以省略指挥者Director,指挥者不再指导产品的创建过程.而是在Builder

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法