chp下半段和推后执行的工作课件.pptx

上传人(卖家):晟晟文业 文档编号:4167894 上传时间:2022-11-16 格式:PPTX 页数:25 大小:83.59KB
下载 相关 举报
chp下半段和推后执行的工作课件.pptx_第1页
第1页 / 共25页
chp下半段和推后执行的工作课件.pptx_第2页
第2页 / 共25页
chp下半段和推后执行的工作课件.pptx_第3页
第3页 / 共25页
chp下半段和推后执行的工作课件.pptx_第4页
第4页 / 共25页
chp下半段和推后执行的工作课件.pptx_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、下半部 下半部的任务主要是执行与中断相关的工作,这些工作没有被中断服务程序本身完成.主进程中断topbottom1.与时间相关的工作2.与硬件相关的工作3.不希望被其他中断打断其他工作历史 最初的机制:BH 2.5内核后被废止 任务队列 2.5内核之后被工作队列替代 2.3内核引入软中断(softirq)和tasklet 32个软中断,实际上只用到6个 tasklet实现于软中断之上 2.5内核引入工作队列为什么要把中断分为两部分 中断服务程序异步执行,可能会中断其他的重要代码,包括其他中断服务程序。因此,为了避免被中断的代码延迟太长的时间,中断服务程序需要尽快运行.希望限制中断服务程序所做的

2、工作,因此处理中断的时间越短越好。中断服务程序只作必须的工作,其他的工作推迟到以后处理。2.6内核的三种方法:softirqs,tasklet,和work queue 软中断软中断Softirqs kernel/softirq.c定义了一个32个元素的结构数组 /*本结构代表了一个软中断项*/struct softirq_action void(*sction)(struct softirq_action*);/*带执行的函数*/void*data;/*传给函数的指针*/固定 登记的softirqs最大数目不能动态改变.工作时允许中断.一个softirq不能抢占另一个。它只能被中断服务程序抢占

3、.另一个softirq,甚至是同一个可运行于另一个CPU.使用软中断 分配索引 注册处理程序 open_softirq(索引号,处理程序,NULL)触发软中断 raise_softirq(索引号)softirq_pending(CPU)宏:返回指定CPU上未处理的软中断软中断软中断优先级优先级Softirq 描述描述HI_SOFTIRQ0优先级最高的taskletsTIMER_SOFTIRQ1定时器的下半部NET_TX_SOFTIRQ2发送网络数据报NET_RX_SOFTIRQ3接受网络数据报SCSI_SOFTIRQ4SCSI的下半部TASKLET_SOFTIRQ5Tasklets软中断的执行

4、 中断处理程序在返回前标记它的软中断,使其在稍后执行 检查和执行待处理的软中断的时机:-从硬件中断代码返回;-在ksoftirqd内核线程中;-显式检查和处理软中断的代码中 使用软中断的情况:对时间要求最严格和最重要的下半部使用 -网络和SCSI设备 -内核定时器和taskletSoftirqs的执行 u32 pending=softirq_pending(cpu);if(pending)struct softirq_action*h=softirq_vec;softirq_pending(cpu)=0;do if(pending&1)h-action(h);h+;pending=1;whil

5、e(pending);111031Bitmap Pending=100101 Pending=001010 Pending=010100 Pending=101000 Pending=010000 Pending=100000100101Tasklet 的类型的类型Tasklet优先优先级级Softirq 描述描述HI_SOFTIRQ0优先级最高的taskletsTIMER_SOFTIRQ1定时器的下半部NET_TX_SOFTIRQ2发送网络数据报NET_RX_SOFTIRQ3接受网络数据报SCSI_SOFTIRQ4SCSI的下半部TASKLET_SOFTIRQ5TaskletsTasklet

6、s的结构struct tasklet_struct struct tasklet_struct*next;unsigned long state;/见下atomic_t count;/*reference count 锁*/void(*func)(unsigned long);/*tasklet 处理函数*/unsigned long data;/*tasklet 处理函数的参数*/;File:includeinterrupt.hEnum TASKLET_STATE_SCHED,/*Tasklet 已被调度*/TASKLET_STATE_RUN/*Tasklet正在运行(只用于SMP)*/;T

7、asklets 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(

8、)时会执行该tasklet;恢复中断到原状态并返回。tasklet处理过程 禁止中断,取当前处理器的tasklet_vec或tasklet_hi_vec链表;将当前处理器的这两个链表清空;允许响应中断;循环遍历链表上的每一个待处理的tasklet;如果是多处理器系统,则检查TASKLET_STATE_RUN标志判断这个tasklet是否在其他处理器上运行,如果在运行,则跳转掉下一个tasklet,否则置其状态为TASKLET_STATE_RUN;检查tasklet是否被禁止(count=0),如果被禁止则跳到下一个tasklet;执行tasklet程序;执行完毕后,清除TASKLET_STAT

9、E_RUN标志;重复下一个tasklet;直到所有的tasklet处理完。使用tasklet 编写tasklet处理函数 void my_tasklet_fun(unsigned long data)声明tasklet 静态 DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);动态 tasklet_init(t,tasklet_handler,dev)调度 tasklet tasklet_schedule(&my_tasklet)登记my_tasklet,然后允许系统在合适的时间调度它。软中断处理的时机 中断处理结束时 内核线程ksoftirqd在

10、系统空闲时(每一个处理器有一个这样的线程)内核代码中其他调用do_softirq函数时工作队列 Work queue将工作推迟给一个内核线程 work 总是运行于进程上下文.如果推迟的工作需要睡眠,则使用work queues。否则使用softirq或tasklets.Work queues适用于需要分配大量的内存,获得一个信号量,或者执行阻塞的I/O的情况.工作者线程 每个工作者线程一个 struct workqueue_struct struct cpu_workqueue_struct cpu_wqNR_CPUS;const char*name;/工作者线程的名字struct list_

11、head list;/指向其他工作者线程;工作者线程 系统中每一个CPU有一个默认的工作者线程events/n,n是处理器编号。也可自己在创建新的工作者线程 工作者线程是一个内核线程,当有工作被插入到工作队列时,被唤醒,执行这些工作;没有工作时睡眠工作者线程的主要流程 循环执行:线程将自己设置为睡眠态,等待有工作加入队列;如果工作队列空,睡眠 否则线程执行 循环执行推迟的工作伪代码见教材88页工作的执行过程 循环执行:链表非空时,取下一个工作 获取要执行的函数及参数 将工作从链表中摘除,将pending标志请0 调用函数 重复执行伪代码见教材88-89页工作者队列 每个CPU一个 struct

12、 cpu_workqueue_struct spinlock_t lock;/*互斥锁*/long remove_sequence;/*least-recently added(next to run)*/long insert_sequence;/*next to add*/struct list_head worklist;/*工作列表*/wait_queue_head_t more_work;wait_queue_head_t work_done;struct workqueue_struct*wq;/*相关的 workqueue_struct*/task_t*thread;/*相关的线

13、程*/int run_depth;/*run_workqueue()recursion depth*/;工作 struct work_struct unsigned long pending;/*工作是否等待处理*/struct list_head entry;/*所有工作*/void(*func)(void*);/*处理函数*/void*data;/*处理函数的参数*/void*wq_data;/*内部使用*/struct timer_list timer;/*推迟的工作的定时器*/;Work Queue数据结构worker threadwork_structcpu_workqueue_st

14、ruct1/CPUworkqueue_struct1/thread typework_structwork_struct1/deferrable function使用Work queues Work queues非常易于使用!创建Work Static DECLARE_WORK(name,void(*function)(viod*),void*data);调度Work schedule_work(&work)schedule_delayed_work(&work,delay)刷新Work void flush_scheduled_work(void)取消 Work int cancel_delayed_work(struct work_struct*work)应当使用哪一种bottom half?从设计上讲,Softirq提供最少的顺序保证.这需要Softirq处理函数采取一些额外的步骤保证数据安全,因为两个以上的同类型softirqs只能同时运行于不同的CPU。Softirq多用于时间要求严格和使用频度高的场合 如果代码不能很好地线程化,tasklet意义较大 Tasklets 有一个简单的接口,由于两个同类型的不能同时运行,他们非常易于实现。如果你的延期的工作需要运行于进程上下文,唯一的选择是work queue.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(chp下半段和推后执行的工作课件.pptx)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|