自QEMU 1.0 版之后,主执行绪main (vl.c) 即为IO thread,不再同时负责运行客户
机代码和模拟 IO。底下是概略的图示:
1. aio_thread (posix-aio-compat.c)
---------------------------------------->
| (worker thread)
|
| main (vl.c)
-------------------------------------------------- ---------------------->
| | (io thread)
| |
| | 3. vnc_worker_thread (ui/vnc-jobs.c)
| -------------------------->
| (worker thread)
|
|
| 2. vcpu_thread (qemu_tcg_cpu_thread_fn, cpus.c)
-------------------------->
当执行以下指令,登入之后,会有三个执行绪在运行。
$ qemu-system-i386 linux-0.2.img -vnc 0.0.0.0:1
分别是: main、vnc_worker_thread 和vcpu_thread。
1. main -> bdrv_init_with_whitelist -> bdrv_init -> module_call_init
-> bdrv_file_init -> cdrom_open -> raw_open_common -> paio_init -> do_spawn_thread -> aio_thread
1. main -> qemu_opts_foreach( , drive_init_func, , ) -> drive_init_func -> drive_init
-> bdrv_open (block.c) -> find_image_format -> bdrv_pread -> bdrv_read -> bdrv_rw_co (corutine)
-> qemu_aio_wait (aio.c) -> qemu_bh_poll (async.c) -> spawn_thread_bh_fn (posix-aio-compat.c)
^^^^^^^^^^^^^
-> do_spawn_thread -> aio_thread (*) -> do_spawn_thread (?) -> handle_aiocb_rw (posix-aio-compat.c)
-> posix_aio_notify_event (notify the io is completed?)
2. main -> pc_init_pci -> pc_init1 -> pc_cpus_init -> pc_new_cpu -> cpu_x86_init
-> x86_cpu_realize -> qemu_init_vcpu -> qemu_tcg_init_vcpu -> qemu_tcg_cpu_thread_fn
3. main -> vnc_display_init -> vnc_start_worker_thread
为避免IO thread 因执行IO 而被阻塞(同步IO,synchronous I/O,blocking IO)。
QEMU 提供两种方案:
1. 非同步IO (asynchronous I/O, non-blocking IO)。透过 qemu_set_fd_handler 注册
fd 的回调函式。
- qemu-aio.h aio.c
- linux-aio.c (需安装 libaio [1])
2. 将 IO 交给所谓的 worker thread 执行。 QEMU 透过 qemu_paio_submit (posix-aio-compat.c)
把IO 请求写入伫列,worker thread 再从伫列读取IO 请求并执行。采用 worker
thread 模式的有底下两个范例。
- posix-aio-compat.c
- ui/vnc-jobs.c
自QEMU 1.0 版之后,主执行绪main (vl.c) 即为IO thread,不再同时负责运行客户
机代码和模拟 IO。底下是概略的图示:
1. aio_thread (posix-aio-compat.c)
---------------------------------------->
| (worker thread)
|
| main (vl.c)
-------------------------------------------------- ---------------------->
| | (io thread)
| |
| | 3. vnc_worker_thread (ui/vnc-jobs.c)
| -------------------------->
| (worker thread)
|
|
| 2. vcpu_thread (qemu_tcg_cpu_thread_fn, cpus.c)
-------------------------->
当执行以下指令,登入之后,会有三个执行绪在运行。
$ qemu-system-i386 linux-0.2.img -vnc 0.0.0.0:1
分别是: main、vnc_worker_thread 和vcpu_thread。
1. main -> bdrv_init_with_whitelist -> bdrv_init -> module_call_init
-> bdrv_file_init -> cdrom_open -> raw_open_common -> paio_init -> do_spawn_thread -> aio_thread
1. main -> qemu_opts_foreach( , drive_init_func, , ) -> drive_init_func -> drive_init
-> bdrv_open (block.c) -> find_image_format -> bdrv_pread -> bdrv_read -> bdrv_rw_co (corutine)
-> qemu_aio_wait (aio.c) -> qemu_bh_poll (async.c) -> spawn_thread_bh_fn (posix-aio-compat.c)
^^^^^^^^^^^^^
-> do_spawn_thread -> aio_thread (*) -> do_spawn_thread (?) -> handle_aiocb_rw (posix-aio-compat.c)
-> posix_aio_notify_event (notify the io is completed?)
2. main -> pc_init_pci -> pc_init1 -> pc_cpus_init -> pc_new_cpu -> cpu_x86_init
-> x86_cpu_realize -> qemu_init_vcpu -> qemu_tcg_init_vcpu -> qemu_tcg_cpu_thread_fn
3. main -> vnc_display_init -> vnc_start_worker_thread
为避免IO thread 因执行IO 而被阻塞(同步IO,synchronous I/O,blocking IO)。
QEMU 提供两种方案:
1. 非同步IO (asynchronous I/O, non-blocking IO)。透过 qemu_set_fd_handler 注册
fd 的回调函式。
- qemu-aio.h aio.c
- linux-aio.c (需安装 libaio [1])
2. 将 IO 交给所谓的 worker thread 执行。 QEMU 透过 qemu_paio_submit (posix-aio-compat.c)
把IO 请求写入伫列,worker thread 再从伫列读取IO 请求并执行。采用 worker
thread 模式的有底下两个范例。
- posix-aio-compat.c
- ui/vnc-jobs.c