常见的异步IO存在的问题:
 
1.使用 fcntl(fd, F_SETFL, O_NONBLOCK);,为什么在处理上效率不好。
 
    a.在没有数据可读写的时候,循环会不停执行,浪费掉大部分cpu
    b.每次尝试读写文件描述符,都会执行一次内核调用(recv,write),而系统调用耗时。
 
2.使用select方式缺陷是什么?
    a.如果检查的文件描述符太多,每次设置和检查的耗时就会长。
 
libevent的设计目标
1.可移植性
2.快速
3.易扩展
4.使用方便
 
libevent的组件
 
1.evutil
   抽象通用功能,屏蔽不同平台的实现
2.event and event_base
   将不同平台的异步IO抽象成统一接口。在socket可读、可写时 通知应用程序,可做超时控制,在通知应用程序系统信号。
3.bufferevent
   提供方便的缓冲读写接口
4.evbuffer
   bufferevent的后端实现
5.evhttp
   简单的http客户端,服务端实现
6.evdns
   简单的dns客户端,服务端实现
7.evrpc
   远程调用。
 
 
库文件
libevent_core:核心,包括了所有event_base ,evbuffer,bufferevent,和其他的通用功能
libevent_extra:包括http,dns,rpc
libevent:历史版本,将来会被去掉
libevent_threads:某些平台会有,提供多线程和锁功能
libevent_openssl:提供加解密功能
 
 
头文件(目前所用的所有头文件都在event2目录下面)
API headers:定义所有公用接口,没有后缀
Compatibility headers:兼容性头文件,用于支持过时的接口
Structure headers:用于定义易变的结构体。有些用于直接快速访问接口图,有些用于历史版本访问。任何直接依赖该头文件的程序将不具有可一致性。这类头文件带有"_struct.h"后缀
 
 
 
libevent的配置
 
libevent的有多种全局配置,主要通过书写和设置回调函数实现。
主要的配置项有以下几个
1.日志
   默认的日志以及debug信息(如果编译时打开了debug模式),将写入到stderr,但可以通过书写和替换回调函数写入到自定义文件。
   //参数和等级信息
  typedef void (*event_log_cb)(int severity, const char *msg);
  void event_set_log_callback(event_log_cb cb); //参数为NULL则丢弃日志
    
 
2.处理重大错误,默认退出程序(exit() or abort() )

typedef void (*event_fatal_cb)(int err);
void event_set_fatal_callback(event_fatal_cb cb);
  
 自定义函数不应该再使用任何libevent接口,否则会导致未定义行为。
 
3.内存管理
void event_set_mem_functions(void *(*malloc_fn)(size_t sz),
                             void *(*realloc_fn)(void *ptr, size_t sz),
                             void (*free_fn)(void *ptr));
 
自定义函数需要注意对齐,需要和c内存分配相同的对齐方式
还需要注意调用时机,需要在所有内存分配之前
 
4.锁和多线程
   libevent与多线程的工作模式
   a.固有单线程,不安全
   b.可选锁模式,需要为每个会被用在多线程场景下的对象进行说明。
   c.始终锁模式,总是线程安全。
 
    可自定义锁函数,并设置,设置必须发生在libevent分配任何共享结构之前
 

define EVTHREAD_WRITE  0x04
#define EVTHREAD_READ   0x08
#define EVTHREAD_TRY    0x10

#define EVTHREAD_LOCKTYPE_RECURSIVE 1
#define EVTHREAD_LOCKTYPE_READWRITE 2

#define EVTHREAD_LOCK_API_VERSION 1

struct evthread_lock_callbacks {
       int lock_api_version;
       unsigned supported_locktypes;
       void *(*alloc)(unsigned locktype);
       void (*free)(void *lock, unsigned locktype);
       int (*lock)(unsigned mode, void *lock);
       int (*unlock)(unsigned mode, void *lock);
};

int evthread_set_lock_callbacks(const struct evthread_lock_callbacks *);

void evthread_set_id_callback(unsigned long (*id_fn)(void));

struct evthread_condition_callbacks {
        int condition_api_version;
        void *(*alloc_condition)(unsigned condtype);
        void (*free_condition)(void *cond);
        int (*signal_condition)(void *cond, int broadcast);
        int (*wait_condition)(void *cond, void *lock,
            const struct timeval *timeout);
};

int evthread_set_condition_callbacks(
        const struct evthread_condition_callbacks *);

 
 
5.调试锁的用法(可以探测“未锁”,“重复锁”等典型错误)
void evthread_enable_lock_debugging(void);
#define evthread_enable_lock_debuging() evthread_enable_lock_debugging()
 
 
6.调试事件用法(可以探测事件是否未初始化,或者重复初始化等问题)
void event_enable_debug_mode(void);
void event_debug_unassign(struct event *ev);
 
 
 
 
 
 
 
 
 
 
 

libevent学习一的更多相关文章

  1. libevent学习之二:Windows7(Win7)下编译libevent

    Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http:// ...

  2. PHP中的Libevent学习

    wangbin@2012,1,3 目录 Libevent在php中的应用学习 1.      Libevent介绍 2.      为什么要学习libevent 3.      Php libeven ...

  3. libevent学习笔记 一、基础知识【转】

    转自:https://blog.csdn.net/majianfei1023/article/details/46485705 欢迎转载,转载请注明原文地址:http://blog.csdn.net/ ...

  4. Libevent学习之SocketPair实现

    Libevent设计的精化之一在于把Timer事件.Signal事件和IO事件统一集成在一个Reactor中,以统一的方式去处理这三种不同的事件,更确切的说是把Timer事件和Signal事件融合到了 ...

  5. libevent学习笔记 —— 牛刀小试:简易的服务器

    回想起之前自己用纯c手动写epoll循环,libevent用起来还真是很快捷啊!重写了之前学习的时候的一个例子,分别用纯c与libevent来实现.嗯,为了方便对比一下,就一个文件写到黑了. 纯c版: ...

  6. Libevent学习笔记(五) 根据例子学习bufferevent

    libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...

  7. libevent学习文档(三)working with event

    Events have similar lifecycles. Once you call a Libevent function to set up an event and associate i ...

  8. 【传智播客】Libevent学习笔记(一):简介和安装

    目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...

  9. Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例

    今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...

  10. Libevent学习笔记

    学习: /Users/baidu/Documents/Data/Interview/服务器-检索端/libevent参考手册(中文版).pdf 讲的不好.翻译的..

随机推荐

  1. BZOJ1396:识别子串(SAM)

    Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...

  2. 最简单的PS渐变导入方法 photoshop渐变插件素材导入教程

    photoshop渐变插件素材可以让用户更好更直接,更快速地设计出自己想要的效果作品.网上有多种多样的ps渐变,那么Mac版Ps渐变怎么导入呢?这里我来和大家分享一下photoshop渐变插件素材导入 ...

  3. [19/04/04-星期四] IO技术_CommonsIO(通用IO,别人造的轮子,FileUtils类 操作文件 & IOUtilsl类 操作里边的内容 )

    一.概念 JDK中提供的文件操作相关的类,但是功能都非常基础,进行复杂操作时需要做大量编程工作.实际开发中,往往需要 你自己动手编写相关的代码,尤其在遍历目录文件时,经常用到递归,非常繁琐. Apac ...

  4. [19/04/03-星期三] IO技术_其它流(RandomAccessFile 随机访问流,SequenceInputStream 合并流)

    一.RandomAccessFile 随机访问流 [版本1] /* *RandomAccessFile 所谓随机读取就是 指定位置开始或指定位置结束 的读取写入文件 * 实现文件的拆分与合并 模拟下载 ...

  5. [19/03/26-星期二] 容器_Map(图、键值对、映射)接口之HashMap(散列映射)&TreeMap(树映射)

    一.概念&方法 现实生活中,我们经常需要成对存储某些信息.比如,我们使用的微信,一个手机号只能对应一个微信账户,这就是一种成对存储的关系. Map就是用来存储“键(key)-值(value) ...

  6. 理解JavaScript的this对象

    1.概述 this对象是在运行时基于函数的执行环境绑定的,this总是返回一个对象,简单说,就是返回属性或方法"当前"所在的对象.在全局函数中,this等于window,而当函数作 ...

  7. focal loss和ohem

    公式推导:https://github.com/zimenglan-sysu-512/paper-note/blob/master/focal_loss.pdf 使用的代码:https://githu ...

  8. Spring通过注解装配Bean

    通过注解实现ServiceImpl业务 一.使用@Component装配Bean 1. 定义类:User 在类上面加@Component注解,在属性上面加@Value值 package com.wbg ...

  9. init/loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

    init/loadView/viewDidLoad/viewDidUnload 这么细节的东西想来大家都不在意,平时也不会去关系,但是在面试时却常常被提到,所以了解viewController的生命周 ...

  10. 关于结构体占用空间大小总结(#pragma pack的使用)

    关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的.这道题是这样的: 在32位机器上,下面的代码中 class A { publi ...