复述中事件驱动模型的作用是什么

  介绍

这篇文章给大家介绍复述中事件驱动模型的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强>前言

复述是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。

<李>

文件事件

<李>

时间事件

下面就会介绍这两种事件的实现原理。

<强>文件事件

复述,服务器通过插座实现与客户端(或其他复述,服务器)的交互,文件事件就是服务器对套接字操作的抽象。复述,服务器,通过监听这些插座产生的文件事件并处理这些事件,实现对客户端调用的响应。

<强>反应堆

复述,基于反应堆模式开发了自己的事件处理器。

这里就先展开讲一讲反应堆模式。看下图:

复述中事件驱动模型的作用是什么

" I/O多路复用模块”会监听多个FD,当这些FD产生,接受,读、写或关闭的文件事件。会向“文件事件分发器(调度)”传送事件。

文件事件分发器(调度)在收到事件之后,会根据事件的类型将事件分发给对应的处理程序。

我们顺着图,从上到下的逐一讲解复述是怎么实现这个反应堆模型的。

<强> I/O多路复用模块

复述的I/O多路复用模块,其实是封装了操作系统提供的选择、epoll, avport和kqueue这些基础函数。向上层提供了一个统一的接口,屏蔽了底层实现的细节。

一般而言复述,都是部署到Linux系统上,所以我们就看看使用复述是怎么利用Linux提供的epoll实现I/O多路复用。

首先看看epoll提供的三个方法:

/*   ,*创建一个epoll的句柄,用大小来告诉内核这个监听的数目一共有多大   ,*/int  epoll_create (int 大小);/*   ,*可以理解为,增删改,fd 需要监听的事件   是,* epfd  epoll_create(),创建的句柄。   ,* op 表示,增删改   ,* epoll_event 表示需要监听的事件,Redis 只用到了可读,可写,错误,挂断,四个状态   ,*/int  epoll_ctl (int  epfd, int  op,, int  fd,, struct  epoll_event  *事件);/*   ,*可以理解为查询符合条件的事件   是,* epfd  epoll_create(),创建的句柄。   ,* epoll_event 用来存放从内核得到事件的集合   ,* maxevents 获取的最大事件数   ,* timeout 等待超时时间   ,*/int  epoll_wait (int  epfd, struct  epoll_event  *,事件,int  maxevents,, int 超时),

再看复述,对文件事件、封装epoll向上提供的接口:

/*   ,*事件状态   ,*/typedef  struct  aeApiState  {      ,//epoll_event 实例描述符   ,int  epfd;      ,//事件槽   ,struct  epoll_event  *事件;      },aeApiState;/*   ,*创建一个新的,epoll    ,*/static  int  aeApiCreate (aeEventLoop  * eventLoop)/*   ,*调整事件槽的大小   ,*/static  int  aeApiResize (aeEventLoop  * eventLoop, int  setsize)/*   ,*释放,epoll 实例和事件槽   ,*/static  void  aeApiFree (aeEventLoop  * eventLoop)/*   ,*关联给定事件到,fd   ,*/static  int  aeApiAddEvent (aeEventLoop  * eventLoop, int  fd,, int 面具)/*   *大敌;从,fd 中删除给定事件   ,*/static  void  aeApiDelEvent (aeEventLoop  * eventLoop, int  fd,, int 面具)/*   ,*获取可执行事件   ,*/static  int  aeApiPoll (aeEventLoop  * eventLoop, struct  timeval  *利用)

所以看看这个ae_peoll。c如何对epoll进行封装的:

<李>

aeApiCreate()是对epoll.epoll_create()的封装。

<李>

aeApiAddEvent()和aeApiDelEvent()是对epoll.epoll_ctl()的封装。

<李>

aeApiPoll()是对epoll_wait()的封装。

这样复述的利用epoll实现的I/O复用器就比较清晰了。

再往上一层次我们需要看看ea.c是怎么封装的?

首先需要关注的是事件处理器的数据结构:

typedef  struct  aeFileEvent  {   ,//监听事件类型掩码,   ,//值可以是,AE_READABLE 或,AE_WRITABLE ,   ,//或者,AE_READABLE  | AE_WRITABLE   ,int 面具;/*,one  of  AE_(可读|可写),*/,//读事件处理器   ,aeFileProc  * rfileProc;   ,//写事件处理器   ,aeFileProc  * wfileProc;   ,//多路复用库的私有数据   ,void  * clientData;   },aeFileEvent;

复述中事件驱动模型的作用是什么