我总结出的内核工作队列中的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. BGP华为、思科选路规则

    选路规则 华为BGP选路规则 思科BGP选路规则 第0条 下一跳是否可达,如果不可达则不参与选路 BGP 向IBGP对等体发布import引入的IGP路由时, 将下一跳属性改为自身的接口地址,而非IG ...

  2. Digital Deletions HDU - 1404

    Digital deletions is a two-player game. The rule of the game is as following. Begin by writing down ...

  3. xShell的简单操作记录

    查看java进程: ps ux | grep java 显示当前所有java进程pid的命令:jps 将压缩文件从本地上传到服务器上:rz 打包成jar包:mvn clean package -Dma ...

  4. Matlab-1:jacobi迭代法工具箱

    function [u,n]=Jacobi(A,b,u0,eps,varargin) %Jacobi.m函数为用于雅可比迭代法求解线性方程组 %A为线性方程组的系数矩阵 %b为线性方程组的常数向量 % ...

  5. 关于react16.4——高阶组件(HOC)

    高阶组件是react中用于重用组件逻辑的高级技术.可以说是一种模式.具体来说呢,高阶组件是一个函数,它接收一个组件并返回一个新的组件. 就像这样, const EnhancedComponent = ...

  6. CSS text-decoration 属性

    定义和用法 text-decoration 属性规定添加到文本的修饰. 注释:修饰的颜色由 "color" 属性设置. 说明 这个属性允许对文本设置某种效果,如加下划线.如果后代元 ...

  7. 切换JDK版本时修改JAVA_HOME环境变量不生效(转)

    当电脑上存在多个版本的JDK时,可能 会遇到想切换版本时无论你如何改JAVA_HOME的路径 进入cmd java -version 都无法得到最新设置的JDK版本 如果遇到类似以下信息 Regist ...

  8. Ubuntu 系统优化(不定时更新)

    系统美化 1. 为Ubuntu安装Numix主题和图标 sudo add-apt-repository ppa:numix/ppa sudo apt-get update sudo apt-get i ...

  9. Thinkphp5 Nginx Pathinfo配置

    server { listen ; server_name sui.com; root /tmmee/sad.cn/public; index index.php index.html index.h ...

  10. java 中多播、广播编程

    在 IP 协议层,有多播.广播的概念.IP 地址分为网络地址和主机地址,主机地址全部为1,就是广播地址.多播使用 D 类地址,从 224.0.0.0 到 239.255.255.255.IP 多播需要 ...