reactor模型框架图和流程图 libevent

学习libevent有助于提升程序设计功力,除了网络程序设计方面外,libevent的代码里有很多有用的设计技巧和基础数据结构,比如信息隐藏、函数指针、c语言的多态支持、链表和堆等等,都有助于提升自身的程序功力。
       程序设计不止要了解框架,很多细节之处恰恰也是事关整个系统成败的关键。只对libevent本身的框架大概了解,那或许仅仅是一知半解,不深入代码分析,就难以了解其设计的精巧之处,也就难以为自己所用。
       事实上libevent本身就是一个典型的Reactor模型,理解Reactor模式是理解libevent的基石。因此本篇将介绍典型的事件驱动设计模式——Reactor模式,并列出libevnet中的几个重要组件和Reactor的对应关系。
1 Reactor的事件处理机制
       首先来回想一下普通函数调用的机制:程序调用某函数?函数执行,程序等待?函数将结果和控制权返回给程序?程序继续处理。
       Reactor释义“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。使用libevent也就是向libevent框架注册相应的事件和回调函数;当这些事件发声时,libevent会调用这些回调函数处理相应的事件(I/O读写、定时和信号)。
       用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。
举个例子:你去应聘某xx公司,面试结束后。
       “普通函数调用机制”公司HR比较懒,不会记你的联系方式,那怎么办呢,你只能面试完后自己打电话去问结果;有没有被录取啊,还是被据了;
       “Reactor”公司HR就记下了你的联系方式,结果出来后会主动打电话通知你:有没有被录取啊,还是被据了;你不用自己打电话去问结果,事实上也不能,你没有HR的留联系方式。
2 Reactor模式的优点
        Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:
1)响应快,不必为单个同步事件所阻塞,虽然Reactor本身依然是同步的;
2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
3)可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;
4)可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性。

3 Reactor模式框架

使用Reactor模型,必备的几个组件:事件源、Reactor框架、多路复用机制和事件处理程序,先来看看Reactor模型的整体框架,接下来再对每个组件做逐一说明。

1)handle——事件源
Linux上是文件描述符,Windows上就是Socket或者Handle了,这里统一称为“句柄集”;程序在指定的句柄上注册关心的事件,在libevent中有三种类型的事件:定时器事件(time event)、信号事件(signal event)和I/O事件。

2)event demultiplexer——事件多路分发机制
由操作系统提供的I/O多路复用机制,比如select和epoll。程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上;当有事件到达时,event demultiplexer会发出通知事件处理程序“在已经注册的句柄集中,一个或多个句柄的事件已经就绪”;程序收到通知后,就可以在非阻塞的情况下对事件进行处理了。
对应到libevent中,依然是select、poll、epoll等,但是libevent使用结构体eventop进行了封装,以统一的接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的

3)Reactor——反应器
Reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件;并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。对应到libevent中,就是event_base结构体。

4)Event Handler——事件处理程序
事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供Reactor在相应的事件发生时调用,执行相应的事件处理。通常它会绑定一个有效的句柄。对应到libevent中,就是event结构体。

4 Reactor事件处理流程

在高性能服务器并发模型设计中,Reactor和Proactor是两个经常用到的设计模式,前者用于同步IO,后者用于异步IO,前者在IO操作 就绪的情况下通知用户,用户再采取实际的IO操作,后者是在IO操作完成后通知用户。

IOCP的设计就是Proactor 模式的完美体现,而epoll则很容易实现Reactor模式,asio设计为跨平台,并且在linux下采用epoll,我的印象中linux对异步 IO的支持没有windows那么完善(看看IOCP和epoll模型的区别就知道),那么asio是怎么用epoll机制实现proactor模式的 呢,刚开始想的是应该在应用层做了一层封装,就是asio内部应该有某个循环调用epoll_wait,当有IO事件就绪时帮用户做一些操作(比如把数据 拷贝到我们提交的缓冲区),然后在操作完成的时候调用我们的handler(后来看代码基本是这样).OK,不说废话了.

本质上来讲libevent应该是同步的,因为如果看到底层封装的select和epoll就会发现,里面仍然是个while循环,在不停的询问,是否准备就绪,
而异步同步IO的主要区别就是,应用发起一个 IO 操作以后,不等待内核 IO 操作的完成,等内核完成 IO 操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问 IO 是否完成,显然select和epoll是同步的。
另外本身Reactor模式就是同步的模式不是吗?

如果你理解底层的select或者epoll。你会发现它其实是同步的。有一个while循环,等待事件触发条件。满足条件则调用相应的callback函数。因此本质上还是同步的。不过长了一个异步的脸

libevent本身是一个Reactor,是同步的。但libevent的bufferevent是用Reactor实现了一个Proactor,所以libevent又是异步的

原文地址:https://www.cnblogs.com/wangshaowei/p/10640850.html

时间: 2024-10-14 05:26:41

reactor模型框架图和流程图 libevent的相关文章

Reactor模型

Reactor模型 原文地址:http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) ...... C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地

ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用

一:url转码,当url中涉及到中文的时候,要考虑转码,用UTF8对中文的url进行转码 #import "ViewController.h" @interface ViewController () @end @implementation ViewController #pragma mark ---------------------- #pragma mark Events -(void)touchesBegan:(NSSet<UITouch *> *)touche

【转】各种图(流程图,思维导图,UML,拓扑图,ER图)简介

原文地址:各种图(流程图,思维导图,UML,拓扑图,ER图)简介 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有广泛的应用. 2.案例 3.计算机语言只是一种工具.光学习语言的规则还不够,最重要的是学会针对各种类型的问题,拟定出有效的解决方法和步骤即算法.有了正确而有效的算法,可以利用任何一种计算机高级语言编写程序,使计算机进行工作.因此,设计算法是程序设计的核心. 对同一个问题,可以有不同的解题方法和步骤.例如,求1+2+3+…+100,可以先进

SpringMVC框架图解析

Spring框架提供了构造Web应用程序的全能MVC模块.Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行制定.是一个标准的MVC框架. 那你猜一猜哪一部分应该是哪一部分? SpringMVC框架图 SpringMVC接口解释 DispatcherServlet接口: Spring提供的前端控制器,所有的请求都有经过它来统一分发.在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的H

WDM驱动模型框架简介

前几天刚刚看了<windows驱动开发技术详解>,在网上看到这篇文章时觉得总结的很好,所以整理收藏! ========================================================= WDM驱动程序的前世今生 2012年10月06日 ⁄ windows驱动开发 ⁄ 共 2710字 ⁄ 暂无评论 WDM驱动程序在2000年左右还是一种很新的东西,相信很多人都跟我一样,对它很感兴趣,但是又找不到学习的切入点.究其原因,还是因为WDM是一种非常“死板板”的程序,它一

uml中活动图与流程图的区别

活动图是UML用于对系统的动态行为建模的另一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流.活动图在本质上是一种流程图. 活动图定义: 活动图是系统的一种行为视图它描述参与行为的对象类的活动的顺序包括依赖于条件的行为和并发行为.活动图演示了系统中的功能流.如在业务模型中显示业务工作流在收集需求时显示一个用例中的事件流等.活动图定义了工作流从哪里开始到哪里结束工作流中发生了哪些活动这些活动按什么顺序发生活动是由哪些对象来完成的.活动图是状态图的一种扩展形式.如果在

怎样利用迅捷画图绘制精美思维导图,流程图

思维导图,流程图的用处是比较广泛的,大到企业,小到家庭很多人只知道有这样的软件但是却从来没有上手操作过,所以今天分享一个可以绘制思维导图以及流程图请添加链接描述的在线网站迅捷画图. 工具/原料: 电脑,浏览器,网络,迅捷画图 操作方法介绍: 绘制思维导图操作方法: 1.既然是利用迅捷画图在线网站进行绘制思维导图首先要做的就是打开网站,进入到操作界面中,选择页面中央位置的"进入迅捷画图",会跳转到新建文件页面中. 2.这里要绘制的是思维导图,点击新建文件之后会有四个选项可以选择,点击思维

Netty Reator(三)Reactor 模型

Netty Reator(三)Reactor 模型 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 本文介绍 DC Schmidt 大神的一篇文章<Reactor: an object behavioral pattern for concurrent event demultiplexing and event handler dispatching> 一.What:Reactor 模式是什么? 反应器设计模式(R

如何在线绘制思维导图、流程图神奇,简单方法介绍

思维导图与流程图的用处非常广泛,不管是工作还是的学习都能用的上,看到别人画的思维导图.流程图都那么高大上,自己也想试试看?下面就教大家如何在线绘制思维导图.流程图. 工具/原料: 电脑 迅捷画图 思维导图绘制步骤: 1.既然是要画思维导图,那么在添加文件的时候,就需要选择新建思维导图的,否则是画不出来的,首先点击[立即体验]进入选择 2.点击左上角[新建]-[思维导图]它就会自动进入画图的页面,如图所示,可以看到绘图工具栏.文件名,中心节点: 3.首先,需要用鼠标右击图中的中心节点,会弹出编辑状