我总结出的内核工作队列中的4种用法

1. 使用系统的工作队列(不延迟)

  1)定义一个工作:

struct work_struct my_work;

  2)编写一个函数:

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  3)将工作和函数绑定(一般在open函数里面执行)

INIT_WORK(&my_work, my_work_func);

  4)调度工作(实际上是加入到系统的工作队列中)

schedule_work(&my_work);

2. 使用系统的工作队列(延迟)

  1)定义一个延迟工作

struct delayed_work my_delayed_work;

  2)编写一个函数

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  3)将延迟工作和函数绑定(一般在open函数里进行)

INIT_DELAYED_WORK(&my_delayed_work, my_work_func);

  4)调度工作(实际上是加入系统的工作队列中)

schedule_delayed_work(&my_delayed_work, );
schedule_delayed_work函数传入的第二个参数为系统的节拍数,一般系统默认为200Hz,因此2个节拍表示10ms,10ms之后再调用工作中的函数。

3. 使用自己的工作队列(不延迟)

  1)定义一个自己的工作队列指针

struct workqueue_struct *p_my_workqueue;

  2)创建一个工作队列,并接收返回值,可以用create_singlethread_workqueue或者create_workqueue,这一步一般在open函数中实现。

p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");

  3)定义一个工作

struct work_struct my_work;

  4)编写一个函数

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  5)将工作和函数绑定(一般在open函数里面执行)

INIT_WORK(&my_work, my_work_func);

  6)将工作插入工作队列中便会调用工作中注册的函数

queue_work(p_my_workqueue, &my_work);

  7)销毁工作队列

destroy_workqueue(p_my_workqueue);

 

4. 使用自己的工作队列(延迟)

  1)定义一个自己的工作队列指针

struct workqueue_struct *p_my_workqueue;

  2)创建一个工作队列,并接收返回值,可以用create_singlethread_workqueue或者create_workqueue,这一步一般在open函数中实现。

p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");

  3)定义一个延迟工作

struct delayed_work my_delayed_work;

  4)编写一个函数

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  5)将延迟工作和函数绑定(一般在open函数里进行)

INIT_DELAYED_WORK(&my_delayed_work, my_work_func);

  6)将工作插入工作队列中,n个节拍之后便会调用工作中注册的函数(n为queue_delayed_work函数中最后一个参数)

queue_delayed_work(p_my_workqueue, &my_delayed_work, );

  7)销毁工作队列

destroy_workqueue(p_my_workqueue);

推荐文章:https://www.ibm.com/developerworks/cn/linux/l-cn-cncrrc-mngd-wkq/

linux内核工作队列使用总结的更多相关文章

  1. Linux 内核工作队列之work_struct 学习总结

    前言 编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有de ...

  2. Linux内核实现透视---工作队列

    作为Linux中断低半部的另一种实现机制的基础,工作队列的出现更多的是为了解决软中断和Tasklet对于用户进程的时间片的不良影响问题的.工作队列本身是可以使用内核线程来替代的,但是使用线程来实现复杂 ...

  3. Linux内核中的软中断、tasklet和工作队列具体解释

    [TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...

  4. [Linux内核]软中断、tasklet、工作队列

    转自:http://www.cnblogs.com/li-hao/archive/2012/01/12/2321084.html 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制, ...

  5. 《深入理解Linux内核》软中断/tasklet/工作队列

    软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任 ...

  6. Linux内核学习之工作队列

    Author       : Toney Email         : vip_13031075266@163.com Date          : 2020.12.02 Copyright : ...

  7. linux 内核 tasklets 原理以及工作队列

    如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的.因此诞生了弥补以上两个要求的tasklet.它具有以下特性: a)一种特定类型的tasklet只能运行在一个CPU上,不能并行, ...

  8. 20169212《Linux内核原理与分析》第六周作业

    视频学习 一.用户态.内核态和中断 内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 用户态:处于低的执行级别下,代码只能在级别允许的特定范围内活动.在日 ...

  9. Linux内核中断学习

    1.内核中断概述 (1)在OS环境下编写中断处理函数与之前在裸机中编写中断处理函数的方式是不一样的,在Linux内核中提供了一套用来管理硬件中断资源的软件体系架构. (2)在操作系统中,中断号与gpi ...

随机推荐

  1. Flex scroller皮肤的使用

    Flex4 scroller 自定义皮肤 十月 15, 2010 Posted by admin flex4里引入了sparkSkin, spark包里的可视控件可以通过指定skinClass的值来修 ...

  2. 小程序for循环嵌套

    <view class='nocontnt' wx:if="{{listLength == 0 }}"> 暂无相关评论 </view> <view c ...

  3. gitlab 集成Jenkins

    项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将git路径存在这里还需要权限认证,否则会出现error  我 ...

  4. raw_input 和input 区别

    raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收).而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它 ...

  5. HTTP请求/响应报文结构

    HTTP协议版本有两种:HTTP1.0和HTTP1.1 它们俩的区别在于:HTTP1.0对于每个连接都只能传送一个请求和响应,请求后就会关闭,HTTP1.0没有Host字段:而HTTP1.1在同一个连 ...

  6. spring boot(十八)集成FastDFS文件上传下载

    上篇文章介绍了如何使用Spring Boot上传文件,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包 ...

  7. nodejs进程线程优化性能

    1. node.js 单线程的特点 node.js 以异步非阻塞单线程,作为其执行速度的保障.什么是非阻塞单线程? 举一个现实生活中的例子,我去巢大食堂打饭,我选择了A套餐,然后工作人员区为我配餐,我 ...

  8. oracle数据库静态监听配置示例

    [oracle@Oracle11g admin]$ cat listener.ora SID_LIST_LISTENER =  (SID_LIST =    (SID_DESC =     (GLOB ...

  9. [HNOI2002] 营业额统计

    题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...

  10. JDBC、JNDI和DBCP的区别

    JDBC:Java DataBase Connectivity,java连接数据库和执行SQL语句的API. 数据源:Data Source.就是将IP.数据库.用户名.密码封装起来对外只提供一个JN ...