Skip to the content.

qemu 的 thread pool 的作用

显然,是由于 preadv 之类的同步 io

主要使用者为 : block/file-posix.c

如果磁盘的后端不是 aio

创建是在 bh 中进行的:

最后的结果在这里:

如果磁盘的后端为 aio

从 ioeventfd 到 linux aio 的结果:

并不是所有的后端都是使用 thread-pool 的

例如 ssh 作为后端,就是同步的:

实现原理

总体来说,worker pool 的设计比较简单的,整个 thread-pool.c 也就是只有 300 行左右, 这个主要关联的两个结构体:

struct ThreadPool {
    QemuSemaphore sem; // 工作线程idle时休眠的信号量

    /* The following variables are protected by lock.  */
    QTAILQ_HEAD(, ThreadPoolElement) request_list;
};

struct ThreadPoolElement {
    ThreadPool *pool;      // 所属线程池
    ThreadPoolFunc *func;  // 要在线程池中完成的工作
    void *arg;             // 线程池中完成的工作的参数

    /* Access to this list is protected by lock.  */
    QTAILQ_ENTRY(ThreadPoolElement) reqs; // 通过这个将自己放到 ThreadPool::request_list 上
};

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。