昨天结束了eventbase的分析,但是其中还有几个知识点没有说清楚,因此补一下。
IO和timer怎么统一
昨天我们说了libevent的timer和signal都统一到了IO的多路分发中,那么是怎么实现两者的联动的呢?
其实,libevent封装的多路复用机制中,例如epoll和select中都有一个等待时间timeout,当超过设定的时间后,就立即返回。这样便保证了即使没有IO,也可以完成返回。所以,我们可以将timer的最小超时时间融入到这个等待时间里面。这样,在IO返回之后,我们设置的timeout事件也可以随之触发,这样,二者就完美的融入为了一体。
这也是reactor经典的处理timer的方法。我们之前说过的最小堆,就是为了方便取得最小超时时间而设定的,可以O(1)的时间内取得最小超时时间,插入删除的效率也很快。
IO和signal的统一
signal本身就是一个异步的典型,比如信号中断,你完全不知道何时会出现一个信号,而且也不想timer一样简单,设置超时时间等待就可以了。你还必须告诉内核,这个信号来了你要干什么。
那我们就必须在信号到来的时候,先通知IO返回,然后将三者统一处理。这样才能实现三者的统一管理。
这就是下一节的信号处理。