Libevent源码学习笔记一:event2/event.h
一、libevent标准使用方法:
每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent 链接器。如果只是想使用主要的event和buffered IO-based code,不想链接任何协议代买,使用链接 -levent_core。
二、安装库设置
在调用Libevent其他函数时,需要设置库。例如在应用中使用多线程,需要先初始化线程支持,使用evthread_use_pthreads() or evthread_use_windows_threads().在<event2/thread.h>获取更多信息。
另外,可以使用event_set_mem_functions来替换Libevent 内存管理,想要测试 debug,使用event_enable_debug_mode().
三、 创建event base
Libevent是反应器(Reactor)模式,event_base就相当于反应器,event_base 负责监视event是等待状态还是就绪状态,每个event与一个event_base关联。
四、事件通知机制
一个文件描述符对应一个event结构体,可以使用event_new()来创建一个event结构体,或者是声明一个event structure,然后使用event_assign()来初始化event的成员。为了实现通知,使用event_add()来将事件添加到列表。只要事件是活动的,事件结构必须保持分配,因此它一般应该在堆上分配。
五、循环处理事件
最后调用event_base_dispatch() 来循环处理事件。也可以使用event_base_loop 来实现更细致的控制。
一个线程只能处理一个event_base。If you want to run events in multiple threads at once, you can either have a single event_base whose events add work to a work queue,or you can create multiple event_base objects.
六、bufferevent I/O Buffers 缓冲输入输出
Libevent提供 一个 buffered I/O abstraction 在常规事件回调的顶部。这个abstraction 是 bufferevent。一个 bufferevent 提供自动填充和清理输入和输出缓冲。使用buffered event不再直接处理I/O,而是从输入缓冲读,输出缓冲区写。
一旦通过bufferevent_socket_new()初始化,bufferevnet 结构体 通过bufferevent_enable()和bufferevent_diable()实现重复使用。以前是直接读写socket,使用bufferevent_socket后,改为使用bufferevent_read()和bufferevent_write()。
读缓存水位分析:
1、 bufferevent用于数据接收和发送缓存。
2、 bufferevent内建了两个struct bufferevent对象,分别用于发送和接收缓存。
3、 水位值用于实现对缓存区的管理。
4、 从网络模型分析bufferevent会自动从socket读取数据缓存在bufferevent的接收缓存中。
5、 当bufferevent存储的数据到达低水位值时读回调函数触发。
6、 低水位是0时,只要bufferevent从网络收数据就会触发读回调,也即数据可以立即被用户读走。
7、 读回调函数常规操作是从bufferevent中读取数据(用户读取数据)。
8、 但是当bufferevent读取的速度大于用户从bufferevent读取速度是,bufferevent中的数据量会达到高水位值。
9、 当bufferevent缓存数据量达到高水位值时,bufferevent会停止从网络接收数据。
10、当用户从bufferevent中读取了数据使水位值低于高水位值时,bufferevent又可以从网络中接收新的数据。
写缓存水位分析:
1、 用户先将数据写入到bufferevent发送缓存。
2、 当bufferevent发送缓存存储的数据量达到低水位时,回调函数将被触发。
3、 当低水位为0时,bufferevent缓存为空,写进数据时写回调被触发。
4、 回调函数的常规操作是将bufferevent发送缓存数据写到网络中。
5、 当用户写入发送缓存数据快于回调函数将数据写到网络中时,水位值将达到高水位值。
6、 高水位值没有使用。
七、定时器
Libevent可以创建定时器来当超时时来调用回调函数。evtimer_new() 宏 返回一个使用定时器的event。为了激活定时器,调用evtimer_add()宏。可以使用evtimer_del()使用定时器失活。
这些宏使用对event_new(),event_add(),event_del的包装。
八、evdns Asynchronous DNS resolution 异步DNS解决方案
Libevent 提供一个异步DNS来替代标准的DNS解决器。在<event2/dns.h>有更多函数
九、evhttp event-driven HTTP servers
Libevent提供一个非常简单事件驱动的HTTP服务器,可以集成到程序中并处理HTTP请求
<event2/http.h>
十、evrpc A framework for RPC servers and clients
十一、Libevent主要头文件
十二、event structure
事件处理步骤:
1.event_new()创建event
2.event_add()将event添加到event_base中
3.不再使用事件时,event_free()删除事件
事件分为persistent和non-persistent。non-persistent事件,被触发后只执行一次,然后状态变为non-pending;persistent事件当被触发执行回调函数后,状态为pending然后在event_base继续等待执行,只用使用event_del()手动删除事件将状态改为non-pending。
Libevent源码学习笔记一:event2/event.h的更多相关文章
- libevent源码阅读笔记(一):libevent对epoll的封装
title: libevent源码阅读笔记(一):libevent对epoll的封装 最近开始阅读网络库libevent的源码,阅读源码之前,大致看了张亮写的几篇博文(libevent源码深度剖析 h ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- AXI_LITE源码学习笔记
AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...
- Hadoop源码学习笔记(6)——从ls命令一路解剖
Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...
- Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...
- Hadoop源码学习笔记(4) ——Socket到RPC调用
Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...
- Hadoop源码学习笔记(2) ——进入main函数打印包信息
Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...
随机推荐
- ASP.NET 页生命周期概述1
ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行 呈现.了解页生命周期非常重要,因为这样 ...
- Tomcat热启动
===== 2017.7.1 ===== 如果是对原来的类方法修改,那么热启动非常好用:如果是添加了新的类或方法(非最上层的controller),那么此方法也是好用的:但是如果是在controlle ...
- mongodb基本指令
MongoDB基本命令用成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show co ...
- 微信小程序开发框架整理
目前除了原生的微信小程序开发外,各大厂商陆续造了自己的开发框架,现整理如下: WePY 腾讯官方开源的小程序组件化开发框架,目前有15K+Star ,一直在更新着,社区活跃,掉坑能快速的找到方法爬出来 ...
- springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页、个人作品、个人博客)
前言 My Site 主要功能有:个人首页.个人作品.个人博客为一体的站点,网站的文章和作品均由markdown进行编写,可以满足你的基本需求.如果觉得这个项目不错,请为它点赞支持. 项目架构 JDK ...
- 从MySQL到ORM(一):Centos7.x安装Mysql5.7
一.下载安装mysql 1.进入官网获取RPM包:https://dev.mysql.com/downloads/repo/yum/ 2.复制链接地址进行下载: wget https://dev.my ...
- 51nod 1135 原根(原根)
题意 题目链接 Sol 可以证明素数的原根不会超过他的\(\frac{1}{4}\) 那么预处理出\(P - 1\)的所有的质因数\(p_1, p_2 \dots p_k\),暴力判断一下,如果$\e ...
- 类型同时存在于A.dll和B.dll中的解决办法
引用B.dll后,右键引用中的B.dll属性->别名->Test using的最前面加上 extern alias Test; 使用 Test.MyClass.DoSth();
- VScode设置jsx语法自动补全
1.打开VScode 2.文件>首选项>设置 3.加上以下配置项就可以了 "emmet.includeLanguages": { "javascript&qu ...
- System.Net.Mail 邮件发送示例
前言:OA自动发送邮件的程序不好使,SQL Server 存储过程邮件发送程序好使,但是不利于标准化和维护,于是觉得是适合找些“轮子”武装一下.想起之前学习过System.Net.Mail ,于是再次 ...