首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Linux内核深入分析

    workqueue

    所以内核引入了workqueue,工作队列运行在进程上下文,同时可以睡眠。在以前版本的内核中workqueue的代码比较简单。 在linux2.6.30代码量在1000行左右,而在linux3.18代码量在5000行左右。其中巨大的变化就是引入了Concurrency Managed Workqueue (cmwq)概念。 不过本篇先学习以前版本的workqueue,因为它简单。在了解了简单版本的存在问题之后在学习cmwq就有更好的认识。 workqueue原理 workqueue的工作原理和工厂流水线流程很相似。 当驱动程序不再使用workqueue的时候,就需要调用destory_workqueue函数销毁workqueue。 (per_cpu_ptr(wq->cpu_wq, cpu)); 内核提供的工作队列 linux系统会在初始化阶段init_workqueues创建一个名字为event的工作队列。

    1.4K20发布于 2020-03-24
  • 来自专栏人人都是极客

    扒开 Linux 中断的底裤之 workqueue

    cpu_pwqs:Per-CPU 创建 pool_workqueue numa_pwq_tbl[]:Per-Node 创建 pool_workqueue pool_workqueue: 中间人 / 中介 workqueue 和 pool_workqueue 是一对多的关系。 的初始化 内核在启动的时候会对 workqueue 做初始化,workqueue 的初始化包含两个阶段,分别是 workqueue_init_early 和 workqueue_init。 使用 workqueue 内核推荐驱动开发者使用默认的 workqueue,而不是新建 workqueue。 判断 workqueue 的类型,如果是 bound 类型,根据 CPU 来获取 pool_workqueue。如果是 unbound 类型,通过 node 号来获取 pool_workqueue

    2.7K51发布于 2021-08-25
  • 来自专栏后端开发技术

    异步处理的强力助手:Linux Workqueue 机制详解

    “ 在 Linux 内核中,workqueue 是一个重要的机制,用于处理那些不紧急且适合异步执行的任务。 一、workqueue简介 Linux工作队列(Workqueue)是一个内核中的机制,它可以异步执行一些任务。 那么,在Linux中断处理中它有什么作用呢?workqueue是一种异步执行工作的机制,它可以在Linux中断处理中使用。当内核需要异步执行某些任务时,可以使用workqueue机制。 workqueueLinux系统中用于实现异步任务调度的机制,它允许驱动程序和内核线程安排延迟执行的工作。 例如,展示如何在 Linux 内核中创建和销毁工作者线程:#include <linux/module.h>#include <linux/kernel.h>#include <linux/workqueue.h

    1.6K10编辑于 2024-08-01
  • 来自专栏嵌入式开发圈

    Linux设备驱动workqueue(工作队列)案例实现

    二、使用Linux工作队列 1、需要包含的头文件 1#include <linux/workqueue.h> 2、工作队列相关的数据结构(各个版本内核可能不同,这里用的是3.5) 1//工作队列结构 *create_workqueue(const char *name); 25 26调度指定队列: 27 int queue_work(struct workqueue_struct *wq, workqueue_struct *wq); 4、Demo实现(基于Tiny4412 Linux3.5内核) 1#include <linux/module.h> 2#include <linux include <linux/backlight.h> 7#include <linux/err.h> 8#include <linux/pwm.h> 9#include <linux/slab.h > /*jiffies*/ 17#include <linux/delay.h> 18#include <linux/interrupt.h> 19#include <linux/workqueue.h

    5.8K21发布于 2019-07-04
  • 来自专栏HaC的技术专栏

    (十)线程池参数——workQueue用法

    线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。 我们只需要实现BlockingQueue 这个接口即可。 ? 介绍一下常用的有三种workQueue 1.

    1.6K20发布于 2020-12-30
  • 来自专栏LINUX阅码场

    郭健: currency Managed Workqueue(CMWQ)概述

    一、前言 一种新的机制出现的原因往往是为了解决实际的问题,虽然linux kernel中已经提供了workqueue的机制,那么为何还要引入cmwq呢? 本文的代码来自linux kernel 4.0。 二、为何需要CMWQ? 对于workqueue的用户而言,前端的操作包括二种,一个是创建workqueue。可以选择创建自己的workqueue,当然也可以不创建而是使用系统缺省的workqueue。 在旧的workqueue机制中,workqueue和worker thread是密切联系的概念,对于single workqueue,创建一个系统范围的worker thread,对于multi workqueue 除了alloc_workqueue接口API之外,还可以通过alloc_ordered_workqueue这个接口API来创建一个严格串行执行work的一个workqueue,并且该workqueue

    1.4K10发布于 2019-10-08
  • 来自专栏Nicky's blog

    Java 线程池 WorkQueue 的作用

    线程池 WorkQueue 作用 & 必背面试题 3 分钟速记,背完直接拿分! 一句话记忆 WorkQueue 是线程池的「任务缓冲带」 缓冲:避免瞬间创建大量线程 解耦:生产者线程 与 工作线程 解耦 排队:任务 > 核心线程数时,先排队,再扩容,最后拒绝 面试 6 连问 & WorkQueue 在线程池中的作用? 缓冲任务、解耦生产/消费、控制并发。 2. 线程池有哪 4 种内置队列?

    11910编辑于 2025-08-13
  • 来自专栏IOT物联网小镇

    Linux驱动实践:中断处理中的【工作队列】 workqueue 是什么鬼?

    这篇文章,我们就通过实际的代码操作,来演示一下工作队列(workqueue)的使用方式。 工作队列是什么 工作队列是Linux操作系统中,进行中断下半部分处理的重要方式! 例如下面这些工作队列,就是内核默认创建的(include/linux/workqueue.h): /* * System-wide workqueues which are always present (kernel/workqueue.c): int __init workqueue_init_early(void) { ... 创建驱动程序源文件和 Makefile: $ cd tmp/linux-4.15/drivers $ mkdir my_driver_interrupt_wq $ touch my_driver_interrupt_wq.c #include <linux/kernel.h> #include <linux/module.h> #include <linux/interrupt.h> static int irq;

    2.4K40编辑于 2021-12-28
  • 来自专栏陶然同学博客

    【RabbitMQ】Basic Queue 简单队列模型与WorkQueue

    目录 SpringAMQP 1 Basic Queue 简单队列模型 1.1.消息发送 1.2.消息接收 1.3.测试 2 WorkQueue 2.1.消息发送 2.2.消息接收 2.3.测试 2.4. System.out.println("spring 消费者接收到消息:【" + msg + "】"); } } 1.3.测试 启动consumer服务,然后在publisher服务中运行测试代码,发送MQ消息 2 WorkQueue 在publisher服务中的SpringAmqpTest类中添加一个测试方法: /** * workQueue * 向队列中不停发送消息,模拟消息堆积。

    39230编辑于 2023-02-24
  • 来自专栏云原生实验室

    Kubernetes 源码剖析之 WorkQueue 队列 | 文末送书

    本文主要通过 WorkQueue 的源码来分析其工作原理。 WorkQueue 称为工作队列,Kubernetes 的 WorkQueue 队列与普通 FIFO(先进先出,First-In, First-Out)队列相比,实现略显复杂,它的主要功能在于标记和去重 另外,WorkQueue 中的限速及延迟队列都基于 Interface 接口实现,其提供如下方法: // 代码路径:vendor/k8s.io/client-go/util/workqueue/queue.go 下面会分别详解 WorkQueue 提供的 4 种限速算法,应对不同的场景,这 4 种限速算法分别如下。 令牌桶算法(BucketRateLimiter)。 但 WorkQueue 在此基础上扩展了 fast 和 slow 速率。

    3K20发布于 2020-07-09
  • 来自专栏想法独特的Dev+Ops

    k8s client-go 的 workqueue 源码分析

    本文阅读代码链接:https://github.com/kubernetes/client-go/tree/release-1.30下面代码全部在 util/workqueue 文件中:一. workqueue 基本概念在 client-go 的 util/workqueue 包中,主要有三个队列:普通队列、延时队列和限速队列。 二. workqueue主要作用workqueue 主要用于 Kubernetes 控制器中处理事件和任务的队列系统,它具有以下主要作用:任务管理 :提供了一种机制来管理需要处理的任务,确保任务按照一定的顺序被处理 {}) int { return q.rateLimiter.NumRequeues(item)}5.3 限速器实现Kubernetes 提供了多种限速器实现,以适应不同的场景限速器在util/workqueue 使用示例6.1 Queue// 创建一个普通队列queue := workqueue.New()// 添加一个项目queue.Add("task1")// 获取一个项目item, shutdown :=

    30700编辑于 2025-03-18
  • 来自专栏做不甩锅的后端

    java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)

    WorkQueue的源码。 1.类结构及其成员变量 1.1 类结构和注释 WorkQueue是ForkJoinPool的核心内部类,是一个Contented修饰的静态内部类。 @Contented注释用来提醒jvm将workQueue在执行的时候与其他对象进行区别。 > 主要用于帮助窃取 2.构造函数 WorkQueue就一个构造函数: WorkQueue(ForkJoinPool pool, ForkJoinWorkerThread owner) { 这样的话,如果我们采用异步模式,asyncMode为true的时候,workQueue则会采用FIFO_QUEUE的model,这样workQueue本身就使用的时poll方法。 反之如果使用LIFO_QUEUE的同步模式,则workQueue使用pop方法。默认情况下采用同步模式。同步的时候workQueue的指针都围绕在数组的初始化的中间位置波动。

    95320发布于 2020-09-28
  • 来自专栏Linux问题笔记

    workqueue相关数据结构在内核crash分析中的实战应用

    关于workqueue机制的介绍文章比较多,主要就几个核心的数据结构:work_struct/worker/workqueue/worker_pool/ 不展开讲这些数据结构,而是通过利用他们的关系在crash manager_arb; [0x310] struct mutex manager_mutex; [0x338] struct idr worker_idr; [0x360] struct workqueue_attrs sym 0xffffffff91dd7de0 ffffffff91dd7de0 (t) vmstat_update /usr/src/debug/kernel-3.10.0-957.21.3.el7/linux 0xffffffff91e376e0 ffffffff91e376e0 (t) vmpressure_work_fn /usr/src/debug/kernel-3.10.0-957.21.3.el7/linux 0xffffffff91d22ec0 ffffffff91d22ec0 (t) cgroup_release_agent /usr/src/debug/kernel-3.10.0-957.21.3.el7/linux

    1.3K40发布于 2021-05-21
  • 来自专栏开源519

    工作队列

    ; kernel/include/linux/workqueue.h 创建一个工作队列: a. . */ create_workqueue(name); 相对于create_singlethread_workqueue, create_workqueue同样会分配一个wq的工作队列,但是不同之处在于 动态注册 //kernel/include/linux/workqueue.h INIT_WORK(_work, _func) b. 静态注册 //kernel/include/linux/workqueue.h DECLARE_WORK(_work, _func) 使用静态注册可以省略定义_work,且DECLARE_WORK 使用流程 1.声明变量 struct test_work_dev work_dev; static struct workqueue_struct * test1_workqueue = NULL;

    1.1K10发布于 2020-07-28
  • 来自专栏嵌入式ARM和Linux

    Linux内核23-工作队列

    1 工作队列 Linux2.6版本中引入了工作队列概念,代替Linux2.4版本中的任务队列。用以实现注册激活某些函数,留待稍后由工作线程执行(与tasklet的处理类似)。 每个元素都是一个类型为cpu_workqueue_struct的描述符,其成员如下表所示: 表4-12 cpu_workqueue_struct结构成员 保护数据结构的自旋锁 worklist是一个双向链表 使用create_workqueue("foo")创建一个工作队列。foo是工作队列的名称,函数返回新创建的workqueue_struct的地址。 销毁工作队列使用destroy_workqueue()函数,参数是一个指向workqueue_struct结构的指针。 除了通用的events队列,在Linux2.6内核中还可以发现一些特定的工作队列。最重要的是kblockd工作队列,由阻塞设备层使用。 3 总结 工作队列的场合比较适用于驱动程序开发。

    1.4K10编辑于 2022-08-15
  • 来自专栏移动开发的那些事儿

    从源码的角度分析ThreadPoolExecutor实现原理

    = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = ,避免了每一个线程都去start,既占用了对象内存,又申请了线程资源,对于java来说运行一个线程需要去申请线程的运行内存的,在底层是用pthread_create去创建一个linux线程,代价相对来说比较大 workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take(); ThreadPoolExecutor,这时候execute多次,一定要等上一次的任务执行完成之后才能执行下一次的任务 Java线程start起来之后会有两个部分的内存占用,一个是JVM部分的线程对象资源,而真正开线程的其实是用linux 的pthread_create去开启了一个linux线程实现异步的,所以这里还占用了系统底层的线程资源,因此开启一个Java线程的代价比直接用native方法去开启一个linux线程要大,占用的内存资源要多

    60020发布于 2018-09-04
  • 来自专栏嵌入式项目开发

    Linux驱动开发-内核共享工作队列

    在工作队列里,我们把推后执行的任务叫做工作(work),描述它的数据结构为work_struct,这些工作以队列结构组织成工作队列(workqueue),其数据结构为workqueue_struct,而工作线程就是负责执行工作队列中的工作 相关函数、结构介绍 2.1 工作结构 定义文件: Workqueue.h (linux-3.5\include\Linux) 原型: struct work_struct { atomic_long_t 2.2 工作函数介绍 定义文件 Workqueue.h (linux-3.5\include\linux) 函数原型 typedef void (*work_func_t)(struct work_struct #include <linux/workqueue.h> static struct work_struct work; static struct m_key_info *key_info_p=NULL /mutex.h> #include <linux/signal.h> /*信号相关头文件*/ #include <linux/workqueue.h> /*工作队列相关*/

    2.6K50编辑于 2022-04-08
  • 来自专栏人人都是极客

    吐血整理 | 肝翻 Linux 中断所有知识点

    Linux 中断管理机制 GIC 硬件原理 GIC,Generic Interrupt Controller。是ARM公司提供的一个通用的中断控制器。 linux 内核为了应对此问题,引入了 irq_domain 的概念。 irq_domain 的引入相当于一个中断控制器就是一个 irq_domain。这样一来所有的中断控制器就会出现级联的布局。 每一个中断控制器对应多个中断号, 而硬件中断号在不同的中断控制器上是会重复编码的, 这时仅仅用硬中断号已经不能唯一标识一个外设中断,因此 linux kernel 提供了一个虚拟中断号的概念。 包括从设备树获取中断源信息的解析,硬件中断号到 Linux 中断号的映射关系,irq_desc 等各个结构的分配及初始化、中断的注册等等,总而言之,就是完成静态关系创建,为中断处理做好准备。 使用 workqueue 内核推荐驱动开发者使用默认的 workqueue,而不是新建 workqueue

    5.2K61发布于 2021-08-25
  • 来自专栏程序手艺人

    [ Linux驱动炼成记 ] 12 -音频驱动TAS5754添加EQ参数

    驱动写入EQ EQ参数实际对应的都是芯片寄存器值,驱动中需要通过IIC写入到音频芯片中,由于音频芯片的EQ参数很多,需要单独在线程中写入,而不影响驱动的正常加载,这就需要内核中Workqueue机制2 struct workqueue_struct *workqueue; struct delayed_work dwork; .... }; 创建工作队列 static int tas575x_set_dai_fmt = create_singlethread_workqueue("tas575x_workqueue"); // 创建工作,调用函数是tas575x_task INIT_DELAYED_WORK( &priv->dwork,tas575x_task); //延时5s去执行 queue_delayed_work(priv->workqueue,&priv->dwork,5); return in linux ---- EQ均衡器 ↩︎ workqueue 机制 ↩︎

    1.6K20发布于 2019-02-20
  • 来自专栏全栈程序员必看

    全志A33之添加电容触摸GT911驱动[通俗易懂]

    : #ifndef _LINUX_GOODIX_TOUCH_H #define _LINUX_GOODIX_TOUCH_H #include <linux/kernel.h> #include <linux /hrtimer.h> #include <linux/i2c.h> #include <linux/input.h> #include <linux/module.h> #include <linux #include <linux/earlysuspend.h> #endif #include <linux/device.h> #include <linux/slab.h> #include <linux #include <linux/input/mt.h> #endif static const char *goodix_ts_name =”gt9xx”; static struct workqueue_struct (gtp_esd_check_workqueue); if(gtp_esd_check_workqueue) destroy_workqueue(gtp_esd_check_workqueue

    3.4K10编辑于 2022-07-04
领券