tasklet schedule isr 关系

来源:互联网 发布:中俄原油管道 知乎 编辑:程序博客网 时间:2024/06/09 15:08
前三者的联系在于中断子系统




tasklet
http://www.kuqin.com/shuoit/20140104/337421.html 讲述了什么是tasklet
http://blog.csdn.net/lizuobin2/article/details/51793911 这篇讲的比较好,


把中断对应的机制分的很详细;但是只是做了一个详细的划分,机制原理讲述不清
同一个tasklet不能同时在多个cpu上跑


DECLARE_TASKLET(my_tasklet,my_tasklet_func,data)


schedule
http://blog.csdn.net/songjinshi/article/details/23262923 讲述调用调度程


序的时机


每个时钟中断(timer interrupt)发生时,由三个函数协同工作,共同完成进程的


选择和切换,它们是:schedule()、do_timer()及ret_form_sys_call()。我


们先来解释一下这三个函数:
schedule():进程调度函数,由它来完成进程的选择(调度);
do_timer():暂且称之为时钟函数,该函数在时钟中断服务程序中被调用,是时钟


中断服务程序的主要组成部分,该函数被调用的频率就是时钟中断的频率即每秒钟100


次(简称100赫兹或100Hz);
ret_from_sys_call():系统调用返回函数。当一个系统调用或中断完成时,该函


数被调用,用于处理一些收尾工作,例如信号处理、核心任务等等。


isr:中断服务程序 ISR(Inerrupt Service Routine)


简单来说就是,一条中断线对应一个中断处理程序,而一个中断处理程序再对应若干


个中断服务例程 :http://blog.chinaunix.net/uid-27177626-id-3438994.html
图解加文字叙述,比较容易理解


http://blog.sina.com.cn/s/blog_70a9dd840100uqfh.html 讲述了什么是isr,也


涉及了中断上下文以及中断上半部和下半部
http://blog.sina.com.cn/s/blog_65373f1401018w15.html
http://blog.sina.com.cn/s/blog_510ac74901015fgz.html


http://blog.csdn.net/DroidPhone/article/details/7445825 中断子系统的一系


列文章


http://blog.csdn.net/lickylin/article/details/12657373 总结依托于这篇文


章写


总结:tasklet是一种基于软中断的延时处理机制,是中断底半部的一种处理方式。
基本上要使用就是申请中断,通过宏创建tasklet与处理函数的关联,在顶半部调用


tasklet_schedule使系统在适当的时候进行调
(就是把tasklet_struct结构体挂到tasklet_vec链表或者挂接到tasklet_hi_vec链


表上,并调度软中断TASKLET_SOFTIRQ或者HI_SOFTIRQ;Tasklet_action在软中断


TASKLET_SOFTIRQ被调度到后会被执行,它从tasklet_vec链表中把tasklet_struct


结构体都取下来,然后逐个执行。如果t->count的值等于0,说明这个tasklet在调度


之后,被disable掉了,所以会将tasklet结构体重新放回到tasklet_vec链表,并重


新调度TASKLET_SOFTIRQ软中断,在之后enable这个tasklet之后重新再执行它。);
======================================================================
上半部和下半部的关键区别是,上半部简单快速,执行时禁止一部分或者全部中断;


下半部稍后执行,而且执行期间可以响应所有中断。
======================================================================
上半部和下半部的划分可以参考以下原则:
1) 如果一个任务对时间非常敏感,把它放在上半部(ISR)里;
2) 如果一个任务跟硬件相关,把它放在上半部里;
3) 如果一个任务要保证不被其他中断(特别是相同的中断)打断,把它放在上半部里



4) 其他所有的任务,都放在下半部。
======================================================================
下半部负责推后完成的工作,但是并不需要指明一个具体的时间,只是将任务稍微推


迟,待到系统不是那么繁忙并且中断恢复之后执行就可以了(一般情况下,ISR一返回


,下半部就会执行)。不同于ISR的最关键之处是,下半部执行的时候允许响应所有的


中断。
======================================================================
内核的策略是,当中断不是特别多的时候,及时处理中断,所以do_irq会调用


do_softirq。
当系统中断过多时,do_softirq才会被推迟到内核的ksoftirq内核线程中去。如何判


断中断过多呢,linux的认为发生中断嵌套了,就是中断过多。do_irq在调用


do_softirq时会以此为判断条件。
======================================================================
__tasklet_schedule:
作用:
1、 关闭中断
2、 调用__tasklet_common_schedule,实现添加tasklet并开启软中断的功能
3、 开启中断


tasklet_schedule
__tasklet_schedule
__tasklet_common_schedule


3个函数实现了将tasklet添加到tasklet_vec(每个CPU都有一个该变量)中,并开启


软中断。


tasklet_action:
作用:
1) 关闭软中断,获取运行CPU所对应的tasklet链表的表头,然后将表头置为NULL,


再启中断
2) 遍历tasklet链表,每次遍历均执行如下操作:
a) 获取tasklet链表的一个tasklet变量
b) 对该tasklet执行加锁操作,即置位TASKLET_STATE_RUN
c) 判断当前tasklet是否使能,若已使能,则执行以下操作
i. tasklet的当前状态若为TASKLET_STATE_SCHED,则清空该位
ii. 调用该tasklet的回调处理函数
iii. 解锁该tasklet,重新while循环
若未使能,则执行以下操作:
i. 关闭中断
ii. 将该tasklet重新加入到链表tasklet_vec
iii. 开启软中断TASKLET_SOFTIRQ,在 下一次处理该软中断时,再处理该tasklet
iv. 开启中断


底半部机制包括:tasklet,工作队列,软中断,线程中断;
0 0
原创粉丝点击