前边分析了glib的主事件循环,在分析qemu事件派发机制之前,我们来回顾下glib事件循环的主要api和流程。
主事件循环提供的机制主要有两方面
1 观察文件描述符事件, 如文件可读,文件可写
2 定时任务
主事件循环有三个概念
1 GMainContext
2 GMainLooper
3 GSource
GMainLooper代表一个事件循环,和线程绑定,其中成员变量is_running用于控制主事件循状态(开启/停止), GMainContext则代表主事件循环的上下文,与GMainLooper绑定,GMainContext和GMLooper为一对一的关系,同样GMainLooper和线程也是一对一的关系。
GSource则代表一个事件源,一个GMainContext可以绑定多个事件源.
如何理解事件源?
前面说了主事件循环主要用于观察文件描述符可读,可写事件。这就是事件源,另外定时任务的时间到达也属于一种特殊的事件源。
glib主事件循环以什么方式观察文件描述符可读可写,相信对linux编程比较熟悉的读者都应该猜想到了,无非就是poll/select/epoll等函数。
这些函数都可以把文件描述符设置到一个集合里面,设置感兴趣的事件,之后调用poll/select/epoll函数,然后进入休眠。当内核发现感兴趣的事件(读、写等)到来后,就会从休眠中唤醒poll/select/epoll的调用进程,同时内核会把触发的事件也告诉给调用者。这种方式比read/write等阻塞方式的好