2020年6月24日星期三

【原创】Linux中断子系统(四)

背景

  • Read the fucking source code! --By 鲁迅
  • A picture is worth a thousand words. --By 高尔基

说明:

  1. Kernel版本:4.14
  2. ARM64处理器,Contex-A53,双核
  3. 使用工具:Source Insight 3.5, Visio

1. 概述

  • Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制;
  • Workqueue工作队列可以用作中断处理的Bottom-half机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠,而SoftirqTasklet在处理任务时不能睡眠;

来一张概述图:

  • 在中断处理过程中,或者其他子系统中,调用workqueue的调度或入队接口后,通过建立好的链接关系图逐级找到合适的worker,最终完成工作任务的执行;

2. 数据结构

2.1 总览

此处应有图:

  • 先看看关键的数据结构:
    1. work_struct:工作队列调度的最小单位,work item
    2. workqueue_struct:工作队列,work item都挂入到工作队列中;
    3. workerwork item的处理者,每个worker对应一个内核线程;
    4. worker_poolworker池(内核线程池),是一个共享资源池,提供不同的worker来对work item进行处理;
    5. pool_workqueue:充当桥梁纽带的作用,用于连接workqueueworker_pool,建立链接关系;

下边看看细节吧:

2.2 work

struct work_struct用来描述work,初始化一个work并添加到工作队列后,将会将其传递到合适的内核线程来进行处理,它是用于调度的最小单位。

关键字段描述如下:

struct work_struct {	atomic_long_t data;  //低比特存放状态位,高比特存放worker_pool的ID或者pool_workqueue的指针	struct list_head entry; //用于添加到其他队列上	work_func_t func;  //工作任务的处理函数,在内核线程中回调#ifdef CONFIG_LOCKDEP	struct lockdep_map lockdep_map;

没有评论:

发表评论