runsisi's

technical notes

qemu 的事件处理

2019-03-02 runsisi#openstack#qemu

qemu 中有两有两种类型的事件循环(event loop),其中主循环(main loop)是 qemu 运行的基础,最初整个 qemu 只有这一个事件循环,所有的事件,包括定时器、事件通知(pipe)、后端 IO 事件,都经由主循环收集(poll)并分发处理(dispatch),主循环的退出也意味着 qemu 进程的退出。在后期为了降低虚机硬盘 IO 的抖动,为硬盘 IO 增加了独立的 IO 线程,所有的 IO 事件也都在该 IO 线程进行处理。

qemu 的事件循环基于 libglib2 的事件循环机制,其中主循环直接基于 libglib2 中的 Main Event Loop。qemu 刚上电时把 IO 处理的 event source 注册(g_source_add_poll, g_source_attach)在主循环中:

qemu_init_main_loop
  aio_context_new
    g_source_new
    event_notifier_init
    aio_set_event_notifier
      aio_set_fd_handler
        g_source_add_poll
  g_source_attach

参考资料

KVM: KERNEL-BASED VIRTUAL MACHINE

http://slides.com/braoru/kvm#/

The Main Event Loop

https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-main-context-dispatch

GLib Event Loop

http://devlib.symbian.slions.net/s3/GUID-7FD05006-09C1-4EF4-A2EB-AD98C2FA8866.html

virtio-blk vs virtio-scsi

https://mpolednik.github.io/2017/01/23/virtio-blk-vs-virtio-scsi/