Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1255971
  • 博文数量: 494
  • 博客积分: 161
  • 博客等级: 入伍新兵
  • 技术积分: 5084
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-01 07:37
个人简介

只有偏执狂才能生存

文章分类

全部博文(494)

文章存档

2016年(10)

2015年(112)

2014年(69)

2013年(275)

2012年(28)

分类: LINUX

2013-06-20 15:54:21

自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
阅读(2090) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册