暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux中的中断处理机制(五)

术道经纬 2019-11-10
324

ksoftirqd

"ksoftirqd"是一种per-cpu的内核线程,当你用"ps"命令查看的时候,你会发现ksoftirqd的数目刚好等于你机器的CPU的数目。

引入ksoftirqd的初衷是为了避免上文提到的“线程饥饿”,在一定程度上提高系统的实时性。如果需要更进一步的提高实时性,应该支持在中断处理函数返回之后,率先执行更高优先级的任务,而不是之前被中断打断的那个任务。

ksoftirqd是作为一个线程参与内核调度的,因而是运行在进程上下文,但在ksoftirqd运行期间,通常也是不允许睡眠的,具体原因将在本文的后半部分给出。

softirq的抢占

softirq和top half/hardirq的一个重要区别是,在hardirq执行期间,硬件中断是被屏蔽的,这样hardirq就不会嵌套,但是在softitq执行期间,硬件中断是打开的,也就是说,softirq可能被硬件中断抢占。

自从Linux 2.6.32之后,中断处理函数不再使用被其打断的线程的栈,而是使用独立的per-cpu的栈,并且softirq和hardirq会有不同的栈,这意味着每个CPU都对应一个softirq的栈和一个hardirq的栈。

DEFINE_PER_CPU(struct irq_stack *, hardirq_stack);

DEFINE_PER_CPU(struct irq_stack *, softirq_stack);

文章转载自术道经纬,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论