原文地址:schedule_delayed_work()用法作者:Valley
  第一篇 工作队列
      在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()是类似的。
       

(linux)schedule_delayed_work()的更多相关文章

  1. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  2. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  3. [内核]Linux workqueue

    转自:http://blog.chinaunix.net/uid-24148050-id-296982.html 一.workqueue简介workqueue与tasklet类似,都是允许内核代码请求 ...

  4. Linux workqueue疑问【转】

    转自:http://blog.csdn.net/angle_birds/article/details/9387365 各位大神,你们好.我在使用workqueue的过程中遇到一个问题. 项目采用uC ...

  5. Linux workqueue工作原理 【转】

    转自:http://blog.chinaunix.net/uid-21977330-id-3754719.html 转自:http://bgutech.blog.163.com/blog/static ...

  6. linux中断的上半部和下半部 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=24690947&id=3491821 一.什么是下半部 中断是一 ...

  7. Smart210学习记录-----linux定时器

    1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 stru ...

  8. linux工作队列

    工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到工作队列.说白了就是系统延时调度的一个自定义函数. 工作队列是实现延迟的新机制,从 2.5 版本 Lin ...

  9. Linux power supply class hacking

    /*************************************************************************** * Linux power supply cl ...

随机推荐

  1. Cucumber Vs RobotFramework

    I asked this same question a little over a year ago on this list when we were at your stage. Before ...

  2. POJ 2002 Squares [hash]

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 16631   Accepted: 6328 Descript ...

  3. unity的List构造函数在IOS平台存在缺陷

    当迩使用一个int[]或者string[]类似的数组时,以数组来初始化List对象,有可能在IOS平台上会出现初始化对象为空,比如 , }; List<int> listTest = ne ...

  4. Python入门--7--处理数据时学习到的东西

    一.数据导入(这里使用的是pands包) import pands as pd wenjian = pd.read_csv('路径') 二.数据变换 print wenjian.head()    # ...

  5. mac 获得进程信息的方法

    NSProcessInfo可以获得当前进程的信息.获得所有活动进程信息可以尝试使用下面的方法. 进程的信息可以通过ps命令得到也可以通过sysctl方法得到. 但是我总是不能获取进程的流量信息,关于这 ...

  6. 什么是 Linux

    什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络 ...

  7. Struts2的标签三大类是什么?

    Struts2 标签 一 Struts标签的简介: Struts2 自己封装了一套标签,比 JSTL 强大,而且与 Struts2 中的其他功能无缝结合. 当然 Strust2 标签的内容很多,随着版 ...

  8. 基于SSH+shiro+solr的家庭记账系统

    项目地址: https://github.com/jianghuxiaoao/homeaccount

  9. Dfs学习经验(纸上运行理解DFS)【两道题】

    首先我想吐槽的是,在CSDN上搞了好久还是不能发博客,就是点下发表丝毫反应都没有的,我稍微百度了几次还是没有找到解决方法,在CSDN的BBS上也求助过管理员但是没有收到答复真是烦躁,导致我新生入学以来 ...

  10. UNIDAC如何驱动MSSQL2000

    UNIDAC如何驱动MSSQL2000 如下图,PROVIDER必须设置为PRSQL.默认的PRAUTO,如果操作系统是XP可以,如果是WIN7以上的,不可以. 原因是MSSQL NATIVE 11已 ...