您好、欢迎来到现金彩票网!
当前位置:9号彩票app下载 > 工作队列 >

tasklet 和 工作队列

发布时间:2019-08-10 19:44 来源:未知 编辑:admin

  和定时器相关的另一个内是tasklet(小任务)机制。中断管理中大量使用了这种机制。

  tasklet在很多方面类似内核定时器:它们始终在中断期间运行,始终会在调度它们的同一CPU上运行,而且都接收一个unsigned long参数,tasklet也会在“软件中断”上下文以原子模式执行。和内核定时器不同的是,我们不能要求tasklet在某个给定时间执行。

  tasklet的数据结构如下,使用前必须初始化,调用特定的函数或使用特定的宏来声明该结构,可以完成tasklet的初始化:

  一个tasklet可以稍后被禁止或者重新启用;只有启用的次数和禁止的次数相同时,tasklet才会被执行

  tasklet可被调度以在通常的优先级或者高优先级执行。高优先级的tasklet总会首先执行。

  如果系统负荷不重,则tasklet会立即得到执行,但始终不会晚于下一个定时器滴答。

  一个tasklet可以和其他tasklet并发,但对自身来讲是严格串行处理的,也就是说,同一tasklet永远不会在多个处理器上同时运行。当然我们已经指出,tasklet始终会在调度自己的同一CPU上运行。

  下面描述了tasklet相关的内核接口,可在tasklet结构被初始化后使用:

  void tasklet_schedule(struct tasklet_struct *t);调度执行指定的tasklet。如果在获得运行机会之前,某个tasklet被再次调度,则该tasklet只会运行一次。但是如果在该tasklet运行时被调度,就会在完成后再次运行。这样,可确保正在处理事件时发生的其他事件也会被接收并注意到。这种行为也允许tasklet重新调度自身。

  void tasklet_hi_schedule(struct tasklet_struct *t);调度指定的tasklet以高优先级执行。当软件中断处理例程运行时,它会在处理其他软件中断任务(包括”通常“的tasklet)之前处理高优先级的tasklet。理想状态下,只有具备低延迟需求的任务(比如填充音频缓冲区)才能使用这个函数,这样可避免由其他软件中断处理例程引入 的额外延迟。

  void tasklet_kill(struct tasklet_struct *t);该函数确保指定的tasklet不会被再次调度运行;当设备要被关闭或者模块要被移除时,我们通常调用这个函数。如果tasklet正被调度执行,该函数会等待其退出。如果tasklet重新调度自己,则应该避免在调用tasklet_kill之前完成重新调度,这和del_timer_sync的处理类似。

  tasklet在实现在kernel/softirq.c中。其中有两个(通常优先级和高优先级)tasklet链表,它们作为per-CPU数据结构而声明,并且使用了类似内核定时器那样的CPU相关联机制。tasklet管理中使用的数据结构是个简单链表,因为tasklet不必像内核定时器那样来处理时间问题。

  从表面上来看,工作队列(workqueue)类似于tasklet,它们都允许内核代码请求某个函数在将来的时间被调用。但是,两者之间存在一些非常重要的区别,其中包括:

  两者的关键区别在于:tasklet会在很短的时间段内很快的执行,并且以原子模式执行,而工作队列函数可具有更长的延迟并且不必原子化。两种机制有各自适合的情形。

  工作队列的数据结构为struct workqueue_struct类型,定义在linux/workqueue.h中。在使用前之前,我们必须显式地创建一个工作队列,可使用下面两个函数之一:

  每个工作队列有一个或多个专用的进程(“内核线程”),这些进程运行提交到该队列的函数。create_workqueue内核会在系统中的每个处理器上为工作队列创建专用线程。在许多情况下,众多的线程可能对性能具有某种程度的杀伤力;因此如果单个工作线程足够使用,那么应该使用create_singlethread_workqueue创建工作队列。

  要向一个工作队列提交一个任务,需要填充一个work_struct结构,这可通过下面的宏在编译时完成:

  name是要声明的结构名称,function是要从工作队列中调用的函数,而data是要传递给该函数的值。如果要在运行时构造work_struct结构,可使用下面两个宏:

  它们都是将work提交到给定的queue。但是如果使用queue_delayed_work,则实际的工作至少会在经过指定的jiffies(由delayed决定)之后才会被执行。如果工作被成功添加到队列,则上述函数返回值为1。返回值为非零时意味着给定的work_struct结构已要等待在该队列中,从而不能两次加入该队列。

  在将业的某个时间,工作函数会被调用,并传入给定的data值。该函数会在工作线程的上下文运行,因此如果有必要,它可以休眠,当然我们应该仔细考虑休眠会不会影响提交到同一工作队列的其他任务。但是函数不能访问用户空间,这是因为它运行在内核线程,而该线程没有对应的用户空间可以访问。

  如果该入口项在开始执行前被取消,则上述函数返回非零值。在调用它后内核会确保不会执行给定的初始化入口项,但是如果该入口项已经在其他处理器上运行,则它返回0,并且返回后该入口项可能仍在运行。为了绝对确保在cancel_delayed_work返回0之后,工作函数不会在系统中的任何地方运行,则应该随后调用下面的函数:

  在该函数返回后,任何在该调用前被提交的工作函数都不会在系统任何地方运行。

  在许多情况下,设备驱动程序不需要有自己的工作队列。如果我们只是偶尔需要向队列中提交任务,则一种更简单、更有效的办法是使用内核提供的共享的默认工作队列。但是如果使用它则应该记住我们正在和其他人共享该工作队列。这意味着,我们不应该长期独占该队列,即不能长时间休眠,而且我们的任务可能需要更长的时间才能获得处理器时间。

  使用共享队列,工作的声明和初始化和前面介绍的一样,提交工作使用的是下面函数:

  取消已提交到共享队列的工作和之前介绍过的一样是cancel_delayed_work函数。但是刷新共享工作队列需要另一个函数:

  因为我们无法知道其他人是否在使用该队列,因此我们也无法知道在flush_scheduled_work返回前到底要花费多少时间。

  [TOC]本文基于Linux2.6.32内核版本。引言软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottomhalf)演变而来。下半部的...博文来自:godleading的专栏

  原文link:机制分析    上面我们介绍了软中断机制,linux内核为什...博文来自:Decisiveness的专栏

  工作队列(workqueue)是Linuxkernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允...博文来自:heanyu的专栏

  对于操作系统来说,中断的实现和裸机代码是不一样的,对于裸机代码来说,它的处理过程更符合下面这个流程,我们在编写裸板驱动代码的时候,一般处理的是硬件中断,而且中断号也是硬件中断号,这个中断号是和CPU寄...博文来自:奔跑的路

  软中断,tasklet和工作队列的区别与联系       为了让中断处理运行的快,同时要完成相应的全部工作。根据具体的内容将中断分为两个部分:上半部分(中断处理程序)和下半部分(推后处理程序)。上半部...博文来自:yangyang

  工作队列(workqueue)是Linuxkernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允...博文来自:心核智慧科技. 初创企业最佳. 技术合伙人. 新零售升级专家

  一、中断处理的tasklet(小任务)机制中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时...博文来自:技术无捷径,一步一脚印

  较好的帖子是一种软中断延迟机制,是可延迟函数的首选方法一、1、为什么要...博文来自:的博客

  一.软中断和Tasklets1.中断的延迟处理在中断的处理中,有一些不紧急不关键的任务在需要的时候可以被延迟一段时间来执行。对于中断服务程序来说,一般情况下如果它不结束执行,就不应该产生新的中断;而这...博文来自:浩海拾贝

  tasklet是I/O驱动程序中实现可延迟函数的首选方法。从下面的内核代码的分析中我们会看到,tasklet建立在两个叫做HI_SOFTIRQ和TASKLET_SOFTIRQ的软中断之上。几个task...博文来自:emowuyi

  0、为什么引入tasklet机制?linux内核为什么还要引入tasklet机制呢?主要原因是软中断的pending标志位也就32位,一般情况是不随意增加软中断处理的。而且内核也没有提供通用的增加软中...博文来自:shenwanjiang111的专栏

  《深入理解Linux内核》笔记4:软中断/tasklet/工作队列2009年06月02日星期二10:48软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“...博文来自:gchen_nj的专栏

  tasklet tasklet vs 内核定时器 相同:始终在中断期间运行,始终会在调度他们的同一CPU上运行,而且都接收一个unsignedlong参数不同:不可以要求tasklet在某一给定的时间...博文来自:skdkjxy的专栏

  软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottomhalf)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务...博文来自:Jasmines Linux World

  1.引言软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottomhalf)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半...博文来自:Linux知识积累

  概述:等待队列、工作队列、Tasklet都是linux驱动很重要的API,下面主要从用法上来讲述如何使用API.应用场景:等待队列(waitqueue)linux驱动中,阻塞一般就是用等待队列来实现,...博文来自:子木

  回顾:linux内核混杂设备。特点:主设备号由内核分配好,主设备号为10;内核通过次设备来区分各个混杂设备。数据结构:structmiscdevice{intminor;//MISC_DYNAMIC_...博文来自:我的专栏

  1、帮我看看,我对tasklet的理解是否正确?rntasklet常用于中断管理中,它的工作过程:首先由硬件产生中断触发中断函数,然后再在中断函数中触发“软中断”调用tasklet以顶半部和底半部的方式来执行中断处理程序.rnrn2、工作队列中休眠的任务是按照什么顺序被唤醒的?rn在一个工作队列中有多个休眠的任务进程,当要唤醒其中一个时是安装什么顺序来唤醒的?是不是只要其中有满足条件的进程就被唤醒,不一定按照特定的顺序?rn论坛

  1:内核定时器:在内核中有系统自带的定时器,达到一定的时间就可以进行一个操作,这个和单片机中的定时器中断一样。包含头文件是Timer.h(\include\linux)结构体是timer_listst...博文来自:感觉身体被掏空

  本文包含那些内容?工作队列和tasklet的区别;中断上下文;工作队列的使用;本文适合那些人阅读?想了解linuxer;学习驱动开发的beginner;学习内核模块编程beginner;其他super...博文来自:Amao_come_on 的专栏

  tasklet和定时器相关的另一个内是taskled(小任务)机制。中断管理中大量使用了这种机制。task在很多方面类似内核定时器:它们始终在中断期间运行,始终会在调度它们的同一CPU上运行,而...博文来自:masm_2009的专栏

  摘自:计算机系统实现中断机制是非常复杂的一件工作,再怎么说人都是高度智能化的生物,而计算机作为一个铁疙瘩...博文来自:顺子的专栏

  一、中断处理的tasklet(小任务)机制中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时...博文来自:zhuky的专栏

  softirq tasklet 工作队列 执行上下文 延后的工作运行于中断上下文 延后的工作运行于中断上下文 延后的工作运行于进程上下文 可重用 可以在不同的CPU上同时运...博文来自:weixin_39821531的博客

  一、中断处理机制     中断是一个随机事件,因此如果关中断的时间过长,CPU就不能及时的响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽可能的把更多...博文来自:HelloBirthday的博客

  Zuocheng_Liu:亲爱的作者, 脚本地址已经失效啦,快恢复呀。

  :你好 export PREFIX=android-build 请问这个参数文件在那阿,找不到这个文件阿

  js_wawayu:博主,你好,我最近也刚开始学习rockchip,在官网上下了个sdk的代码,想请教一下官网的的sdk代码包含上层的代码吗?开机可以看到界面吗? 你们的android版本的代码是从哪里来的?谢谢

http://dralvaro.com/gongzuoduilie/1128.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有