libevent框架初步学习
2015-05-06 22:10
218 查看
libevent是一种开源的轻量级的优秀I/O框架库,它可以跨平台,可以统一处理I/O、信号和定时事件,可以使用不同的I/O复用方式,较新版本使用libevent_pthreads库对并发编程提供支持。高性能分布式内存对象缓存软件memcached就使用了该IO库。这些天通过《Linux高性能服务器编程》和《libevent源码深度剖析》学习了libevent的一些基本概念和原理。
libevent是Reactor模式实现的。这种模式一般包含下面几个组件:句柄(handle),事件多路分发器、事件处理器、具体的事件处理器、Reactor。事件一般和句柄绑定在一起,句柄的作用是当事件发生时,内核通过句柄通知应用程序这一事件。Linux下,I/O事件对应的句柄是文件描述符,信号事件对应的是信号值。
程序需要循环等待处理事件,等待事件一般是利用IO复用技术,这些IO复用技术被封装为统一接口称为事件多路分发器。
事件处理器执行事件对应的业务逻辑,一般包含一个或多个回调函数,在事件循环中被执行。事件处理器通常是个接口,由具体事件处理器来实现。事件处理器必须和句柄绑定,因为事件是由句柄通知,由句柄才能找到对应的事件处理器。
Reactor是框架库的核心,主要包含三部分,一是事件循环,处理就绪事件的事件处理器;调用事件多路分发器的注册事件函数向事件多路分发器注册事件;调用事件多路分发器的删除事件函数删除事件。
libevent中几个重要的数据结构,event事件处理器,event_base相当于Reactor,eventops多路分发器。各event_base中有事件队列,活动事件队列,定时器队列用于管理事件处理器event。处理事件就是执行事件对应的事件处理器中的回调函数。
event结构体封装了句柄、事件类型、回调函数等信息。所有事件处理器串成一个队列也就是注册事件队列。所有被激活的事件处理器也串成一个队列也就是活动事件队列。活动事件队列不只一个,不同优先级的事件在不同队列中,Reactor会按优先级处理各事件处理器。fd相同的IO事件处理器也串成一个IO事件队列,相同信号值的信号事件处理器串成一个信号队列。事件处理器需要注册到事件队列中,同时还需要让分发器监听该事件,同时建立fd与事件处理器的对应关系。
eventops为IO复用技术提供统一的接口。选用哪种复用技术在编译时由编译宏确定,Linux默认epoll。
事件循环是框架的运行动力。
这里想单独说一下信号事件的处理是如何统一到该框架中的。信号发生后如何通知系统IO机制返回?其实也是利用IO事件实现的。Libevent创建一对socket pair,然后为其读socket在event_base上注册一个persist的读事件。信号的处理函数中向socket pair的写socket中写入数据,用于触发IO事件,同时将信号发生的标志置true。读socket上面会有事件,IO机制就返回,然后处理事件时判断发生了信号,信号事件就被处理了。
对于这两份资料还需要进一步研究,若要理解还需要进一步分析源码。
libevent是Reactor模式实现的。这种模式一般包含下面几个组件:句柄(handle),事件多路分发器、事件处理器、具体的事件处理器、Reactor。事件一般和句柄绑定在一起,句柄的作用是当事件发生时,内核通过句柄通知应用程序这一事件。Linux下,I/O事件对应的句柄是文件描述符,信号事件对应的是信号值。
程序需要循环等待处理事件,等待事件一般是利用IO复用技术,这些IO复用技术被封装为统一接口称为事件多路分发器。
事件处理器执行事件对应的业务逻辑,一般包含一个或多个回调函数,在事件循环中被执行。事件处理器通常是个接口,由具体事件处理器来实现。事件处理器必须和句柄绑定,因为事件是由句柄通知,由句柄才能找到对应的事件处理器。
Reactor是框架库的核心,主要包含三部分,一是事件循环,处理就绪事件的事件处理器;调用事件多路分发器的注册事件函数向事件多路分发器注册事件;调用事件多路分发器的删除事件函数删除事件。
libevent中几个重要的数据结构,event事件处理器,event_base相当于Reactor,eventops多路分发器。各event_base中有事件队列,活动事件队列,定时器队列用于管理事件处理器event。处理事件就是执行事件对应的事件处理器中的回调函数。
event结构体封装了句柄、事件类型、回调函数等信息。所有事件处理器串成一个队列也就是注册事件队列。所有被激活的事件处理器也串成一个队列也就是活动事件队列。活动事件队列不只一个,不同优先级的事件在不同队列中,Reactor会按优先级处理各事件处理器。fd相同的IO事件处理器也串成一个IO事件队列,相同信号值的信号事件处理器串成一个信号队列。事件处理器需要注册到事件队列中,同时还需要让分发器监听该事件,同时建立fd与事件处理器的对应关系。
eventops为IO复用技术提供统一的接口。选用哪种复用技术在编译时由编译宏确定,Linux默认epoll。
事件循环是框架的运行动力。
这里想单独说一下信号事件的处理是如何统一到该框架中的。信号发生后如何通知系统IO机制返回?其实也是利用IO事件实现的。Libevent创建一对socket pair,然后为其读socket在event_base上注册一个persist的读事件。信号的处理函数中向socket pair的写socket中写入数据,用于触发IO事件,同时将信号发生的标志置true。读socket上面会有事件,IO机制就返回,然后处理事件时判断发生了信号,信号事件就被处理了。
对于这两份资料还需要进一步研究,若要理解还需要进一步分析源码。
相关文章推荐
- java 持久框架mybatis的初步学习
- Android ORMLite 框架初步学习
- nodeJS之Express框架初步学习
- structs 2.x 框架的初步学习
- onvif学习笔记5:onvif框架代码初步了解
- [原创]一点一滴学习网络游戏开发,第二章节:框架设计初步
- PythonWeb开发Django框架学习(八)Model与数据库初步
- php学习笔记(三十四)smarty框架的初步使用和注意事项
- eclipse初步学习笔记(快捷键 运行调试 junit测试框架)
- shiro框架初步学习
- Libevent开源框架学习大纲
- .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
- 实训ssm框架学习配置文件初步解析(一)
- Python Web开发 之Django框架入门学习笔记(一)——安装和初步使用
- 首次接触框架,struts2初步学习(随笔)
- dubbo框架初步学习
- PythonWeb框架Django11学习(二) 初步HelloWorld
- 学习笔记05—框架与反射初步
- CCIE学习笔记框架——网络的初步了解
- Spring 框架初步学习