下半段和推后执行的工作.ppt

上传人:sh****n 文档编号:11621878 上传时间:2020-04-30 格式:PPT 页数:26 大小:328.31KB
返回 下载 相关 举报
下半段和推后执行的工作.ppt_第1页
第1页 / 共26页
下半段和推后执行的工作.ppt_第2页
第2页 / 共26页
下半段和推后执行的工作.ppt_第3页
第3页 / 共26页
点击查看更多>>
资源描述
第7章下半段和推后执行的工作,下半部,下半部的任务主要是执行与中断相关的工作,这些工作没有被中断服务程序本身完成.,主进程,中断,top,bottom,1.与时间相关的工作2.与硬件相关的工作3.不希望被其他中断打断,其他工作,历史,最初的机制:BH2.5内核后被废止任务队列2.5内核之后被工作队列替代2.3内核引入软中断(softirq)和tasklet32个软中断,实际上只用到6个tasklet实现于软中断之上2.5内核引入工作队列,为什么要把中断分为两部分,中断服务程序异步执行,可能会中断其他的重要代码,包括其他中断服务程序。因此,为了避免被中断的代码延迟太长的时间,中断服务程序需要尽快运行.希望限制中断服务程序所做的工作,因此处理中断的时间越短越好。中断服务程序只作必须的工作,其他的工作推迟到以后处理。2.6内核的三种方法:softirqs,tasklet,和workqueue,软中断Softirqs,kernel/softirq.c定义了一个32个元素的结构数组/*本结构代表了一个软中断项*/structsoftirq_actionvoid(*sction)(structsoftirq_action*);/*带执行的函数*/void*data;/*传给函数的指针*/固定登记的softirqs最大数目不能动态改变.工作时允许中断.一个softirq不能抢占另一个。它只能被中断服务程序抢占.另一个softirq,甚至是同一个可运行于另一个CPU.,使用软中断,分配索引注册处理程序open_softirq(索引号,处理程序,NULL)触发软中断raise_softirq(索引号)softirq_pending(CPU)宏:返回指定CPU上未处理的软中断,软中断的执行,中断处理程序在返回前标记它的软中断,使其在稍后执行检查和执行待处理的软中断的时机:-从硬件中断代码返回;-在ksoftirqd内核线程中;-显式检查和处理软中断的代码中使用软中断的情况:对时间要求最严格和最重要的下半部使用-网络和SCSI设备-内核定时器和tasklet,Softirqs的执行,u32pending=softirq_pending(cpu);if(pending)structsoftirq_action*h=softirq_vec;softirq_pending(cpu)=0;doif(pending,0,31,Bitmap,Pending=100101Pending=001010Pending=010100Pending=101000Pending=010000Pending=100000,1,0,0,1,0,1,Tasklet的类型,Tasklets的结构,structtasklet_structstructtasklet_struct*next;unsignedlongstate;/见下atomic_tcount;/*referencecount锁*/void(*func)(unsignedlong);/*tasklet处理函数*/unsignedlongdata;/*tasklet处理函数的参数*/;,File:includeinterrupt.h,EnumTASKLET_STATE_SCHED,/*Tasklet已被调度*/TASKLET_STATE_RUN/*Tasklet正在运行(只用于SMP)*/;,Tasklets,Tasklets实现于softirq之上,实际上也是softirqs.Tasklet同时只运行于一个CPU.注:softirq,甚至是同一个可运行于另一个CPU.不同的tasklets可同时运行于不同的CPU.,tasklet_schedule()的调度过程,检查tasklet的状态是否为TASKLET_STATE_SCHED,如果是,则立即返回;保存中断状态,禁止本地中断;把需要调度的tasklet指定处理器的tasklet_vec或tasklet_hi_vec链表;唤起TASKLET_SOFTIRQ或HI_SORTIRQ软中断,这样在下一次调用do_softirq()时会执行该tasklet;恢复中断到原状态并返回。,tasklet处理过程,禁止中断,取当前处理器的tasklet_vec或tasklet_hi_vec链表;将当前处理器的这两个链表清空;允许响应中断;循环遍历链表上的每一个待处理的tasklet;如果是多处理器系统,则检查TASKLET_STATE_RUN标志判断这个tasklet是否在其他处理器上运行,如果在运行,则跳转掉下一个tasklet,否则置其状态为TASKLET_STATE_RUN;检查tasklet是否被禁止(count=0),如果被禁止则跳到下一个tasklet;执行tasklet程序;执行完毕后,清除TASKLET_STATE_RUN标志;重复下一个tasklet;直到所有的tasklet处理完。,使用tasklet,编写tasklet处理函数voidmy_tasklet_fun(unsignedlongdata)声明tasklet静态DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);动态tasklet_init(t,tasklet_handler,dev)调度tasklettasklet_schedule(constchar*name;/工作者线程的名字structlist_headlist;/指向其他工作者线程;,工作者线程,系统中每一个CPU有一个默认的工作者线程events/n,n是处理器编号。也可自己在创建新的工作者线程工作者线程是一个内核线程,当有工作被插入到工作队列时,被唤醒,执行这些工作;没有工作时睡眠,工作者线程的主要流程,循环执行:线程将自己设置为睡眠态,等待有工作加入队列;如果工作队列空,睡眠否则线程执行循环执行推迟的工作伪代码见教材88页,工作的执行过程,循环执行:链表非空时,取下一个工作获取要执行的函数及参数将工作从链表中摘除,将pending标志请0调用函数重复执行伪代码见教材88-89页,工作者队列,每个CPU一个structcpu_workqueue_structspinlock_tlock;/*互斥锁*/longremove_sequence;/*least-recentlyadded(nexttorun)*/longinsert_sequence;/*nexttoadd*/structlist_headworklist;/*工作列表*/wait_queue_head_tmore_work;wait_queue_head_twork_done;structworkqueue_struct*wq;/*相关的workqueue_struct*/task_t*thread;/*相关的线程*/intrun_depth;/*run_workqueue()recursiondepth*/;,工作,structwork_structunsignedlongpending;/*工作是否等待处理*/structlist_headentry;/*所有工作*/void(*func)(void*);/*处理函数*/void*data;/*处理函数的参数*/void*wq_data;/*内部使用*/structtimer_listtimer;/*推迟的工作的定时器*/;,WorkQueue数据结构,workerthread,work_struct,cpu_workqueue_struct,1/CPU,workqueue_struct,1/threadtype,work_struct,work_struct,1/deferrablefunction,使用Workqueues,Workqueues非常易于使用!创建WorkStaticDECLARE_WORK(name,void(*function)(viod*),void*data);调度Workschedule_work(&work)schedule_delayed_work(&work,delay)刷新Workvoidflush_scheduled_work(void)取消Workintcancel_delayed_work(structwork_struct*work),应当使用哪一种bottomhalf?,从设计上讲,Softirq提供最少的顺序保证.这需要Softirq处理函数采取一些额外的步骤保证数据安全,因为两个以上的同类型softirqs只能同时运行于不同的CPU。Softirq多用于时间要求严格和使用频度高的场合,如果代码不能很好地线程化,tasklet意义较大Tasklets有一个简单的接口,由于两个同类型的不能同时运行,他们非常易于实现。如果你的延期的工作需要运行于进程上下文,唯一的选择是workqueue.,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!