2.1 QEMU事件循环机制
2.1.1 glibc事件循环机制
知识提炼:
- glib事件循环机制
QEMU程序的运行基于各类文件fd事件,QEMU在运行过程中会将自己感兴趣的文件fd添加到其监听列表上,并定义相应的处理函数。在QEMU主线程中,有一个循环用来处理这些文件fd的事件。
QEMU的事件循环机制基于glib,glib是一个跨平台的、C语言编写的若干底层库的集合。
glib实现了完整的事件循环分发机制:有一个主循环负责处理各种事件,事件通过事件源描述,事件源包括各种文件描述符(文件、管道或者socket)、超时和idle事件等。应用程序可以利用glib的这套机制实现自己的事件监听与分发处理。
glib使用GMainLoop结构体来表示一个事件循环,每一个GMainLoop都对应一个主上下文GMainContext。事件源使用GSource表示,每个GSource可以关联多个文件描述符,同时关联到一个GMainContext,一个GMainContext可以关联多个GSource。
glib的一个重要特点是能够定义新的事件源类型,可以通过定义一组回调函数来将新的事件源添加到glib的事件循环框架中。新的事件源通过两种方式跟主上下文交互:第一种方式是GSourceFuncs中的prepare函数可以设置一个超时时间,以此来决定主事件循环中轮询的超时时间;第二种方式是通过g_source_add_poll函数来添加fd。
glib主上下文GMainContext的一次循环包括prepare、querey、check和dispatch四个过程,分别对应glib的g_main_context_prepare()、g_main_context_query()、g_main_context_check()和g_main_context_dispatch()四个函数。
- Glib事件循环状态转换图(状态机)