
libevent源码分析
文章平均质量分 79
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
libevent库的使用--内置http服务器
如果希望构建本机应用程序,可以使用一般的基于网络的 libevent 接口;但是,越来越常见的场景是开发基于 HTTP 协议的应用程序,以及装载或动态地重新装载信息的网页。如果使用任何 AJAX 库,客户端就需要 HTTP,即使您返回的信息是 XML 或 JSON。libevent 中的 HTTP 实现并不是 Apache HTTP 服务器的替代品,而是适用于与云和 web 环境相关联的大规模转载 2013-12-19 21:59:56 · 7066 阅读 · 1 评论 -
libev源代码分析--基本的接口函数
ibev的代码很简练 但对于看他代码的人 简直就是噩梦 到处都是宏 宏还嵌套 于是我在看libev代码时 对其进行了还原 去掉了宏1struct ev_io {2int fd;3int events;4struct ev_watcher_l原创 2014-01-14 21:12:21 · 2197 阅读 · 0 评论 -
libev源代码分析--设计思想
Libev设计思路理清了Libev的代码结构和主要的数据结构,就可以跟着示例中接口进入到Libev中,跟着代码了解其设计的思路。这里我们管struct ev_loop称作为事件循环驱动器而将各种watcher称为事件监控器。1.分析例子中的IO事件这里在前面的例子中我们先把定时器和信号事件的使用注释掉,只看IO事件监控器,从而了解Libev最基本的逻辑。可以结合Gdb设断点一步一步原创 2014-01-14 21:18:03 · 3989 阅读 · 0 评论 -
libev源代码分析--事件监控器
另外两个重要的监控器前面通过IO监控器将Libev的整个工作流程过了一遍。中间滤过了很多与其他事件监控器相关的部分,但是整体思路以及很明晰了,只要针对其他类型的watcher看下其初始化和注册过程以及在ev_run中的安排即可。这里我们再分析另两个常用的watcher1.分析定时器监控器定时器在程序中可以做固定周期tick操作,也可以做一次性的定时操作。Libev中与定时器类似的还原创 2014-01-14 21:18:48 · 1756 阅读 · 0 评论 -
libev源代码分析--事件模型 ae
Redis自己的事件模型 ae1.Redis的事件模型库大家到网上Google“Redis libevent”就可以搜到Redis为什么没有选择libevent以及libev为其事件模型库,而是自己写了一个事件模型。从代码中可以看到它主要支持了epoll、select、kqueue、以及基于Solaris的event ports。主要提供了对两种类型的事件驱动:IO事件原创 2014-01-14 21:20:15 · 2042 阅读 · 0 评论 -
libev源代码分析--总体框架
先上一个例子,看看libev是怎么使用的吧。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455// a原创 2014-01-14 21:21:31 · 3944 阅读 · 0 评论 -
libevent的使用--socket异步编程
这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的函数(或接口)并向系统注册,然后在需要的时候只向系统提交读写的请求之后就继续做自己的事情,实际的读写操作由系统在合适的时候调用我们程序注册的接口进行。异步编程会给一些程序猿带来一些理解和编写上的困难,原创 2014-01-12 09:26:18 · 2327 阅读 · 0 评论 -
libevent源码分析---基本使用场景和事件流程
当应用程序向libevent 注册一个事件后,libevent 内部是怎么样进行处理的呢?下面的图就给出了这一基本流程。1) 首先应用程序准备并初始化event,设置好事件类型和回调函数;这对应于event_set()和event_base_set()两个函数;2) 向libevent 添加该事件event。对于定时事件,libevent 使用一个小根堆管理,key为超时时间;原创 2014-01-13 10:01:16 · 3289 阅读 · 0 评论 -
libevent和libev
构建现代的服务器应用程序需要以某种方法同时接收数百、数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作。有许多解决方 案,但是 libevent 库和 libev 库能够大大提高性能和事件处理能力。在本文中,我们要讨论在 UNIX® 应用程序中使用和部署这些解决方案所用的基本结构和方法。libev 和 libevent 都可以在高性能应用程序中使用,包括部署在 IBM C转载 2013-12-15 23:30:38 · 3323 阅读 · 0 评论 -
libev源代码分析--设计分析
此文主要分析libev 的设计架构与算法实现,阅读这篇文章之前,你需要对libev 的使用有大致的了解;libev 提供了很多watcher 供开发者使用 ,以下仅对最重要最常用的几个watcher 机制进行分析,从中我们可掌握整个libev的设计思想,如果你想了解更多,可查阅libev的相关代码或文档。ev_io_watcher如我们所知,新的fd总是系统可用的最原创 2014-01-14 21:15:57 · 2296 阅读 · 0 评论 -
libev源码分析--libev的使用
使用LibevLibev的作者写了一份很好的官方Manual,比较的齐全,即介绍了Libev的设计思想,也介绍了基本使用还包括内部各类事件详细介绍。这里略微赘述一下。Libev通过一个 ·struct ev_loop· 结结构表示一个事件驱动的框架。在这个框架里面通过ev_xxx结构,ev_init、ev_xxx_set、ev_xxx_start接口箱这个事件驱动的框架里面注册事件监控器,当相原创 2014-01-14 21:17:13 · 1849 阅读 · 0 评论 -
libevent源码分析---回顾主要的结构体
以前忘记说明,这里源码分析使用的是libevent库的1.4.12-stable版本,在2.0以上的版本都是4W+行,过于庞大,网络上看到关于libevent库中几个重要的结构体关系图,很清楚很好,感谢原作者的细致:(虚线部分代表包含关系)一、tail_queue 关于tail_queue的解释在上篇文章中很细致。二、event //event提供了函数接口转载 2014-02-23 09:20:21 · 2229 阅读 · 1 评论 -
libevent源码分析---让libevent支持多线程
Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libevent,跟源代码并没有太大的关系,纯粹是使用上的技巧。1 错误使用示例 在多核的CPU上只使用一个线程始终是对不起CPU的处理能力啊,那好吧,那就多创建几个线程,比如下面的简单服务器场景。1 主线程创建工作线程1;2 接着主线程监听在端口上,等待新的转载 2014-03-07 20:40:40 · 4420 阅读 · 1 评论 -
libevent源码分析--libevent库对信号事件的处理
信号的处理在libevent中也是一个很重要的部分,同时处理的也很巧妙,这里根据自己的理解分析其堆信号的处理。和信号相关的几个重要API都是如何调用的。这是网上关于libevent处理信号的过程图解(感谢原作者,由这个图来分析libevent如何处理信号的)一、evsignal_init()函数(这里的分析都是按照IO复用机制的epOLL) 这个信号初始化在epol转载 2014-02-20 21:24:27 · 2573 阅读 · 0 评论 -
开源网络库的分析libevent muduo nginx ....
最经看关于网络编程的一些书,对于网络编程中的一些基本东西,开源库已经封装的很好了,但是库归根结底还是使用的基本API,所以就想着分析一下,尤其是在看了各个库的介绍以后,所以这段时间想在这个方向投入一点时间,虽说还是要复习考试!!!!原创 2013-12-15 23:02:19 · 8401 阅读 · 0 评论 -
libevent源码分析--evbuffer缓冲
前言 可以说对于任何网络库(模块)而言,一个缓冲模块都是必不可少的。缓冲模块主要用于缓冲从网络接收到的数据,以及用户提交的数据(用于发送)。很多时候,我们还需要将网络模块层(非TCP层)的这些缓冲数据拷贝到用户层,而这些内存拷贝都会消耗时间。 在这里,我简要分析下libevent的相关代码(event.h和buffer.c)。结构 关于libe原创 2014-03-04 14:02:24 · 5034 阅读 · 2 评论 -
libevent源码分析--epoll_dispatch()
static int192 epoll_dispatch(struct event_base *base, void *arg, struct timeval *tv)193 {194 struct epollop *epollop = arg;195 struct epoll_event *events = epollop->events;196 struct原创 2014-01-14 17:15:16 · 2090 阅读 · 0 评论 -
libev源代码分析--数据结构
libev的代码很简练,除了对高效I/O模型等的封装文件,核心文件就两个:ev.h和ev.c,其中ev.c大概4000行左右。代码大量用到了宏,并且宏还嵌套了宏,为了便于理解libev的代码,这里对宏进行了还原。 ev_watcher结构体(其成员为其它结构的公共部分): typedef struct ev_watcher {int active;//激活标识int pe原创 2014-01-14 21:09:15 · 1576 阅读 · 0 评论 -
libev源代码分析--初识
ibev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。 libev的基本使用方法如下:int main (void) { // use the default event loop unless you have special needs struct原创 2014-01-14 21:08:10 · 1851 阅读 · 0 评论 -
libev源代码分析--ev_io实现
1. ev_watcher和ev_loopev_watcher:libev中所有事件的基础类型ev_watcher,所有的事件都可以通过(W)watcher转换成ev_watcher,大写的W在libev定义的是ev_watcher *。抽象出ev_watcher作用是所有的watcher都可以共用ev_start、ev_stop函数下面用ev_TYPE表示ev_io、ev_tim原创 2014-01-14 21:11:16 · 2615 阅读 · 0 评论 -
libevent源代码分析--libevent核心event
对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的管理。1 libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相转载 2013-12-16 19:35:42 · 1696 阅读 · 0 评论 -
libevent源码分析-- queue.h中TAILQ_QUEUE的理解
libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,但是是一个缩减版本,而且没有看到queue 的access method,不知道是不是跟我们的linux服务器版本有关,没办法google了一下,找到了FreeBSD 下queue.h的定义,我们看一下tail queue的定义#define TAIL原创 2014-02-21 17:08:08 · 7511 阅读 · 3 评论 -
libevent源码分析--核心部分event
对事件处理流程有了高层的认识后,本节将详细介绍libevent 的核心结构event,以及libevent对event的管理。1 libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执原创 2014-01-13 10:21:11 · 2361 阅读 · 2 评论 -
libevent源代码分析--buffer的使用
你可能注意到随着我们代码变得越来越高效,程序也变得更加复杂。当我们产生一个进程的时候,我们没有必要为每一个链接管理一个buffer,我们只需要每个处理独立栈分配缓冲区就可以了。在读和写的时候,我们不必明确的跟踪每一个socket,这在我们的代码里是一个暗示,我们没有必要定义一个结构体去跟踪每一个操作什么时候完成,我们只需要使用循环栈变量就可以了。 此外,如果你在windows网原创 2013-12-20 22:53:59 · 2478 阅读 · 0 评论 -
libevent的使用方法--回显服务器的简单实例
#include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 8080int debug = 0;struct client { int fd; struct bufferevent *buf_ev;};原创 2013-12-19 20:43:00 · 2388 阅读 · 0 评论 -
libevent源码分析--事件处理框架
前面已经对libevent的事件处理框架和event结构体做了描述,现在是时候剖析libevent对事件的详细处理流程了,本节将分析libevent的事件处理框架event_base和libevent注册、删除事件的具体流程,可结合前一节libevent对event的管理。1 事件处理框架-event_base回想Reactor模式的几个基本组件,本节讲解的部分对应于Reactor框架转载 2013-12-18 12:17:44 · 1833 阅读 · 0 评论 -
libevent源码分析--evbuffer和bufferevent的关系
在libevent中还有一个很重要的部分。evbuffer和bufferevent。evbuffer是一个缓冲区,用户可以向evbuffer添加数据,evbuffer和bufferevent经常一起使用,或者说bufferevent使用了evbuffer,bufferevent有两个evbuffer缓冲,还有event。说明bufferevent是一个带有缓冲区的I/O。可以使用它们!用户原创 2014-03-04 20:55:32 · 4757 阅读 · 0 评论 -
libevent源码分析--epoll_add()函数
首先看看add函数实在event_add函数中调用的,肯定是evsel->add的方式调用的。259 static int260 epoll_add(void *arg, struct event *ev)261 {262 struct epollop *epollop = arg;263 struct epoll_event epev = {0, {0}}原创 2014-01-14 17:11:53 · 2621 阅读 · 0 评论 -
libevent源码分析--I/O 定时 信号 被处理的安排
关于这几个事件对应的初何时何地初始化、何时何地事件被添加、何时何地添加到激活队列、处理流程:一、i/o事件 I/O事件的初始化是在event_set函数中被初始化 I/O事件的添加是在event_add函数中进行二、定时事件 定时事件的初始化是在event_add函数中进行,这个函数初始化了一些I/O和定时事件 定时事件添加原创 2014-03-07 21:55:49 · 2489 阅读 · 0 评论 -
libevent源代码文件组织
——libevent源代码文件组织1 前言详细分析源代码之前,如果能对其代码文件的基本结构有个大概的认识和分类,对于代码的分析将是大有裨益的。本节内容不多,我想并不是说它不重要!2 源代码组织结构Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent框架、对系统I/O多路复用机制的封装、转载 2013-12-16 19:06:07 · 1969 阅读 · 0 评论 -
libevent源码分析--如何将定时器和信号事件都集合到I/O复用中
我的理解: 在I/O多路复用机制用(这里使用epoll作为例子),epoll_wait在一定的时间内监听需要受到关注的套接字,如果只是关注I/O事件,这样就会很简单,在设置时间的时候没有任何限制,此函数返回后,得到的有事件的套接字的个数,在libevent中使用的event_base_loop这个函数打到这个目的的,里面的evse->dispatch()这个函数就是epoll_wa原创 2014-02-18 21:58:33 · 2259 阅读 · 0 评论 -
libevent源码分析--event_set()函数
如果按照正常使用libevent库的流程来说,首先调用event_init()函数,然后调用event_set()函数,然后event_add()函数,然后是event_dispatch()函数。1、event_init() 创建一个event_base对象也就是创建一个新的libevent实例,该函数同时还堆新生成的libevent实例进行了初始化。首先为event_base实例申请了空间,原创 2014-01-13 22:05:31 · 8911 阅读 · 0 评论 -
libevent源码分析--定时器和信号事件处理
Timer事件反应堆event_base包含了一个最小堆min_heap结构体的实例,以此维护注册到这个反应堆实例的定时器事件:view sourceprint?1.structevent_base {2.//其他成员3.structmin_heap timeheap;4.};回顾一下最小堆min_heap:view sour原创 2014-02-21 11:44:45 · 4584 阅读 · 0 评论 -
libevent源码分析--I/O事件
本文将从一个使用libevent的小例子出发,解释libevent处理事件的流程.例子如下:01.staticvoid fifo_read(intfd, short event, void *arg) {...}02. 03.intmain (int argc, char **argv)04.{05.intsocket = open ("/t原创 2014-02-21 12:16:12 · 2178 阅读 · 0 评论 -
libevent源代码分析——event_dispatch() (二)
在上篇文章中介绍关于event_dispatch的大体框架,这里对其中的几个重要的函数解释说明1、timeout_correct(base,&tv)static void 889 timeout_correct(struct event_base *base, struct timeval *tv) 890 { 891 struct event **pev; 892原创 2014-01-14 15:19:04 · 2336 阅读 · 0 评论 -
libevent源代码分析--event_dispatch() (一)
event_dispatch这个函数是以上所有处理都结束以后,最后的一个借口调用,其实和这个函数类似的函数有好几个,接下来一一分析。int 405 event_dispatch(void) 406 { 407 return (event_loop(0)); 408 }可以返现event_dispatch只有一个调用event_loop(),但是event_loop函数的调原创 2014-01-14 14:44:27 · 7276 阅读 · 0 评论 -
libevent源码分析--event_add()函数
event_add是第三个函数,函数参数ev是指向要注册的事件,tv是超时时间,函数将ev注册到ev->ev_base上,事件类型由ev->ev_events指明。如果注册成功,ev讲被插入到已经注册链表中,如果tv不是null,则会同时注册定时事件,将ev添加到timer堆上,其中的巧妙之处请看以下分析int 720 event_add(struct event *ev, const原创 2014-01-13 22:14:04 · 8741 阅读 · 0 评论 -
libevent源码分析--event_init()函数
尝试着解释几个重要的函数,首先是event_inint()函数,这个函数式最初就需要使用的函数,此函数初始化了一个全局的变量current_base,也就是event_base,默认情况下所有的event都是在想这个变量中添加。struct event_base *event_init(void) { struct event_base *base = event_base_new原创 2014-01-13 21:20:27 · 6459 阅读 · 1 评论 -
libevent源码分析--事件处理框架
前面已经对libevent的事件处理框架和event结构体做了描述,现在是时候剖析libevent对事件的详细处理流程了,本节将分析libevent的事件处理框架event_base和libevent注册、删除事件的具体流程,可结合前一节libevent对event的管理。1 事件处理框架-event_base 回想Reactor模式的几个基本组件,本节讲解的部分对应于Reacto原创 2014-01-13 11:10:44 · 2193 阅读 · 0 评论 -
libevent源码分析--代码结构
Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent 框架、对系统I/O多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于libevent的两个实用库等几个部分,有些部分可能就是一个源文件。源代码中的test部分就不在我们关注的范畴了。1)头文件主要就是原创 2014-01-13 10:05:52 · 2554 阅读 · 5 评论