首页 > 系统相关 >2023.7.16 linux 软中断Softirqs 队列 Workqueues 并发管理队列cmwq

2023.7.16 linux 软中断Softirqs 队列 Workqueues 并发管理队列cmwq

时间:2023-07-16 23:11:23浏览次数:42  
标签:cmwq struct 16 队列 void work int workqueue softirq

Implementing work-deferring mechanisms     延期任务

Softirqs: Executed in an atomic context       # kernel/softirq.c  ;  <linux/interrupt.h>.

Tasklets: Executed in an atomic context 

Workqueues: Executed in a process context

 

struct softirq_action { void (*action)(struct softirq_action *); };

void softirq_handler(struct softirq_action *h)

void open_softirq(int nr, void (*action)(struct softirq_action *))

nr represents the softirq index, which is also considered as the softirq priority (where 0 is the highest). action is a pointer to the softirq handler. Possible indexes are enumerated in the following code snippet:

enum {

  HI_SOFTIRQ=0, /* High-priority tasklets */

  TIMER_SOFTIRQ, /* Timers */

  NET_TX_SOFTIRQ, /* Send network packets */

  NET_RX_SOFTIRQ, /* Receive network packets */

  BLOCK_SOFTIRQ, /* Block devices */  

  BLOCK_IOPOLL_SOFTIRQ, /* Block devices with I/O polling * blocked on other CPUs */

  TASKLET_SOFTIRQ,/* Normal Priority tasklets */ SCHED_SOFTIRQ, /* Scheduler */

  HRTIMER_SOFTIRQ,/* High-resolution timers */

  RCU_SOFTIRQ, /* RCU locking */

  NR_SOFTIRQS /* This only represent the number * of softirqs type, 10 actually */

};    #nr数值越小,优先级越大

const char * const softirq_to_name[NR_SOFTIRQS] = { "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "BLOCK_IOPOLL", "TASKLET", "SCHED", "HRTIMER", "RCU" };

cat /proc/softirqs

void __raise_softirq_irqoff(unsigned int nr)

void raise_softirq_irqoff(unsigned int nr)

void raise_softirq(unsigned int nr)

 

Tasklets

void tasklet_setup(struct tasklet_struct *t, void (*callback)(struct tasklet_struct *));    deprecated

 

Workqueues

  Worker threads, which are dedicated threads that execute and pull the functions off the queue, one by one, one after the other. 

   Worker pools: This is a collection of worker threads (a thread pool) that are used to better manage the worker threads.

linux/workqueue.h

DECLARE_WORK(name, function)    #静态初始化一个work

DECLARE_DELAYED_WORK(name, function)    #初始化一个延迟work

INIT_WORK(work, func );      #动态

INIT_DELAYED_WORK( work, func);

struct work_struct { atomic_long_t data; struct list_head entry; work_func_t func; };

struct delayed_work { struct work_struct work; struct timer_list timer; struct workqueue_struct *wq; int cpu; };

typedef void (*work_func_t)(struct work_struct *work);

struct delayed_work *to_delayed_work( struct work_struct *work)

struct workqueue_struct *create_workqueue(const char *name)    #为每一个cpu创建一个专门的线程

struct workqueue_struct *create_singlethread_workqueue( const char *name)

bool queue_work(struct workqueue_struct *wq, struct work_struct *work)    #排班work

bool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)    #排延迟工作

取消work

bool cancel_work_sync(struct work_struct *work)

bool cancel_delayed_work(struct delayed_work *dwork)

bool cancel_delayed_work_sync(struct delayed_work *dwork)

void flush_workqueue(struct worksqueue_struct * queue);

void destroy_workqueue(structure workqueque_struct *queue);    #摧毁工作队列

Kernel-global workqueue – the shared queue    #在内核初始化时已经创建

 int schedule_work(struct work_struct *work);

int schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);

int schedule_work_on(int cpu, struct work_struct *work);    #指定cpu排班任务

int schedule_delayed_work_on(int cpu, struct delayed_work *dwork, unsigned long delay);

void flush_scheduled_work(void);

Concurrency Managed Workqueue (cmwq),

struct workqueue_struct *alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...);

#define alloc_ordered_workqueue(fmt, flags, args...) [...]    #processes each work item one by one in queued order (that is, first-in, first-out (FIFO) order).

void destroy_workqueue(struct workqueue_struct *wq)

flags:

WQ_UNBOUND 不绑定cpu 由系统自己分配

WQ_MEM_RECLAIM  可以内存救援

WQ_FREEZABLE    省电,随系统休眠而休眠

WQ_HIGHPRI    高优先级,保证立即执行

WQ_CPU_INTENSIVE  表明cpu集约型任务 会被其他任务delay

queue_work_on()  可以指定cpu

 

Note that schedule_work() is a wrapper that calls queue_work() on the system workqueue (system_wq), while schedule_work_on() is a wrapper around queue_work_on(). Also, keep in mind the following: system_wq = alloc_workqueue("events", 0, 0);. You can have a look at the workqueue_init_early() function in kernel/ workqueue.c in kernel sources to see how other system-wide workqueues are created.

标签:cmwq,struct,16,队列,void,work,int,workqueue,softirq
From: https://www.cnblogs.com/yangdinshan/p/17558806.html

相关文章

  • 2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?
    2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?答案2023-07-16:什么是零拷贝?零拷贝(英语:Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据......
  • 7.16
    #include<iostream>usingnamespacestd;intmain(){intT[100];//用于确认所有身分是否都正确intN;//输入的身份证的个数cin>>N;inta=0;charA[100][18];//储存输入的身份证号//首先将z值和校验码m的值对应起来intZ[17]={7,9,10......
  • 2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?
    2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?答案2023-07-16:什么是零拷贝?零拷贝(英语:Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据拷贝和......
  • 《摆与混》第十四章--7月16日--周日
    周日,平淡却轻松;1.今天做了什么:今天10点起。洗漱后,觉得时间太晚就没有吃早餐,上午随便混了混,今天去外婆家吃饭(已经很久没去了),下午小小摆烂时间,学了会弥补一下上午,5点出发健身锻炼(周末也不断),晚上去了一家早就想去好吃的店,然后经典PTA,周末接着起飞呀!!!!2.解决了什么问题:Java课程推进,PTA......
  • 7.16总结
    昨晚睡得很早,起床后头疼的症状也缓解了,然后起床在床上刷了会视频,起来后将pta弄到了1500分,上午还有人问我题,我就讲了一下,这对我来说也是复习提升吧。中午自己炒了个菜,手法很生疏,做的很失败,但也能吃,吃完之后刷视频,看了一会javaweb知识,更新了sql的笔记,快整理完了,整理的也是简单的常用......
  • 7月16号周日
    今天学习了c++中vector,queue这两个容器,学习了堆栈和队列的相关知识,感觉受益匪浅。明天决定使用pta固定题目集的一些题目来帮助自己掌握并熟练这两大知识点,以扩宽自己的能力。明天,决定继续进行学习和相应题目的练习并进行适当放松,达到利益最大化。......
  • 闲话 Day16.5
    困死了困死了困死了困死了困死了困死了。才两天中午没睡觉打UNR精神状态就已经完全寄掉了。那么,显然,这几天是不会有学术题材的。这么看,可能闲话Day17是不会再有了的吧(悲)不过其实也还好。让闲话停留在Day16,正好也是一个2的整数幂。也算是比较圆满的结束了吧。本来打......
  • 每日总结2023年7月16日
    今日学习:批处理的学习;java连接池C3P0的连接。遇到的问题:今天在做批处理的时候发现一个问题,就是我的MySQL数据表好像只能存储1000条数据,那么如果数据量远大于此我该如何解决?明天的计划:开启Spring学习。......
  • 161 第七天
    早上。。逐渐暴躁,学右入库六天半了(中间大概有一天半没去),还是差那点东西不够好,现在有点越学越差的感觉了。不知道明天能不能学左入库呜呜呜,学了的话还要挨骂下午,下午第一次,本来心态就不好,还被插队,练的好差劲。第二轮,调整心态后,基本没什么问题。也不知道明天会怎样,唉。最好是练......
  • 7月16日 --指针
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<string.h>structstu{ charname[20]; intage; charid[20];};intmain(){ inta=0; structstus1={"张三",20,"775513640"}; structstu*ps=&a......