理解_软中断与tasklet的实现_所存在的误区

内容比较简单,主要是自己看书时对一些知识点所存在的误区,留此记录,方便理解。

《Linux Kernel Development》3ed_CN p107-p130

下半部和推后执行的工作:
中断线程、定时器、工作队列、tasklet、软中断
内核中只有一个软中断数组: static struct softirq_action softirq_vec[NR_SOFTIRQS];

每个核都有自己的softirq_pending标志位:

irq_cpustat_t irq_stat[NR_CPUS];
    typedef struct
    {
        unsigned int __softirq_pending;
        unsigned int local_timer_irqs;
    } irq_cpustat_t;

每个核都有自己的tasklet_vec、tasklet_hi_vec链表:

static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);


关于p_109讲述“两个不同类型的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行。“可以理解,疑问在
于:
    为什么同一个tasklet会链接在不同核的tasklet_vec或tasklet_hi_vec链表上?(这个问题没有讨论出结果,p115最后讲述"把需要调度的tasklet加到每个处理器一个的tasklet_vec链表或tasklet_hi_vec链表的表头上去",实际上代码只是把tasklet加到自己本核的tasklet_vec或tasklet_hi_vec链表上)。

p_117:tasklet_schedule函数中判定当前的tasklet是否已被调度(TASKLET_STATE_SCHED),如果没有正在运行,即处于TASKLET_STATE_SCHED状态,则只会运行一次;如果此tasklet已在其它核上运行,那么新的tasklet会被重新调度并再次运行。
附:相同的tasklet只能同时在一个核上运行,不同的tasklet可以同时在不同的核上运行;
      一旦tasklet_schedule被调用,内核会保证该tasklet一定会在某个cpu上执行一次;
      如果tasklet_schedule被调用时,tasklet不是处于正在执行状态,则它只会执行一次;
      如果tasklet_schedule被调用时,tasklet已经正在执行,则它会在稍后被调度再次被执行;                              

posted on 2013-09-07 20:58  阿加  阅读(546)  评论(0编辑  收藏  举报

导航