内核线程ksoftirqd

来源:互联网 发布:进入阿里云服务器 编辑:程序博客网 时间:2024/05/16 08:36

软中断和微线程的处理都依赖于一组每-处理器内核线程,这些内核线程在当系统中软中断或微线程处理过于频繁时协助软中断和微线程的处理。

一个软中断或微线程可以重新激活自己,从来导致其又重新运行,这样会导致用户程序无法获得处理器,同时,忽略二次激活也是不可接受的。为了满足这两个需求,解决办法是,内核不会立即处理二次激活的软中断或微线程,而是,如果软中断或微线程的数目增长过快,内核将唤醒一些内核线程来协助处理,这些内核线程执行的优先级为最低(nice值为19),以确保它们不会在更重要的任务之前执行。每个处理器都有一个这样的线程,命名为ksoftirqd/n,其中n是处理器的编号。比如,对于双核处理器,有两个这样的内核线程:ksoftirqd/0,ksoftirqd/1。线程初始化,执行逻辑如下所示:

for (;;) { if (!softirq_pending(cpu)) schedule(); set_current_state(TASK_RUNNING); while (softirq_pending(cpu)) { do_softirq(); if (need_resched()) schedule(); } set_current_state(TASK_INTERRUPTIBLE); }