Skip to the content.

QEMU Event Loop

和 QEMU Event Loop 关联的文件

在 QEMU 中,用于 event loop 的线程为 main loop thread 和 IOThread,其中 IOThread 需要 explicit 的配置才可以被使用。 也就是说,默认情况下就是 main loop thread 和 vCPU thread 相互交互。

main loop thread

QEMU 的第一个 thread 启动了各个 vCPU 之后,然后就会调用 ppoll 来进行实践监听。

相关代码在 main-loop.c 中间,下面是 main loop

在 glib 中进行 event loop 是通过调用 g_main_loop_run 来进行进行的,但是 QEMU 的 main loop thread 存在更强的自定义,也就是 os_host_main_loop_wait

当存在 fd ready 之后,其执行流程为:

这就是 aio_set_fd_handler 的任务,对于一个监听的 fd, 会创建 AioHandler 来保存这个 fd 关联的 hook 函数

需要指出的是,AioHandler::io_poll 用于用户态的 poll 操作,找到其注册的三个 hook 函数,都是简单查询一下一个变量, 如果发现已经存在 fd ready 了,那么就可以直接返回。io_poll 注册的 hook 为:

实现真的非常的平易近人:

/* Returns true if aio_notify() was called (e.g. a BH was scheduled) */
static bool aio_context_notifier_poll(void *opaque)
{
    EventNotifier *e = opaque;
    AioContext *ctx = container_of(e, AioContext, notifier);

    return qatomic_read(&ctx->notified);
}

使用 signalfd 作为例子来分析事件处理过程:

使用 signalfd 作为例子的确是不错的

所以,glib + 两个 context

  1. 一个循环中,如何保证不会出现互相的阻塞
  2. 都是分别监听那些 fd 的,可以列出来吗?

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。