Workqueue 是内核里面很重要的一个机制,特别是内核驱动,一般的小型任务 (work) 都不会自己起一个线程来处理,而是扔到 Workqueue 中处理。Workqueue 的主要工作就是用进程上下文来处理内核中大量的小任务。所以 Workqueue 的主要设计思想:一个是并行,多个 work 不要相互阻塞;另外一个是节省资源,多个 work 尽量共享资源 ( 进程、调度、内存 ),不要造成系统过多的资源浪费。为了实现的设计思想,workqueue 的设计实现也更新了很多版本。最新的 workqueue 实现叫做 CMWQ(Concurrency Managed Workqueue),也就是用更加智能的算法来实现“并行和节省”。新版本的 workqueue 创建函数改成 alloc_workqueue(),旧版本的函数 create_workqueue() 逐渐会被被废弃。
使用工作队列分成两种情况:一种是利用系统自有的共享工作队列;另一种是创建自定义的工作队列。
#系统共享的工作队列机制
(1)定义一个工作处理函数,函数声明为:
static void my_work_func(struct work_struct *work);
(2)定义一个工作,并为其指定工作处理函数:(有两种类型的work,如下)
/* ①定义普通的工作--work */
struct work_struct my_work;
INIT_WORK(&my_work, my_work_func);
/* ②定义可以延时提交的工作--delay work */
struct delayed_work my_delayed_work;
INIT_DELAYED_WORK(&my_delayed_work, my_work_func);
(3

工作队列是Linux内核中处理小型任务的关键机制,它以进程上下文运行任务,实现并行和资源节省。文章介绍了工作队列的两种类型——系统共享和自定义工作队列的创建、添加、取消及清理过程,并详细讲解了alloc_workqueue()函数的使用和工作队列的各种属性标志。
最低0.47元/天 解锁文章
545

被折叠的 条评论
为什么被折叠?



