我总结出的内核工作队列中的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. Div不用float布局

    CSS代码 .wrapper1_4 { width: 100%; /* 也可以固定宽度 */ height: 26px; } .wrapper1_4 > .left { display: inl ...

  2. 『PyTorch』第二弹_张量

    参考:http://www.jianshu.com/p/5ae644748f21# 几个数学概念: 标量(Scalar)是只有大小,没有方向的量,如1,2,3等 向量(Vector)是有大小和方向的量 ...

  3. java判断时间为上午,中午,下午,晚上,凌晨

    public static void main(String[] args) { Date date = new Date(); SimpleDateFormat df = new SimpleDat ...

  4. python- Socket & Mysql 重要知识点

    socket :           解决粘包 并发编程          生产者消费者模型          进程池和线程池          回调函数          GIL全局解释器锁(理论) ...

  5. win 安装plsql的步骤

    1.下载oracle和plsql地址:http://pan.baidu.com/s/1bTlcom,http://pan.baidu.com/s/1c2BMsZe 2.首先安装plsql 这个比较简单 ...

  6. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转

    转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理  前言:      记录 IIS 相 ...

  7. vmplayer桥接以及nat配置nginx

    1.环境 centos6.4 vm player nginx1.8 2.虚拟机的防火墙 参考http://blog.csdn.net/qilovehua/article/details/4550713 ...

  8. 【LeetCode】矩阵操作

    1. 矩阵旋转 将 n × n 矩阵顺时针旋转 90°. 我的思路是 “ 从外到内一层一层旋转 ”. 一个 n × n 矩阵有 (n + 1) / 2 层,每层有 4 部分,将这 4 部分旋转. 顺时 ...

  9. Redis php常用操作

    $redis = new redis(); //连接 $redis->connect('127.0.0.1',6379); // //设置值 $result = $redis->set(' ...

  10. 码云git使用三(本地代码合并)

    现在我们已经学会了把“本地代码上传至码云git服务器”和“从码云git服务器下载代码到本地”. 我们现在学习怎么上传代码到服务器注意事项和步骤. 1.我们修改代码后,我们需要先+Add后再Commit ...