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
)在主循环中:
1 | qemu_init_main_loop |
参考资料
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/
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.