- Linux服务器必须处理的三类时间:IO事件、信号、定时事件
- 处理这三类事件必须考虑三个问题:
- 统一事件源:使用IO复用系统来管理所有事件
- 可移植性:不同操作系统有不同的IO复用方式,Solaris的dev/poll,FressBSD的kqueue,Linux的epoll。
- 对并发编程的支持。
libevent简介
Libevent 有几个显著的亮点:
- 事件驱动(event-driven),高性能;
- 轻量级,专注于网络,不如ACE那么臃肿庞大;
- 源代码相当精炼、易读;
- 跨平台,支持Windows、Linux、*BSD和Mac Os;
- 支持多种I/O多路复用技术, epoll、poll、dev/poll、select和kqueue等;
- 支持I/O,定时器和信号等事件;
- 注册事件优先级;
Libevent已经被广泛的应用,作为底层的网络库;比如memcached、Vomit、Nylon、Netchat等等
12.1 I/O框架库概述
- I/O框架库以库函数的心事,封装了较为底层的调用,给应用系统提供了一组更便捷的接口。
- 基于Reactor模式的I/O框架库包含:
-
- 句柄
- 由于IO框架库需要处理IO事件、信号和定时事件被称为统一事件源,一个句柄绑定了一个事件源.
- 对于IO事件,句柄在Linux中的具体表现是文件描述符
- 对于信号,句柄在Linux中的具体表现是信号值
- 当内核检测到就绪事件后,它会通过句柄来通知应用程序。
-
2 事件多路分发器[EventDemultiplexer]
- 事件的到来是随机的、异步的。
- IO框架库会将系统支持的各种IO复用系统调用封装成统一的接口,称为事件多路分发器。
- demultiplex方法是等待事件的核心函数,内部调用是select、poll和epoll_wait等函数。
- register_event:从事件多路分发器添加事件
-
3 事件处理器和具体事件处理器
- 事件处理器指向事件对于的业务逻辑。
- 通常包含一个或多个handle_event回调函数,这些函数在事件循环中被执行。
- 用户需要继承IO框架库提供的事件处理器,来实现自己的事件处理器,也就是具体事件处理器
- IO框架库中的事件处理器会被声明为虚函数。
- get_handler方法:返回与该事件相关联的句柄。当事件发生时,通过句柄来通知应用程序。
-
4 Reactor
- Reactor是IO框架库核心:
- handle_events方法:执行事件循环。重复如下过程:等待事件,依次处理所有就绪事件对应的事件处理器。
- rigister_handler:调用事件多路分发器的register_event方法来往事件多路分发器注册事件。
- remove_handler:调用事件多路分发器的remove_event方法来删除事件多路分发器注册事件。
-