这篇文章给大家介绍复述中事件驱动模型的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
<强>前言强>
复述是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。
- <李>
文件事件
李> <李>时间事件
李>下面就会介绍这两种事件的实现原理。
<强>文件事件强>
复述,服务器通过插座实现与客户端(或其他复述,服务器)的交互,文件事件就是服务器对套接字操作的抽象。复述,服务器,通过监听这些插座产生的文件事件并处理这些事件,实现对客户端调用的响应。
<强>反应堆强>
复述,基于反应堆模式开发了自己的事件处理器。
这里就先展开讲一讲反应堆模式。看下图:
" 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;复述中事件驱动模型的作用是什么