天天看點

QEMU線程模型non-iothreadiothread引用

non-iothread

早期的qemu并不支援多線程,它隻有一個線程,在這個線程中完成vcpu、裝置模拟和事件處理等邏輯;當該線程正在執行vcpu虛拟機的代碼時,如果此時虛拟機發生了一個異常或該線程收到了一個信号,則cpu從執行虛拟機的代碼切換到qemu代碼,然後根據select的傳回結果去處理對應的檔案描述符,等完成裝置的模拟邏輯後,就接着執行虛拟機的代碼。

iothread

non-iothread的模型并不能利用多核處理器的性能,假如傳入-smp 2,即要虛拟出2個vcpu,此時qemu也隻有一個線程,在該線程中輪流交替的選擇一個vcpu來運作,其也隻是用到了一個實體cpu。

新的線程模型是為每一個vcpu配置設定一個線程,外加一個main loop線程(用來監聽檔案描述符、eventfd、定時器和中斷下半部),可能還會有裝置的worker thread(用來解除安裝main loop的負載,例如vnc)。因為QEMU的代碼不是thread-safe的,也就意味着QEMU的代碼不能同時被多個線程運作,是以需要一個全局mutex來保證。當vcpu從guest code中退出到qemu中時,需要運作

qemu_mutex_lock_iothread

來擷取這個全局鎖,之後才能執行QEMU的代碼;在進入guest code前使用

qemu_mutex_unlock_iothread

來釋放該鎖。

引用

QEMU Internals: Overall architecture and threading model

QEMU Internals: Event loops