linux queue实现原理,Linux workqueue工作原理

Linux中的Workqueue机制简化了内核线程创建,可根据CPU数量创建线程,实现任务并行化。工作队列让需要睡眠的任务推后执行,而tasklet适用于无需睡眠的任务。工作队列通过work_struct和workqueue_struct等数据结构组织任务,使用create_workqueue或create_singlethread_workqueue创建,通过schedule_work或schedule_delayed_work调度。工作队列遵循FIFO原则,无优先级。
摘要由CSDN通过智能技术生成

Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个

数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的

编程.

工作队列(workqueue)是另外一种将工作推后执行的形式.工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。

那么,什么情况下使用工作队列,什么情况下使用tasklet。如果推后执行的任务需要睡眠,那么就选择工作队列。如果推后执行的任务不需要睡眠,那么就

选择tasklet。另外,如果需要用一个可以重新调度的实体来执行你的下半部处理,也应该使用工作队列。它是唯一能在进程上下文运行的下半部实现的机

制,也只有它才可以睡眠。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,它都会非常有用。如果不需要用一个内核

线程来推后执行工作,那么就考虑使用tasklet。

2. 数据结构我们把推后执行的任务叫做工作(work),描述它的数据结构为work_struct:

struct work_struct {

atomic_long_t data; /*工作处理函数func的参数*/

#define WORK_STRUCT_PENDING 0 /* T if work item pending execution */

#define WORK_STRUCT_STATIC 1 /* static initializer (debugobjects) */

#define WORK_STRUCT_FLAG_MASK (3UL)

#define WORK_STRUCT_WQ_DATA_MASK (~WORK_STRUCT_FLAG_MASK)

struct list_head entry; /*连接工作的指针*/

work_func_t func; /*工作处理函数*/

#ifdef CONFIG_LOCKDEP

struct lockdep_map lockdep_map;

#endif

};

这些工作以队列结构组织成工作队列(workqueue),其数据结构为workqueue_struct:

struct workqueue_struct {

struct cpu_workqueue_struct *cpu_wq;

struct list_head list;

const char *name; /*workqueue name*/

int singlethread; /*是不是单线程 - 单线程我们首选第一个CPU -0表示采用默认的工作者线程event*/

int freezeable; /* Freeze th

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值