内核微线程以及工作队列_第1页
内核微线程以及工作队列_第2页
内核微线程以及工作队列_第3页
内核微线程以及工作队列_第4页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、API2 Linux2.6bottomhalves M.TimLinux bottom-half API2 Linux2.6bottomhalves M.TimLinux bottom-half 微线程和工作队列,并展示如何利用这些 APIs 来构建可延迟函数。2010 4 11 本文研究多个用于在内核环境当中延迟处理的方法(Linux 当中)Linux 来进行任务调度 。系统会因为一个硬件事件而产生中断(例如出现了一个来自网卡的数据包)栈来继续处理(1)1Top-half bottom-half (在该上下文, 处理器资源更有可能被高效共享)。1所示, top halfbottom half

2、 (top half bottom half 来安排后续的处理过程)bottom-half bottomhalves Linux 2.6.27.14 Linux 一个给定的微线程只运行一个给定的微线程只运行在一个CPU 中(就是用于调用该微线程的那个CPU),同一不会同时运行在多个 CPU 中。 但是不同的微线程可以同时运行在不同的 CPU 中。微线程可由 tasklet_struct 结构体表示(参见 图 2), 其中包含了用于管理和的必要数据 (状态,通过 atomic_t 来实现允许控制,函数指针,数据,以及链供了软中断功能,具有一组32 个静态定义的bottomhalves。作为静态元

3、素,其定义在 本的 Linux 内核中还引入了微线程(参见 ./include/linux/errupt.h)。微线程的构建基于软中断,用于允许动态生成可延迟函数。最终,在2.5 版本Linux 内核中引入了工作队列(参见 ./include/linux/workqueue.h)。 工作队列允许将任务延回页微线程介软中断最初为具有 32 个软中断条目的矢量, 用来支持一系列的只有 9 个矢量被用于软中断, 其中之一是 TASKLET_SOFTIRQ(参见 ./include/linux/lf 完成少量的任务,然后安排微线程在晚些的 bottom half 中执行。并调度微线/* Declare

4、 a Tasklet (the Bottom-Half) */ voidtasklet_function(unsignedlongdata);DECLARE_TASKLET(le,tasklet_function,tasklet_data/* Schedule the Bottom-Half */ tasklet_schedule( &tasklet_ex2tasklet_struct CPU 内核线程)(API)中支持的各系统(由输入/输出I/O处理过程来驱动)微线DECLARE_TASKLET( 2)2tasklet_struct CPU 内核线程)(API)中支持的各系统(由输入/输出I

5、/O处理过程来驱动)微线DECLARE_TASKLET( 2)为tasklet_enable的角度)tasklet_init也存在并利用用户提供的微线程数据来对 tasklet_struct进行初始化。2. enable/disable (name,func,data_DISABLED(name,func,tasklet_init(structtasklet_struct*,void(*func)(unsignedunsignedlongdatatasklet_disable_nosync(structtasklet_struct*); tasklet_disable( struct task

6、let_struct * ); tasklet_enable( struct tasklet_struct * );tasklet_hi_enable(structtasklet_struct*LAPIAPI 和errupt.h 来了解APIAPI 和errupt.h 来了解微线程的实现机制有关微线程的简单例来看一个使用微线程 API 的简单例子(参见(my_tasklet_function和 my_tasklet_data)通过相关数据生成, 然后由DECLARE_TASKLET来 tasklet_kill保证微线 会再运行, 并且,如果按进度该微线程应该运行,kill tasklet_ki

7、ll_immediate只在指定的 CPU 处于 dead 状态时被采用。4. kill voidtasklet_kill(structtasklet_struct*voidtasklet_kill_immediate(structtasklet_struct*,cpudisable disable 有 tasklet_disable 返回(其中 tasklet_disable_nosync 可能在终止发生之前返回)。disable “掩码”(也就是说,并不执行),enable 函数被调用为止。 存在两个 enable 函数: 一个用于正常优先级调度正常优先级调度通过 TASKLET_SOFT

8、IRQ-level 软中断来执行, 高优先级调度则通 过 HI_SOFTIRQ-level 软中断执行。enable 函数(参见 3)。 每个函数利用特殊的软中断矢量来为微线程排队(tasklet_vec用于正常优先级, 而 tasklet_hi_vec用于高优先级)。 来自高3. 微线程调度函void tasklet_schedule( struct tasklet_struct * ); voidtasklet_hi_schedule(structtasklet_struct*);回页工作队列介回页工作队列介2.5 Linux 5. 微线程处于内核模块上下文#include #includ

9、e #include linux/charmy_tasklet_data=my_tasklet_functionwas/*BottomHalfFunctionvoidmy_tasklet_function(unsignedlongdatak(%sn,(char*)data); DECLARE_TASKLET(my_tasklet,(unsignedlong)&my_tasklet_datainit_module(void/* Schedule the Bottom Half */ tasklet_schedule(&my_tasklet);returnvoidcleanup_module(vo

10、id/* Stop the tasklet beforexit*/ tasklet_kill( &my_tasklet );用来进行任务定义的结构体的第一个元素(后面有相关例子)API 提供三个函数来初始化任务(通过一个事先分配的缓存); 用来进行任务定义的结构体的第一个元素(后面有相关例子)API 提供三个函数来初始化任务(通过一个事先分配的缓存); 6INIT_WORK提供必需的初始化数据以及处理程序函数的配置(由用户传递进来)。 如果开发 需要在任INIT_DELAYED_WORK 和 INIT_DELAYED_WORK_DEFERRABLE6. (这在微线程模式下无法实现)APIkev

11、entd内核工作线程 events/X 来管理。工作队列提供一个通用的办法将任务延 bottom halves。 处于 的是工作队列(结构体 workqueue_struct), 任务被安排到该结构体当中。 任务由结构work_struct(图 处理程序(由处理程序函数在结构体 work_struct 中指定)。3. work_struct中 了要采用的处理程序函数, 因此可以利用工作队列来为不同的处理程序进行任务排队。 现在,让 看一下能够用于工作队列的 API 函数。工作队API 比微线程稍复杂,主要是因为它支持很多选项。 首先探讨一下工作队3 top half ,进入 bottom ha

12、lf ,从而延迟它的执行。 工作队列通过宏调用生成 create_workqueue,返回一个 workqueue_struct 参考值。 可以通过调destroy_workqueue来 工作队列(如果需要struct workqueue_struct *create_workqueue( name ); voiddestroy_workqueue(structworkqueue_struct*);直到任务完成为止,可以调用flush_work来实现。指定工作队列中的所有任务能够内核全局工作队列,可调用 flush_scheduled_work。flush_work(structwork_st

13、ruct*work可以使用全局的内核全局工作队列,利用4 个函数来为工作队列定位。这些函数(见清 单 8)模拟 8. 内核全局工作队schedule_work( struct work_struct *work ); cpu,structwork_struct*work);scheduled_delayed_work(structdelayed_work*dwork,unsignedlongdelay); cpu,structdelayed_work*dwork,unsignedlongdelay一操作( 7)queue_work简单地将任务安排进工作队列(这个 CPU 上运行。 两个附加的函

14、数为延迟任务提供相同的功能(其结构体装入结构7. 工作队列函queue_work( struct workqueue_struct *wq, struct work_struct *work ); queue_delayed_work(structworkqueue_structstructdelayed_work*dwork,unsignedlongdelaycpu,structworkqueue_structstructdelayed_work*dwork,unsignedlongdelayINIT_WORK( work, func ); INIT_DELAYED_WORK( work,

15、func ); INIT_DELAYED_WORK_DEFERRABLE(work,func);API 的 。在 ./kernel/workqueue.c API 的实现API ./include/linux/workqueue.h API 的 。在 ./kernel/workqueue.c API 的实现API ./include/linux/workqueue.h 中定义。 下面 看一个工作队列 API 的简工作队列简下面的例子说明了几个 的工作队列 API bottom half 的任务结构体和处理程序函数( 9)先您将注意到工作队列结构体参考的定义 (my_wq)以及 my_work_

16、t 的定义。my_work_t类型定义的头部包括结构体 work_struct和一 任务项目的整(回调函数)work_struct指针 my_work_t送出任务项目(来自结构体的整数)之后,任务指针将被 。9. 任务bottom-half 处理程#include #include icstructworkqueue_structtypedefstructstructwork_structwork_pending( work ); delayed_work_pending(work);还没有在处理程序当中执行的任务可以被取消。调用 cancel_work_sync 将会终止队列中的任务或者阻塞

17、任务直到回调结束(如果处理程序已经在处理该任务)迟,可以调用 cancel_delayed_work_sync。cancel_work_sync( struct work_struct *work ); cancel_delayed_work_sync(structdelayed_work*dwork);flush_workqueue(structworkqueue_struct*wq); void flush_scheduled_work( void );10init_modulecreate_workqueueAPI10init_modulecreate_workqueueAPI 用 IN

18、IT_WORK 来初始化每个任务项目,任务定义完成, 接着通过调queue_worktop-half进程(在此处模拟)完成。如同清单 10 中所示,任务有时会晚些被处理程序处理。10. 工作队列和任init_module(voidmy_wq=create_workqueue(my_queue); if (my_wq) /*Queuesomework(item1)work=(my_work_t*)kmalloc(sizeof(my_work_t),GFP_KERNEL); if (work) INIT_WORK(structwork_struct*)work,my_wq_functionwork-x=ret=queue_work(my_wq,(structwork_struct*)work my_work_t*work,icvoidmy_wq_function(structwork_structmy_work_t*my_wo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论