tasklet和工作队列.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
tasklet和工作队列

? HYPERLINK /masm_2009/article/details/8528658 tasklet和工作队列 分类:? HYPERLINK /masm_2009/article/category/1324782 LINUX设备驱动程序第三版2013-01-22 16:00?418人阅读? HYPERLINK /masm_2009/article/details/8528658 \l comments 评论(0)? HYPERLINK /masm_2009/article/details/javascript:void(0); \o 收藏 收藏? HYPERLINK /masm_2009/article/details/8528658 \l report \o 举报 举报 tasklet 和定时器相关的另一个内核设施是taskled(小任务)机制。中断管理中大量使用了这种机制。 task在很多方面类似内核定时器:它们始终在中断期间运行,始终会在调度它们的同一CPU上运行,而且都接收一个unsigned long参数,tasklet也会在“软件中断”上下文以原子模式执行。和内核同时器不同的是,我们不能要求tasklet在某个给定时间执行。 软件中断是指打硬件中断的同时执行某些异步任务的一种内核机制。 tasklet的数据结构如下,使用前必须初始化,调用特定的函数或使用特定的宏来声明该结构,可以完成tasklet的初始化: #include linux/interrupt.h struct tasklet_struct{ ??? /*.....*/ ??? void (*func)(unsigned long); ??? unsigned long data; }; void tasklet_init(struct tasklet_struct *t), ????? void (*func)(unsigned long), unsigned long data); DECLARE_TASKLET(name, func, data); DECLARE_TASKLET_DISABLED(name, func, data); tasklet为我们提供了许多有意思的特性: 一个tasklet可以稍后被禁止或者重新启用;只有启用的次数和禁止的次数相同时,tasklet才会被执行 和定时器类似,tasklet可以注册自身 tasklet可被调度以在通常的优先级或者高优先级执行。高优先级的tasklet总会首先执行。 如果系统负荷不重,则tasklet会立即得到执行,但始终不会晚于下一个定时器滴答。 一个tasklet可以和其他tasklet并发,但对自身来讲是严格串行处理的,也就是说,同一tasklet永远不会在多个处理器上同时运行。当然我们已经指出,tasklet始终会在调度自己的同一CPU上运行。 下面描述了tasklet相关的内核接口,可在tasklet结构被初始化后使用: void tasklet_disable(struct tasklet_struct *t);禁用指定的tasklet。该tasklet仍然可以用tasklet_schedule调度,但其执行被推迟,直到该tasklet被重新启用。如果tasklet当前正在运行,该函数会进入忙等待直到tasklet退出为止;因此在调用tasklet_disable之后,我们可以确信该tasklet不会在系统任何地方运行。 void tasklet_disable_nosync(struct tasklet_struct *t);禁用指定的tasklet,但不会等待任何正在运行的tasklet退出。该函数返回后,tasklet是禁用的,而且在重新启用前,不会再次被调度。但是,当该函数返回时,指定的tasklet可能仍在其他CPU上运行。 void tasklet_enable(struct tasklet_struct *t);启用一个先前被禁止的tasklet。如果该tasklet已经被调度,它很快就会运行。对tasklet_enable的调用必须和每个对tasklet_disable的调用匹配,因为内核对每个tasklet保存有一个“禁用计数”。 void tasklet_schedule(struct tasklet_struct *t);调度执行指定的tasklet。如果在获得运行机会之前,某个tasklet被再次调度,则该tasklet只会运行一次。但是如果在该tasklet运行时被调度,就会在完成后再次运行。这样,可确保正在处理事件时发生的其他事件也会被接收并注意到。这种行为也允许tasklet重新调度自身。 void tasklet_hi_schedule(s

文档评论(0)

linyin1994 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档