原文地址: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. HDU4405-Aeroplane chess(概率DP求期望)

    Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...

  2. net2:类,事件与委托

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  3. flask-script插件

    首先在启动Flask项目时,我们可以传不同的参数作为运行参数.但是我们只能在入口app.run()传参.这样十分的不方便.Flask-Script 是一个 Flask 扩展,为 Flask 程序添加了 ...

  4. MBP清除NVRAM和PRAM

    Mac 会将某些设置存储在特定的存储区中,即使关机这些设置也不会丢失.在基于 Intel 的 Mac 上,存储位置是称为 NVRAM 的内存:而在基于 PowerPC 的 Mac 上,存储位置则是称为 ...

  5. MongoDB增删改查操作详解(命令行)

    一.插入 MongoDB的插入操作很简单,使用insert方法,这里演示从创建数据库.创建集合到插入文档.查询文档. 集合创建方法参数说明: size:集合最大空间 max:集合最多文档数量 (超出s ...

  6. P2085 最小函数值 洛谷

    https://www.luogu.org/problem/show?pid=2085 题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*) ...

  7. 关于SIP一些总结

    SIP(session Initiation protocol)会话初始协议,是应用层信令控制协议,主要应用于创建.修改.释放多媒体会话. 一般而言,SIP只负责不同UE之间的协商与通信,比如媒体能力 ...

  8. Cesium调用Geoserver发布的 WMS、WFS服务

    1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装,同时安装geopackage扩展,以备使用.使用XX地图下载器下载地图,导出成GeoPackage地图文件. (1 ...

  9. CAS 跨域原理

    http://www.blogjava.net/rain1102/articles/227739.html CAS(Central Authentication Service) 是 Yale 大学发 ...

  10. C语言qsort

    C/C++中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明,其原型为: void qsort(void *base, int nelem, unsigned int width, ...