[小白请教]关于软中断和tasklet为什么不一样
小白,正在努力入门中。。。。
本质上讲,tasklet也是软中断实现的,只不过是级别比软中断低而已
问题:
1)为什么同类的tasklet不能同时执行?而且在SMP的情况下,也只能是在同一个核心上执行
2)而软中断却可以,不但可以同时执行,而且还可以在不同的核心上同时执行?
原因是因为tasklet可以在进程上下文执行有关系吗?
请大神解惑,多谢多谢。
回复 1# Dannysd
本质上讲,tasklet也是软中断实现的,只不过是级别比软中断低而已
系统也提供高等级的tasklet,只是平常不使用而已,如下是所有的软中断类型
enum
{
HI_SOFTIRQ=0,高等级的tasklet
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ, 低等级的tasklet,我们平常都在使用的这个
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
};
问题:
1)为什么同类的tasklet不能同时执行?而且在SMP的情况下,也只能是在同一个核心上执行
这是内核给我们提供的一种机制,如果你想在多核下同时执行的话,那就别使用tasklet。使用tasklet在同步上要比用软中断简单
2)而软中断却可以,不但可以同时执行,而且还可以在不同的核心上同时执行?
这个是可以的
原因是因为tasklet可以在进程上下文执行有关系吗?
不是,在进程上下文执行只能是工作队列 回复 2# super皮波
谢谢super皮波回复
明白了,多谢
还有点小问题,
HI_SOFTIRQ就是软中断,最高级别
TASKLET_SOFTIRQ就是实现tasklet的中断级别
只是软中断通常是top-half和bottom-half在一块,迅速完成,基本可以不区分,比如,网络数据包接收算吗?
而tasklet通常top-half先对硬件中断产生回应,再去用bottom-half执行剩下的工作,比如内存拷贝,键盘输入之类的
这也是为什么说tasklet也是软中断实现的原因
这么理解对吗? 回复 3# Dannysd
还有点小问题,
HI_SOFTIRQ就是软中断,最高级别
TASKLET_SOFTIRQ就是实现tasklet的中断级别
这两个都是tasklet,级别不同而已
void __init softirq_init(void)
{
int cpu;
for_each_possible_cpu(cpu) {
int i;
per_cpu(tasklet_vec, cpu).tail =
&per_cpu(tasklet_vec, cpu).head;
per_cpu(tasklet_hi_vec, cpu).tail =
&per_cpu(tasklet_hi_vec, cpu).head;
for (i = 0; i < NR_SOFTIRQS; i++)
INIT_LIST_HEAD(&per_cpu(softirq_work_list, cpu));
}
register_hotcpu_notifier(&remote_softirq_cpu_notifier);
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
}
只是软中断通常是top-half和bottom-half在一块,迅速完成,基本可以不区分,比如,网络数据包接收算吗?
而tasklet通常top-half先对硬件中断产生回应,再去用bottom-half执行剩下的工作,比如内存拷贝,键盘输入之类的
这也是为什么说tasklet也是软中断实现的原因
这么理解对吗?
我觉得你还是没完全理解这块
不管是软中断还是tasklet都是下半部的一种实现机制,都是在开中断的情况下去处理,tasklet机制是基于软中断来实现的,tasklet_action
这个处理函数用来保证对同一个tasklet不能在其他的核上同时处理
回复 4# super皮波
谢谢super皮波耐心解答
原来同属于下半部分实现机制,只是级别不同,明白啦~谢谢 同一个tasklet对象同一时刻只能在一个处理器上运行
调用tasklet_schedule来提交一个tasklet对象,假设为tasklet_obj,那么tasklet_schedule首先
会为该tasklet对象tasklet_obj.state打上一个标志TASKLET_STATE_SCHED,表明该tasklet对象被
提交但还没有被运行。
TASKLET_STATE_SCHED标志是确保tasklet串行化的第一道防线,但是如果该tasklet_obj对象已经被
调度到处理器CPU0上运行了,那么TASKLET_STATE_SCHED标志会被清除。
这意味着当一个tasklet_obj对象正在一个处理器上运行时,同一个tasklet_obj对象完全可以被提交
到另一个处理器,那么这种情况下如何确保tasklet串行化呢,答案是tasklet_obj.state上为SMP系统
增加的另一个标志位TASKLET_STATE_RUN
回复 6# weijitao
多谢weijitao 回复,简单易懂,太感谢了 :em02:
页:
[1]