QEMU的几个线程

HOST将qemu当做一个普通的进程和其他进程统一调度,可以使用资源对qemu进行资源预留隔离(cpuset)和优先级提升(chrt)。qemu进程包含多个线程,分配给GUEST的每个vcpu都对应一个vcpu线程,另外qemu还有一个线程循环执行select专门处理I/O事件。
QEMU的主要线程:
  • 主线程(main_loop),一个
  • vCPU线程,一个或者多个
  • I/O线程(aio),一个或者多个
  • worker thread(VNC/SPICE),一个


qemu里有个主线程处于无限循环,会做如下操作
  • IO线程里有个select函数,它阻塞在一个文件描述符(fd)集合上,等待其就绪。fd可以通过qemu_set_fd_handler()
  • 运行到期的定时器,定时器通过qemu_mod_timer添加
  • 运行BH(bottom-halves),BH通过qemu_bh_schedule添加
当文件描述符就绪,定期器到期或者BH被调度,相应的callback会被调用


qemu中还有一些worker threads。一些占用CPU较多的工作会明显增大主IO线程的IO处理延迟,这些工作可以放在专用的线程里,例如posix-aio-compat.c中实现了异步文件I/O,当有aio请求产生,该请求被置于队列,工作线程可以在qemu主线程之外处理这些请求。VNC就是这样一个例子,它用了一个专门的worker thread(ui/vnc-jobs.c)进行计算密集型的图像压缩和编码工作。

你可能感兴趣的:(系统虚拟化,Linux系统编程内核编程)