E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
libevent源码分析
Libevent源码分析
(三)--- IO多路复用模型
eventop和zeromq一样,libevevnt支持多种I/O多路复用技术,如epoll、poll、dev/poll、select和kqueue等,为了统一封装这些模型,libevent定义了eventop结构体:/**Structuretodefinethebackendofagivenevent_base.*/ structeventop{ /**Thenameofthisbackend.
tbyzs
·
2016-03-17 12:00
Libevent源码分析
(二)--- 时间管理
时间获取libevent使用两种方式获取时间,首选是通过clock_gettime的CLOCK_MONOTONIC参数获取绝对时间,这个时间是递增的,不受系统时间影响,比较准确。其次是使用gettimeofday或者_ftime,这两种方式都是获取系统时间,下面是相关代码:staticint gettime(structevent_base*base,structtimeval*tp) { EVE
tbyzs
·
2016-03-14 11:00
Libevent源码分析
(一)--- 基本数据结构
event结构体libevent是一个基于事件触发的网络库,它的特色之一是把I/O事件,定时器事件和信号量事件统一处理,对上层用户基本是透明的。在libevent内部这三种事件都用event结构体来表示,event是libevent中最基本的数据结构:structevent{ TAILQ_ENTRY(event)ev_active_next; TAILQ_ENTRY(event)ev_next;
tbyzs
·
2016-03-12 14:00
计划在CSDN学院推出系列视频课程《源码分析教程5部曲》
edu.csdn.net/course/detail/1926源码分析教程5部曲之2——C标准库概览:http://edu.csdn.net/course/detail/1927源码分析教程5部曲之3——
libevent
yangzhenping
·
2016-01-14 11:00
redis
源码
memcached
C语言
分析
Libevent源码分析
(一):最小堆
Libevent中的timeout事件是使用最小堆来管理维护的.代码位于<minheap-internal.h>. 看函数命名和代码风格应该是一个C++程序员,函数名都挺好懂的,只是下面这个结构体变量命名比较坑.... typedef struct min_heap { struct event** p; unsigned n, a;//n队列元素的多少,a
·
2015-11-11 10:30
libevent
libevent源码分析
这两天没事,看了一下Memcached和libevent的源码,做个小总结。 1、入门 1.1、概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库。Libevent有几个显著的亮点: (1)事件驱动(event-driven),高性能;(2)轻量级,专注于网络,不如 ACE 那么臃肿庞大; (3)源代码相当精炼、易读; (
·
2015-11-02 15:49
libevent
libevent源码分析
1、入门1.1、概述 Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库。Libevent有几个显著的亮点: (1)事件驱动(event-driven),高性能; (2)轻量级,专注于网络,不如 ACE 那么臃肿庞大; (3)源代码相当精炼、易读; (4)跨平台,支持 Windows、Linux、*BSD和 Mac Os; (5)支持
·
2015-11-01 13:39
libevent
libevent源码分析
1.Libevent有几个显著的亮点 libevent封装了底层最高效的网络模型,windows的compIO,linux下的epoll模型,freebsd的kqueue,提供统一的异步调用接口;以事件方式驱动,chrome,memcached都在使用该框架.libevent同时也支持DNS,HTTP协议和RPC调用框架。libevent总是选择对应系统框架下最优的多路复用技术(ep
a_liujin
·
2015-10-30 10:39
windows
libevent源码分析
1.Libevent有几个显著的亮点libevent封装了底层最高效的网络模型,windows的compIO,linux下的epoll模型,freebsd的kqueue,提供统一的异步调用接口;以事件方式驱动,chrome,memcached都在使用该框架.libevent同时也支持DNS,HTTP协议和RPC调用框架。libevent总是选择对应系统框架下最优的多路复用技术(epoll....)
a_liujin
·
2015-10-30 10:39
Windows
C++技术
libevent源码分析
1.Libevent有几个显著的亮点 libevent封装了底层最高效的网络模型,windows的compIO,linux下的epoll模型,freebsd的kqueue,提供统一的异步调用接口;以事件方式驱动,chrome,memcached都在使用该框架.libevent同时也支持DNS,HTTP协议和RPC调用框架。libevent总是选择对应系统框架下最优的多路复用技术(ep
a_liujin
·
2015-10-30 10:39
windows
libevent源码分析
使用libevent的最基本的步骤:1.创建event_base2.创建相应的event3.添加event4.启动事件循环下面通过简单例子:#include#include#includevoidtimerCallBack(evutil_socket_tfd,shortevent,void*arg){ printf("timeoutcall\n");}intmain(){ structeven
hai200501019
·
2015-10-25 19:00
libevent
Libevent源码分析
-timer和signal处理
timer处理Signal处理timerfd和signalfdtimerfdsignalfdtimer处理在
Libevent源码分析
-event处理流程中,使用了定时器,来看一下源码:evtimer_set
zhouzxi
·
2015-08-21 22:00
timer
libevent
Signal
Libevent源码分析
-event处理流程
event处理流程Libevent处理时间的大概流程为1、设置event_base(即初始化Reactor)2、设置event事件(初始化event)3、将event和event_base关联(将event注册到event_base)4、进入循环,等待事件5、事件发生,处理事件。用UML序列图可以表示为:#include #include #include structeventev; struc
KangRoger
·
2015-08-20 22:00
libevent
event
Reactor
Libevent源码分析
-event_base
event_base数据结构初始化event_base相关接口前面介绍了event,本节介绍Reactor的核心结构:event_base,它在event-internal.h中。event_base是整个libevent的核心,它持有所有注册的事件,并负责通知激活的事件。event_base数据结构structevent_base{ conststructeventop*evsel; void*
KangRoger
·
2015-08-20 10:00
libevent
Reactor
event-base
libevent源码分析
-event
event结构event相关接口Libevent对event的管理event结构event是Reactor模式中的最重要的组件。它包含了了一个句柄fd,并设置监听这个句柄上的哪些事件(读/写等),设置了对应的函数指针,在事件到来时,回调函数指针来处理事件。先看一下event的结构。它位于include/event2/event_struct.h中structevent{ TAILQ_ENTRY(e
KangRoger
·
2015-08-17 22:00
libevent
event
libevent源码分析
http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和libevent的源码,做个小总结。 1、入门1.1、概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库。Libevent有几个显著的亮点: (1)事件驱动(event-driv
boyka3721
·
2015-08-05 15:35
libevent源码分析
libevent源码分析
http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html这两天没事,看了一下Memcached和libevent的源码,做个小总结。1、入门1.1、概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库。Libevent有几个显著的亮点:(1)事件驱动(event-driven)
boyka3721
·
2015-08-05 15:35
libevent源码分析
C++
Libevent源码分析
-----evbuffer结构与基本操作
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39290721 对于非阻塞IO的网络库来说,buffer几乎是必须的。Libevent在1.0版本之前就提供了buffer功能。现在来看一下Libevent的buffer。buffer相关结构体: Libevent为buffer定义了下面的结构体:
qq_26733915
·
2015-04-07 22:00
[
libevent源码分析
] event_base_dispatch
分析下事件循环event_base_dispatchintevent_base_dispatch(structevent_base*event_base){return(event_base_loop(event_base,0));}intevent_base_loop(structevent_base*base,intflags){conststructeventop*evsel=base->e
youkuxiaobin
·
2015-03-07 06:05
network
Libevent源码分析
-----bufferevent工作流程探究
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39344743 和之前的《Libevent工作流程探究》一样,这里也是用一个例子来探究bufferevent的工作流程。具体的例子可以参考《Libevent使用例子,从简单到复杂》,这里就不列出了。其实要做的例子也就是bufferevent_socket_new、bufferev
zhwei_87
·
2015-01-30 11:00
Libevent源码分析
-----evthread_notify_base通知主线程
一般来说,是主线程执行event_base_dispatch函数。本文也是如此,如无特别说明,event_base_dispatch函数是由主线程执行的。notify的理由: 本文要说明的问题是,当主线程在执行event_base_dispatch进入多路IO复用函数时,会处于休眠状态,休眠前解锁。此时,其他线程可能想往event_base添加一个event,这个event可能是一般
zhwei_87
·
2015-01-30 11:00
Libevent源码分析
-----更多evbuffer操作函数
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39325447锁操作: 在前一篇博文可以看到很多函数在操作前都需要对这个evbuffer进行加锁。同event_base不同,如果evbuffer支持锁的话,要显式地调用函数evbuffer_enable_locking。[cpp] viewplaincopy//buffer.c
zhwei_87
·
2015-01-30 11:00
Libevent源码分析
-----evbuffer结构与基本操作
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39290721 对于非阻塞IO的网络库来说,buffer几乎是必须的。Libevent在1.0版本之前就提供了buffer功能。现在来看一下Libevent的buffer。buffer相关结构体: Libevent为buffer定义了下面的结构体:[
zhwei_87
·
2015-01-30 11:00
Libevent源码分析
-----连接监听器evconnlistener
使用evconnlistener: 基于event和event_base已经可以写一个CS模型了。但是对于服务器端来说,仍然需要用户自行调用socket、bind、listen、accept等步骤。这个过程有点繁琐,为此在2.0.2-alpha版本的Libevent推出了一些对应的封装函数。 用户只需初始化structsockaddr_in结构体变量,然后把它作为参数传给函数evco
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----通用类型和函数
Libevent定义了一系列的可移植的兼容类型和函数。这使得在各个系统上都有一致的效果,Libevent一般都会在兼容通用类型和函数的前面加上ev或evutil前缀。 在实现上,Libevent都是使用条件编译+宏定义的方式。使用这种方式,同一个宏名字,可以使得在不同的系统上,编译时得到不同的值。这种方式在跨平台编程中,经常使用到。此外,对于Libevent的兼容类型,如果所在系
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----管理超时event
前面的博文已经说到,如果要对多个超时event同时进行监听,就要对这些超时event进行集中管理,能够方便地(时间复杂度小)获取、加入、删除一个event。 在之前的Libevent版本,Libevent使用小根堆管理这些超时event。小根堆的插入和删除时间复杂度都是O(logN)。在2.0.4-alpha版本时,Libevent引入了一个叫common-timeout的东西来管
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----与event相关的一些函数和操作
Libevent提供了一些与event相关的操作函数和操作。本文就重点讲一下这方面的源代码。 在Libevent中,无论是event还是event_base,都是使用指针而不会使用变量。实际上,如果查看Libevent不同的版本,就可以发现event和event_base这两个结构体的成员是不同的。对比libevent-2.0.21-stable和libevent-1.4.13-s
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----超时event的处理
如何成为超时event: Libevent允许创建一个超时event,使用evtimer_new宏。[cpp] viewplaincopy//event.h文件 #define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) 从宏的实现来看,它一样是用到了一般的event_new,并
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----Libevent时间管理
基本时间操作函数: Libevent采用的时间类型是struct timeval,这个类型在很多平台都提供了。此外,Libevent还提供了一系列的时间操作函数。比如两个structtimeval相加、相减、比较大小。有些平台直接提供了一些时间操作函数,但有些则没有,那么Libevent就自己实现。这些宏如下:[cpp] viewplaincopy#ifdef _EVENT_HAVE_TI
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----信号event的处理
信号event的工作原理: 前面讲解了Libevent怎么对一个IO事件进行监听,现在来讲一下Libevent怎么监听信号。Libevent对于信号的处理是采用统一事件源的方式。简单地说,就是把信号也转换成IO事件,集成到Libevent中。 统一事件源的工作原理是这样的:假如用户要监听SIGINT这个信号,那么在实现的内部就对SIGINT这个信号设置捕抓函数。此外,在实现的内部还要
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----event优先级设置
event_base允许用户对它里面的event设置优先级,这样可以使得有些更重要的event能够得到优先处理。 Libevent实现优先级功能的方法是:用一个激活队列数组来存放激活event。即数组的元素是一个激活队列,所以有多个激活队列。并且规定不同的队列有不同的优先级。 可以通过event_base_priority_init函数设置event_base的优先级个数,该
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----Libevent工作流程探究
之前的博文讲了很多Libevent的基础构件,现在以一个实际例子来初步探究Libevent的基本工作流程。由于还有很多Libevent的细节并没有讲所以,这里的探究还是比较简洁,例子也相当简单。[cpp] viewplaincopy#include #include #include #include void cmd_cb(int fd, short events, vo
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----跨平台Reactor接口的实现
之前的博文讲了怎么实现线程、锁、内存分配、日志等功能的跨平台。Libevent最重要的跨平台功能还是实现了多路IO接口的跨平台(即Reactor模式)。这使得用户可以在不同的平台使用统一的接口。这篇博文就是来讲解Libevent是怎么实现这一点的。 Libevent在实现线程、内存分配、日志时,都是使用了函数指针和全局变量。在实现多路IO接口上时,Libevent也采用了这种方式,
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----配置event_base
前面的博文都是讲一些Libevent的一些辅助结构,现在来讲一下关键结构体:event_base。 这里作一个提醒,在阅读Libevent源码时,会经常看到backend这个单词。其直译是“后端”。实际上其指的是Libevent内部使用的多路IO复用函数,多路IO复用函数就是select、poll、epoll这类函数。本系列博文中,为了叙述方便,“多路IO复用函数”与“后端”这两
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----event_io_map哈希表
上一篇博客说到了TAILQ_QUEUE队列,它可以把多个event结构体连在一起。是一种归类方式。本文也将讲解一种将event归类、连在一起的结构:哈希结构。哈希结构体: 哈希结构由下面几个结构体一起配合工作:[cpp] viewplaincopystruct event_list { struct event *tqh_first; struct event
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----多线程、锁、条件变量(二)
Debug锁操作: Libevent还支持对锁操作的一些检测,进而捕抓一些典型的锁错误。Libevent检查:解锁自己(线程)没有持有的锁在未解锁前,自己(线程)再次锁定一个非递归锁。 Libevent通过一些变量记录锁的使用情况,当检查到这些锁的错误使用时,就调用abort,退出运行。开启调试功能: 用户只需在调用evthread_use_pthreads或者evt
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----TAILQ_QUEUE队列
Libevent源码中有一个queue.h文件,位于compat/sys目录下。该文件里面定义了5个数据结构,其中TAILQ_QUEUE是使得最广泛的。本文就说一下这个数据结构。队列结构体: TAILQ_QUEUE由下面两个结构体一起配合工作。[cpp] viewplaincopy#define TAILQ_HEAD(name, type)
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----多线程、锁、条件变量(一)
Libevent提供给用户的可见多线程API都在thread.h文件中。在这个文件提供的API并不多。基本上都是一些定制函数,像前面几篇博文说到的,可以为Libevent定制用户自己的多线程函数。开启多线程: Libevent默认是不开启多线程的,也没有锁、条件变量这些东西。这点和前面博客说到的"没有定制就用Libevent默认提供",有所不同。只有当你调用了evthread_use_
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----日志和错误处理
日志处理: 在Libevent的源码中,经常会见到形如event_warn、event_msgx、event_err之类的函数。这通常出现在代码中一些值是不合理时。这些函数就是Libevent的日志函数。它能把这些不合理的情况打印出来,告知用户。定制日志回调函数: Libevent在默认情况下,会将这些日志信息输出到终端上。这当然就不利于日后的观察。为此,Libevent允许用户定制
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----内存分配
Libevent的内存分配函数还是比较简单的,并没有定义内存池之类的东西。如同前一篇博客那样,给予Libevent库的使用者充分的设置权(定制),即可以设置用户(Libevent库的使用者)自己的内存分配函数。至于怎么分配,主动权在于用户。但在设置(定制)的时候要注意一些地方,下面会说到。 首先,如果要定制自己的内存分配函数,就得在一开始配置编译Libevent库是,不能加入--disab
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----event-config.h指明所在系统的环境
如果你打开Libevent的一些文件,比如util.h文件。就会发现使用了很多宏定义,并根据一些宏定义而进行条件编译。这些宏定义往往来自event-config.h文件中。 如util.h文件的代码开始处:[cpp] viewplaincopy#ifdef _EVENT_HAVE_SYS_TIME_H #include #endif #ifdef _EVENT_HAVE_STD
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----开篇
我所分析的Libevent版本是2.0.21版本,是目前最新的稳定版本。看这系列博文中,需要读者有Linux编程的一些基础。因为像POSIX、文件描述符、多线程等等这些概念,我并不会去解释,我默认读者已经熟悉这些概念了。如果读者读过《UNIX环境高级编程》,那就完全没问题了。 因为Libevent是跨平台的,所以它使用了很多它自己定义的通用跨平台类型,比如evutil_socket_t
zhwei_87
·
2015-01-22 17:00
Libevent源码分析
-----bufferevent工作流程探究
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39344743和之前的《Libevent工作流程探究》一样,这里也是用一个例子来探究bufferevent的工作流程。具体的例子可以参考《Libevent使用例子,从简单到复杂》,这里就不列出了。其实要做的例子也就是bufferevent_socket_new、bufferevent_se
luotuo44
·
2014-09-17 17:41
Libevent源码分析
Libevent源码分析
Libevent源码分析
-----bufferevent工作流程探究
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39344743 和之前的《Libevent工作流程探究》一样,这里也是用一个例子来探究bufferevent的工作流程。具体的例子可以参考《Libevent使用例子,从简单到复杂》,这里就不列出了。其实要做的例子也就是bufferevent_socket_new、buffer
luotuo44
·
2014-09-17 17:00
libevent
Libevent源码分析
-----更多evbuffer操作函数
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39325447锁操作: 在前一篇博文可以看到很多函数在操作前都需要对这个evbuffer进行加锁。同event_base不同,如果evbuffer支持锁的话,要显式地调用函数evbuffer_enable_locking。//buffer.c文件 int//参数可以是一个
luotuo44
·
2014-09-16 23:00
libevent
Libevent源码分析
-----evbuffer结构与基本操作
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39290721 对于非阻塞IO的网络库来说,buffer几乎是必须的。Libevent在1.0版本之前就提供了buffer功能。现在来看一下Libevent的buffer。buffer相关结构体: Libevent为buffer定义了下面的结构
luotuo44
·
2014-09-15 12:00
libevent
Libevent源码分析
-----连接监听器evconnlistener
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/38800363使用evconnlistener: 基于event和event_base已经可以写一个CS模型了。但是对于服务器端来说,仍然需要用户自行调用socket、bind、listen、accept等步骤。这个过程有点繁琐,为此在2.0.2-alpha版本的Libev
luotuo44
·
2014-08-24 22:00
libevent
Libevent源码分析
-----通用类型和函数
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/38780157 Libevent定义了一系列的可移植的兼容类型和函数。这使得在各个系统上都有一致的效果,Libevent一般都会在兼容通用类型和函数的前面加上ev或evutil前缀。 在实现上,Libevent都是使用条件编译+宏定义的方式。使用这种方式,同一个宏
luotuo44
·
2014-08-23 18:00
libevent
Libevent源码分析
-----与event相关的一些函数和操作
转载请注明出处: http://blog.csdn.net/luotuo44/article/details/38739549 Libevent提供了一些与event相关的操作函数和操作。本文就重点讲一下这方面的源代码。 在Libevent中,无论是event还是event_base,都是使用指针而不会使用变量。实际上,如果查看Libevent不同的版本,就可以发现
luotuo44
·
2014-08-21 22:00
libevent
Libevent源码分析
-----管理超时event
转载请注明出处: http://blog.csdn.net/luotuo44/article/details/38678333 前面的博文已经说到,如果要对多个超时event同时进行监听,就要对这些超时event进行集中管理,能够方便地(时间复杂度小)获取、加入、删除一个event。 在之前的Libevent版本,Libevent使用小根堆管理这些超时event。小根堆的
luotuo44
·
2014-08-19 11:00
libevent
上一页
1
2
3
4
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他