我的理解:
在I/O多路复用机制用(这里使用epoll作为例子),epoll_wait在一定的时间内监听需要受到关注的套接字,如果只是关注I/O事件,这样就会很简单,在设置时间的时候没有任何限制,此函数返回后,得到的有事件的套接字的个数,在libevent中使用的event_base_loop这个函数打到这个目的的,里面的evse->dispatch()这个函数就是epoll_wait的包装,这个函数返回的有I/O事件的套接字的数目。
返回以后,再次进入event_base_loop这个函数,在这个函数中调用event_process_active这个函数调用相应套接字的回调函数,做相应的工作,那么在这两者(返回的是个数,操作却能够完成这么多个数的套接字的事件处理)是怎么沟通的呢?其实在evsel->dispatch()这个函数中,在epoll_wait返回以后,还将有事件的套接字添加到了一个队列中,将套接字添加到队列中的函数是event_active。在处理这些I/O时,只需将激活队列中的所用事件都处理即可。当然这只是考虑libevent只处理I/O事件的过程。
如何将定时器也添加到I/O多路复用这个机制中呢?
定时器事件需要一个时间的限制,在这里很容易添加进去,只要在epoll_wait这个函数等待的事件是所有定时事件中时间最小的那个时间即可,在event_base_loop函数中,timeout_next函数就是为了在最小堆中找出最小时间,以这个时间在epoll_wait中,在evsel->dispatch返回后,timeout_process()函数将需要处理