QEMU 基本组件*
QEMU 事件循环机制*
glib 事件循环机制*
Linux 中一切皆文件,内核通过 VFS 抽象出统一的接口,通过 fd 访问文件。QEMU 运行基于各类文件 fd 事件,QEMU 在运行过程中将自己感兴趣的文件 fd 添加到其监听列表上并定义相应的处理函数。在其主线程中,有一个循环来处理这些文件 fd 的事件,QEMU 的事件循环机制基于 glib,下面简单介绍 glib 提供的事件循环机制。
glib 实现了完整的事件循环分发机制,在这个机制中有一个主循环负责处理各种事件,事件通过事件源描述,事件源包括各种文件描述符(文件、管道或者 socket)、超时和 idle 事件等。每个事件源都有一个优先级,idle 事件源在没有其他高优先级事件源时会被调度运行。应用程序利用 glib 的这套机制可以实现自己的事件监听与分发处理。
glib 使用 GMainLoop 结构体来表示一个事件循环,每个 GMainLoop 都对应有一个主上下文 GMainContext。事件源使用 GSource 表示,每个 GSource 可以关联多个文件描述符,每个 GSource 会关联到一个 GMainContext,一个 GMainContext 可以关联多个 GSource。
glib 的一个重要特点是能够定义新的事件源类型,可以通过定义一组回调函数来讲新的事件源添加到 glib 的事件循环框架中。新的事件源通过两种方式与主上下文交互,一种是 GSourceFuncs 中的 prepare 函数可以设置一个超时时间,依次来决定
最后更新: November 26, 2020