Reactor模式
整个libevent本身就是一个Reactor
Reactor的事件处理机制
普通函数执行机制
程序调用某函数执行=》程序等待=》函数将结果和控制权返回给程序=》程序继续处理
Reactor的解释是“反应堆”,是一个事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动调用某个API来完成处理。而恰恰相反,Reactor逆置了事件的处理流程。应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发成,Reactor将主动调用相应的程序注册的接口,这些接口又称为回调函数。
Reactor模式的优点
Reactor模式是编写高性能的网络服务器的必备技术之一
1)相应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的
2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/多进程的切换开销
3)可扩展性,可以方便的通过增加Reactor实例格式来充分利用cpu资源
4)可复用性,Reactor框架本身与具体的事件处理逻辑无关,具有很高的复用性
libevent库可以大致分为几个模块
1,事件处理框架
2,事件引擎模块
3,buffer管理模块
4,信号处理模块
对event的管理方法,
每当有事件event转变为就绪状态的是哦胡,libevent就会吧它移动到active event list中,其中priority是event的优先级。接着libevent会根据自己的调度策略选择就绪事件,其中调用callback函数执行事件处理并根据就绪的句柄和时间类型填充callback函数的参数。
buffer管理模块 evbuffer 支持多种数据类型的read/write功能,包括不定长的字符串,buffer中内存采用预分配/按需分配结合的方式,可以比较方便的管理多个数据结构映射到内存buffer。
需要额外介绍的是evbuffer_expand函数,当内部内存不够的时候,需要expand,这里采用的是预分配的方式,如果长度<256字节,预分配256字节,同时内存成倍的增长,只是到大于需要的长度。