0

使用 module_init 我创建并唤醒了一个 kthread。为了让它保持活力并完成我的功能任务,我使用了以下方法。这是我可以让它运行的唯一方法,因为我在中断中更改标志。现在我正面临着代码性能令人难以置信的下降。我将问题缩小到以下代码:

   while(1){            
        //Do my tasks here after changing flag  

        while(get_flag() ){ //Waiting for a flag, to basically do my Func in the previous line.
              schedule();       
        }       
   }//to keep a kthread alive after initial create.

关于降低性能的详细信息:不使用包含调度的第二个 while(1),我的代码中的数据传输速率为 35MB/s,但使用这条小线,它下降到 5MB/s。

有没有其他方法可以让 kthread 休眠并等待标志更改?

4

1 回答 1

2

理想情况下,这不是您应该在内核中执行此操作的方式。但如果你必须这样做。看看您是否正在对标志进行阻塞检查?如果是这种情况,请将其更改为非阻塞等待,只需检查在大多数情况下应该足够的标志和时间表。调度算法将确保为所有进程获得公平的 CPU 份额。此外,如果您正在对标志进行阻塞检查,那么您将不必要地浪费 CPU 周期,因为您只在下一个调度程序片上进行处理。同样的逻辑,如果你想获得更好的性能,你应该使用 wakeup_task() 从你的生产者线程中唤醒你的等待进程

-或者-

如果你只是想实现功能,我觉得正确的方法是下面的方法。使用等待队列,wait_even_interruptible() 和 wake_up_interruptible()

从上面所说的内核线程中,您只需要调用 wait_event_interruptible ,请参见下面的伪代码

while (1){
wait_event_interruptible(wq, your_flag)
{
<do your task>
}
}

从你设置标志的地方

{
<some event> 
<set flag>
wake_up_interruptible (wq)
}

您不必显式调用计划。

于 2013-10-04T19:59:27.327 回答