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

    workqueue

    Workqueue引入 在之前的softirq中提到过,内核在中断的bottom half引入了softirq, tasklet, workqueue。 所以内核引入了workqueue,工作队列运行在进程上下文,同时可以睡眠。在以前版本的内核中workqueue的代码比较简单。 workqueue原理 workqueue的工作原理和工厂流水线流程很相似。 (worker_thread)所在的进程空间 workqueue_struct struct workqueue_struct { struct cpu_workqueue_struct *cpu_wq 当驱动程序不再使用workqueue的时候,就需要调用destory_workqueue函数销毁workqueue

    1.4K20发布于 2020-03-24
  • 来自专栏HaC的技术专栏

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

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

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

    郭健: currency Managed Workqueue(CMWQ)概述

    对于workqueue的用户而言,前端的操作包括二种,一个是创建workqueue。可以选择创建自己的workqueue,当然也可以不创建而是使用系统缺省的workqueue。 在旧的workqueue机制中,workqueue和worker thread是密切联系的概念,对于single workqueue,创建一个系统范围的worker thread,对于multi workqueue 2、调度work执行也保持和旧的workqueue一致。 3、创建workqueue。 在描述这些workqueue的接口之前,我们需要准备一些workqueue flag的知识。 除了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
  • 来自专栏人人都是极客

    扒开 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
  • 来自专栏陶然同学博客

    【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
  • 来自专栏后端开发技术

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

    一、workqueue简介 Linux工作队列(Workqueue)是一个内核中的机制,它可以异步执行一些任务。 workqueue由一个或多个worker线程池组成,每个worker线程都会不断地从workqueue中获取需要执行的工作项。 例如,用于向工作队列中添加任务:#include <linux/workqueue.h>// 定义工作队列对象static struct workqueue_struct *my_workqueue;/ 在使用Workqueue时,需要注意以下几个问题:内存泄漏:如果没有正确地释放Workqueue占用的内存,可能会导致内存泄漏。例如,在Workqueue中分配了内存,但在工作完成后没有及时释放。 性能问题:Workqueue本身也可能成为系统瓶颈,如果Workqueue被大量占用,则可能会对系统的性能产生负面影响。因此,开发人员需要仔细评估Workqueue的使用情况,并进行必要的优化。

    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, struct work_struct *work); 28 29延迟调度指定队列: 30 int queue_delayed_work(struct workqueue_struct *wq, 31 struct work_struct *work, unsigned long delay); 32销毁队列: 33 void destroy_workqueue(struct workqueue_struct *wq); 4、Demo实现(基于Tiny4412 Linux3.5内核) 1#include <linux/module.h> 2#include <linux

    5.8K21发布于 2019-07-04
  • 来自专栏云原生实验室

    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

    1.3K40发布于 2021-05-21
  • 来自专栏IOT物联网小镇

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

    工作队列中有两个重要的结构体:工作队列(workqueue_struct) 和 工作项(work_struct): struct workqueue_struct { struct list_head *system_highpri_wq; extern struct workqueue_struct *system_long_wq; extern struct workqueue_struct * system_unbound_wq; extern struct workqueue_struct *system_freezable_wq; extern struct workqueue_struct (kernel/workqueue.c): int __init workqueue_init_early(void) { ... system_wq = alloc_workqueue("events", 0, 0); system_highpri_wq = alloc_workqueue("events_highpri"

    2.4K40编辑于 2021-12-28
  • 来自专栏开源519

    工作队列

    ; kernel/include/linux/workqueue.h 创建一个工作队列: a. failure. */ create_singlethread_workqueue(name); b. . */ create_workqueue(name); 相对于create_singlethread_workqueue, create_workqueue同样会分配一个wq的工作队列,但是不同之处在于 使用流程 1.声明变量 struct test_work_dev work_dev; static struct workqueue_struct * test1_workqueue = NULL; defined(DECLARE_WORK_SUPPORT) static struct work_struct test1_item; test1_workqueue = create_singlethread_workqueue

    1.1K10发布于 2020-07-28
  • 来自专栏冰河技术

    10分钟手撸Java线程池,yyds!!

    DEFAULT_WORKQUEUE_SIZE:静态常量,表示默认的阻塞队列大小。 workQueue:模拟实际的线程池使用阻塞队列来实现生产者-消费者模式。 主要的作用就是消费workQueue中的任务,并执行任务。由于工作线程需要不断从workQueue中获取任务,所以,这里使用了while(true)循环不断尝试消费队列中的任务。 核心代码如下所示。 //内部类WorkThread,模拟线程池中的工作线程 //主要的作用就是消费workQueue中的任务,并执行 //由于工作线程需要不断从workQueue中获取任务,使用了while(true)循环不断尝试消费队列中的任务 this.workQueue = workQueue; //创建poolSize个工作线程并将其加入到workThreads集合中 IntStream.range(0, poolSize ){ this.workQueue = workQueue; //创建poolSize个工作线程并将其加入到workThreads集合中 IntStream.range

    46520编辑于 2022-06-15
  • 来自专栏人人都是极客

    万字整理 | 深入理解工作队列

    1.3.1 系统workqueue 1.3.2 workqueue创建 1.3.3 flush_workqueue() 1.4 pool_workqueue 1.5 work 1.5.1 queue_work pwq(pool_workqueue):中间人/中介,负责建立起workqueue和worker_pool之间的关系。 ;  int cpu, ret;  // (3.1) normal workqueue  // pool_workqueue链接workqueue和worker_pool的过程  if (! workqueue就是存放一组work的集合,基本可以分为两类:一类系统创建的workqueue,一类是用户自己创建的workqueue。 :) 1.4 pool_workqueue pool_workqueue只是一个中介角色。

    2.3K31编辑于 2022-08-26
  • 来自专栏golang算法架构leetcode技术php

    mac 上学习k8s系列(21)CRD (part III)

    controller.enqueueFoo, UpdateFunc: func(old, new interface{}) {controller.enqueueFoo(new)}, workqueue : workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "Foos"), () defer c.workqueue.Done(obj) c.workqueue.Forget(obj) err := c.syncHandler(key); err = nil c.workqueue.AddRateLimited(key) c.workqueue.Forget(obj) 这个函数的作用,就是不断从workqueue (key) workqueue是一个RateLimitingInterface type Controller struct workqueue workqueue.RateLimitingInterface

    45521编辑于 2022-08-02
  • 来自专栏全栈程序员必看

    linux大量kworker_linux load average 非常高

    和kworker源码kernel/workqueue.c Why cmwq? (void) { system_wq = alloc_workqueue("events", 0, 0); system_highpri_wq = alloc_workqueue("events_highpri | WQ_POWER_EFFICIENT, 0); } struct workqueue_struct *__alloc_workqueue_key(const char *fmt, unsigned /sys/devices/virtual/workqueue/writeback/pool_ids 0:4 /sys/devices/virtual/workqueue/writeback # cat /sys/devices/virtual/workqueue/writeback/nice 0 结构体pool_workqueue /* * The per-pool workqueue.

    4.2K10编辑于 2022-11-08
  • 来自专栏CNCF

    KubeVirt深度剖析系列之:virt-controller源码分析

    收到Event事件之后加入到workQueue。 VM对象的Event事件直接加入workQueue。 收到Event事件之后加入到workQueue。 VMI对象的Event事件直接加入workQueue。 收到Event事件之后加入到workQueue。 VMI对象的Event事件直接加入workQueue。 收到Event事件之后加入到workQueue。 VMI对象的Event事件直接加入workQueue。。 依次加入workQueue,尝试将该VMI对象收养。

    3.1K21发布于 2020-12-28
  • 来自专栏嵌入式ARM和Linux

    Linux内核23-工作队列

    每个元素都是一个类型为cpu_workqueue_struct的描述符,其成员如下表所示: 表4-12 cpu_workqueue_struct结构成员 保护数据结构的自旋锁 worklist是一个双向链表 使用create_workqueue("foo")创建一个工作队列。foo是工作队列的名称,函数返回新创建的workqueue_struct的地址。 销毁工作队列使用destroy_workqueue()函数,参数是一个指向workqueue_struct结构的指针。 可以调用flush_workqueue()函数,直到所有的函数执行完。 它的workqueue_struct描述符存储在keventd_wq数组中。

    1.4K10编辑于 2022-08-15
领券