7.7.4. iothread

7.7.4.1. 简介

在早期的qemu版本,只存在一个主线程,同时负载客户虚拟机的指令执行和运行事件循两个任务。

线程执行客户机指令时,通过异常产生和信号量机制收走qemu线程控制权。接着通过执行非阻塞的 select 进行一次循环的迭代,之后就返回客户机指令的执行,并不停重复以上过程直到QEMU关闭。

这样的架构被称为non-iothread架构,这种架构存在着诸多问题,例如不能利用宿主机的多核能力、在运行SMP客户机的情况下会表现不佳、无法同时异步执行多个事件处理等。

之后QEMU在新版本中使用了新的架构,为每一个vCPU分配一个QEMU线程,以及一个专用的事件处理循环线程,这个模型被称为iothread。

在iothread架构中,各个vCPU线程可以并行的执行客户机指令,进而提供真正的SMP支持;iothread则负责运行事件处理循环。通过使用了一个全局的mutex互斥锁来维持线程同步。大多数时间里,vCPU在运行客户机指令,iothread则阻塞在select中。

这种方式使得IO处理能够完全脱离主线程,运行在多个不同的线程中,充分利用现代多核处理器的能力。