Skip to content

Latest commit

 

History

History
42 lines (27 loc) · 1.59 KB

workqueue.md

File metadata and controls

42 lines (27 loc) · 1.59 KB

内核工作队列

在某些情景下内核会将一些耗时的、可延迟的工作放到 工作队列 中,内核会在适当的时机处理 工作队列 中的工作,就像应用层开发的 消息队列 一样。

一、工作队列对象

内核使用 workqueue_struct 对象来存储要延迟执行的工作,其定义如下:

struct workqueue_struct {
    struct cpu_workqueue_struct *cpu_wq; // 真正存储延迟执行工作的地方, 每个拥有CPU一个
    struct list_head list;               // 用于把内核中所有的工作队列连接起来
    const char *name;                    // 工作队列的名字
    int singlethread;                    // 是否只启动一个工作线程
    ...
};

workqueue_struct 对象中,cpu_wq 字段才是真正存储延迟执行工作的地方,其类型为 cpu_workqueue_struct,我们来看看 cpu_workqueue_struct 的定义:

struct cpu_workqueue_struct {
    spinlock_t lock;                   // 用于锁定工作队列
    struct list_head worklist;         // 存储延迟执行工作的队列
    wait_queue_head_t more_work;       // 用于唤醒工作队列线程
    struct work_struct *current_work;  // 当前正在执行的工作
    struct workqueue_struct *wq;       // 指向工作队列的指针
    struct task_struct *thread;        // 执行工作队列的进程
    ...
} ____cacheline_aligned;

workqueue_structcpu_workqueue_struct 之间的关系如下图所示: