工作队列
在Linux内核中,对下半部(或者说推后执行的工作)的处理方式有好几种,包括BH(bottom
half),软中断,Tasklets和工作队列等等。在2.6内核中,大名鼎鼎的BH处理被废除,新增了更方便的工作队列。工作队列的方便之处在于它把 工作推后,交由一个内核线程去执行,这个内核线程总会在进程上下文执行,因此,它就可以很方便的持有信号量(semaphore),当然也可以允许睡眠。
内核对工作队列的处理是通过工作者线程完成的。工作者线程在一般情况下处于睡眠状态,当我们把需要推迟执行的工作注册到工作队列中之后,唤醒工作者线程会 遍历工作队列中的每个待处理的工作,并执行工作队列结构work_struct中的func函数。这里涉及到两个概念:工作者线程和工作队列。首先看看我 们最关心的工作队列。
struct work_struct *delayed_work;
INIT_WORK(delayed_work, delayed_work_handler, data);
schedule_work(delayed_work);
delayed_work是我们声明的工作队列;通过INIT_WORK对工作队列进行初始化,delayed_work_handler是工作队列的处 理函数,data是传递给处理函数的参数;最后调用schedule_work唤醒工作者线程处理推后执行的工作。如果需要经过一段延迟以后再执行工作, 可以调用:
schedule_delayed_work(delayed_work, delay); //delay 是需要延迟的节拍数
另外还有一种静态创建工作队列的方式:
DECLARE_WORK(name, void (func) (void ), void *data);
大部分情况下我们了解到这里已经足够了。工作者线程可以放心的交给内核去完成。对于工作者线程的使用有两种方式,一是直接使用内核中每个CPU对应的一个 缺省工作者线程envents/n(n代表CPU的序号,从0开始);再者就是自己创建一个专用的工作者线程。对于通常情况下,驱动开发者是不必关心工作 者线程的,缺省的工作者线程能够做的很好。如果缺省的队列不能满足要求,自己创建一个工作者线程也很简单,只需要调用:
struct workqueue_struct *create_workqueue(const char *name);
调度时使用如下函数:
int queue_work(struct workqueue_struct *wq, struct work_struct *work);

int queue_delayed_work(struct workqueue_struct *wq, struct work_struct
*work, unsigned long delay);
它们与schedule_work()以及schedule_delayed_work()是类似的

schedule_delayed_work()用法相关推荐

  1. linux 工作队列之schedule_delayed_work用法

    文章目录 前言 一.定义自己的delayed_work 二.定义在工作队列中被调用的函数 1.在工作队列中被调用的函数原型 2.定义在工作队列中被调用的自己实现的函数 三.初始化数据结构 四.提交任务 ...

  2. schedule_delayed_work 用法详解

    1 声明一个delayed_work DECLARE_DELAYED_WORK(work,work_fun); 2 schedule delayed_work,需要指明延迟时间. schedule_d ...

  3. linux内核驱动工作队列用法

    在编写input相关驱动时(比如键盘驱动.触摸屏驱动),需要考虑到及时获取按键或屏幕触摸对相关Gpio的修改值情况. 常见的两种获取方式:     一. 通过触发中断号读取相关Gpio值信息:     ...

  4. 等待队列、工作队列、消息队列的区别和用法

    目录 1.等待队列 2.工作队列 3.消息队列 1.等待队列 等待队列是一种实现阻塞和唤醒的内核机制,与进程调度机制紧密结合,能够用于实现内核中的异步事件通知机制.可以实现线程的软等待,当符合条件时从 ...

  5. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  6. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  7. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  8. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  9. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

最新文章

  1. 华南理工大学院长涉嫌篡改8名研究生成绩,4人已停职
  2. Unity3D入门基础之游戏对象 (GameObject) 和组件 (Component) 的关系
  3. android系统 通知管理,Android的通知系统
  4. 一些比较有用的SQL操作,2011最新整理
  5. 文件的写操作 c# 1614527940
  6. 技嘉z77主板msata速度_功不可没的技嘉Z77主板_主板评测-中关村在线
  7. android 框架_推荐一个更贴近 android 场景的启动框架 | Anchors
  8. 解决CentOS遇到Qt编译(error: cannot find -lGL)
  9. POJ NOI MATH-7833 幂的末尾
  10. jQuery应用实例4:下拉列表
  11. StanfordDB class自学笔记 (5) JSON Data
  12. 达观智能制造知识图谱平台助力实现先进制造业“十四五”规划
  13. js获取ip地址的私有地址 或者公有地址
  14. SLG游戏中绘制六边形网格地形
  15. 35岁的程序员:第18章,私欲
  16. jQuery插件库链接
  17. FTP服务器搭建报错Warning: FTP over TLS is not enabled, users cannot securely log in.
  18. 关于王者荣耀技术背景的文章
  19. RJ45接头 和 RJ48接头的区别
  20. 伦茨课堂-关于BQB认证

热门文章

  1. SQL优化的思路和步骤
  2. HiCexplorer处理Hi-C数据
  3. html响应式布局是什么,什么是响应式网页设计?响应式布局的实现原理
  4. JavaSE高级 网络编程
  5. 解除树莓派USB接口供电限制
  6. java zip 解压 密码_Java解压和压缩带密码的zip文件过程详解
  7. 安徽省计算机二级考试知识点,安徽省计算机省二级考试大纲
  8. RK3399平台开发系列讲解(内核调试篇)2.15、Realtek千兆PHYRTL8211FS相关寄存器操作
  9. 面试趣味题整理(一)
  10. 伺服电机的选型计算方法