走入Linux的殿堂已经有一年有余了,在这里我想将Linux的各种实现机制分析一遍,一方面对自己来说也是温故而知新,另一方面,促进大家的交流,最好能够给大家一些抛砖引玉的启迪。我是硬件出身,搞硬件已经好多年了,从是专门软件开发也接近两年了,在这一段时间内我越发认为软硬件协同设计是未来发展的主流,软硬件的界限越来越模糊,软硬件的设计思想是相通的,实现方法是各异的,实现的结果上当然也存在较大差别,因此,很有必要做好软硬件的协同设计。本着这样的想法,我想将我所认识的Linux分析一遍,特别是一些我认为精华和重要的机制,另外在讨论过程中,我会插入一些其他的OS实现机制,进行对比分析,我把这一类blog文章划归为“Linux机制分析”,希望大家支持。
什么是workqueue?
Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。
workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程,
Workqueue机制的实现
Workqueue机制中定义了两个重要的数据结构,分析如下:
<!--[if !supportLists]-->1、
<!--[if !supportLists]-->2、
struct work_struct {
};
Workqueue编程接口
序号 | 接口函数 | 说明 |
1 | create_workqueue | 用于创建一个workqueue队列,为系统中的每个CPU都创建一个内核线程。输入参数: @name:workqueue的名称 |
2 | create_singlethread_workqueue | 用于创建workqueue,只创建一个内核线程。输入参数: @name:workqueue名称 |
3 | destroy_workqueue | 释放workqueue队列。输入参数: @ workqueue_struct:需要释放的workqueue队列指针 |
4 | schedule_work | 调度执行一个具体的任务,执行的任务将会被挂入Linux系统提供的workqueue——keventd_wq输入参数: @ work_struct:具体任务对象指针 |
5 | schedule_delayed_work | 延迟一定时间去执行一个具体的任务,功能与schedule_work类似,多了一个延迟时间,输入参数: @work_struct:具体任务对象指针 @delay:延迟时间 |
6 | queue_work | 调度执行一个指定workqueue中的任务。输入参数: @ workqueue_struct:指定的workqueue指针 @work_struct:具体任务对象指针 |
7 | queue_delayed_work | 延迟调度执行一个指定workqueue中的任务,功能与queue_work类似,输入参数多了一个delay。 |