libevent2源码分析之一:前言
event的本质
libevent2中的event的本质是什么?只要是非同步阻塞的运行方式,肯定遵循事件的订阅-发布模型。通过event_new的函数原型可以理解,一个event即代表一次订阅,建立起了fd变化的事件与callback响应函数之间的一个关联。
订阅-发布模型有四个方面,事件定义、事件订阅、事件触发、事件响应。libevent2与之的对应关系如下:
* 事件定义:由系统定义,比如IO相关的源(如socket)有read/write事件。libevent2定义了4个类型的事件:EV_TIMEOUT、EV_READ、EV_WRITE、EV_SIGNAL
* 事件订阅:由用户在代码中完成订阅,通过新建event对象并调用event_add实现事件的订阅。新建的event对象中就包含了关注的源是哪个fd, 关注的事件是四个事件中的哪些(一般只关注一个事件),关联的回调函数是什么。通过event_add将event添加到事件监听队列中。
* 事件触发:由libevent2底层负责,底层实现有多种方式,select为其中的一种。对于select方式,调用select()返回的可读列表即触发EV_READ事件,返回的可写列表即触发EV_WRITE事件。那么由谁来发起调用select()函数呢?通过调用event_base_dispatch()来发起调用。由此也可以看到event_base的作用。一旦事件被触发,就会将与该fd关联的事件监听队列中的所有的event添加就绪队列中。
* 事件响应:由libevent的event_base负责,处理就绪队列,对于队列中的每个event, 调用它的回调函数。
使用libevent2的流程
- 调用event_base_new()创建一个event_ base对象。
- 调用event_new(base, fd, flag, callback, args)创建一个event对象
- 调用event_add(event, NULL)添加event,即添加对fd通知事件的响应
- 调用event_base_dispatch(base)开始事件轮询。
下一篇将按照这个流程分析libevent2的源代码。
libevent2源码分析之一:前言的更多相关文章
- Spring Ioc源码分析系列--前言
Spring Ioc源码分析系列--前言 为什么要写这个系列文章 首先这是我个人很久之前的一个计划,拖了很久没有实施,现在算是填坑了.其次,作为一个Java开发者,Spring是绕不开的课题.在Spr ...
- Spring mvc源码分析系列--前言
Spring mvc源码分析系列--前言 前言 距离上次写文章已经过去接近两个月了,Spring mvc系列其实一直都想写,但是却不知道如何下笔,原因有如下几点: 现在项目开发前后端分离的趋势不可阻挡 ...
- jquery源码分析之一前言篇
1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.rea ...
- Spring boot 源码分析(前言)
开坑达人 & 断更达人的我又回来了 翻译的坑还没填完,这次再开个新坑= = 嗯,spring boot的源码分析 本坑不打算教你怎么用spring boot = = 也不打算跟你讲这玩意多方便 ...
- libevent2源码分析之三:信号的初始化流程
libevent2对信号的响应也进行了封装,使之与socket操作一样对外提供统一的接口.这里的信号一般指linux的信号.由于信号与socket相关的编程接口有较大的不同,因此在内部实现也有一些区别 ...
- libevent2源码分析之二:初始化流程
本文并不很详细地分析初始化的各个细节,而重点分析如何将底层操作关联到event_base的相关字段.初始化工作主要是针对event_base的.libevent2支持多种底层实现,有epoll, se ...
- libevent2源码分析之五:关键的调用链
用一个调用链来表示函数调用的流程,看起来更直观.根据上面的分析,总结了一些重要的调用链. 初始化 event_base_new event_base_new_with_config min_heap_ ...
- libevent2源码分析之四:libevent2的消息泵
Dispatch类似于一个消息泵,在一个死循环中,不停地检查IO的状态(可以想像成不断从消息队列中读取消息),将状态的改变变成事件,再进行事件的响应. 主要代码如下: [event.c] int ev ...
- ConcurrentHashMap 源码分析
ConcurrentHashMap 源码分析 1. 前言 终于到这个类了,其实在前面很过很多次这个类,因为这个类代码量比较大,并且涉及到并发的问题,还有一点就是这个代码有些真的晦涩,不好懂.前前 ...
随机推荐
- [BZOJ2631]tree 动态树lct
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 5171 Solved: 1754[Submit][Status][Discus ...
- IE webkit 滚动条样式!
<style type="text/css"> // IE 模式 *{ scrollbar-face-color:#F3F3F3; /*面子*/ scrollbar-a ...
- zookeeper与activemq整合
(1)zookeeper与activemq原理 使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案,高可用的原理:使用ZooKeeper( ...
- (2)java安装配置
java 分为三大类 javasSE,javaEE,javaME. javaSE:一般用于开发桌面软件,是java EE的基础类库 javaEE:用于开发网站 javaME:手机软件程序 javaSE ...
- HDU 2102 A计划【三维BFS】
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- 利用ipv6技术,废旧笔记本变成互联网server
如果你家的路由器已经get到了ipv6地址,并且你家的电脑也获取了有效的ipv6地址,在广域网的设备可以访问到.那恭喜你,再配合我这个ddns,你可以完美地把你家的电脑当服务器使用. 1.确保你家的宽 ...
- 主席树+LCA【p2633 (bzoj2588】 Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- 使用IIFE(立即执行函数)让变量私有化
今天去看了一个GITHUB上的开源项目,在客户端JS的脚本编写的时候,代码中多次使用了IIFE. 一开始我是懵逼的,不知道这种函数的意义何在,小菜鸟嘛. 后面我去研究了一番.发现了它的主要作用就是:让 ...
- 【分块】【线段树】bzoj3212 Pku3468 A Simple Problem with Integers
线段树入门题…… 因为poj原来的代码莫名RE,所以丧病地写了区间修改的分块…… 其实就是块上打标记,没有上传下传之类. #include<cstdio> #include<cmat ...
- 【bitset】hdu4920 Matrix multiplication
先把两个矩阵全都mod3. S[i][j][k]表示第i(0/1)个矩阵的行/列的第k位是不是j(1/2). 然后如果某两个矩乘对应位上为1.1,乘出来是1: 1.2:2: 2.1:2: 2.2:1. ...