【问题标题】:Kthread and Schedule() slowing down the code. OR how to sleep in kernelKthread 和 Schedule() 减慢了代码速度。或者如何在内核中休眠
【发布时间】:2013-10-11 19:27:03
【问题描述】:

使用 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 休眠并等待标志更改吗?

【问题讨论】:

    标签: multithreading linux-kernel scheduled-tasks linux-device-driver interrupt


    【解决方案1】:

    理想情况下,这不是您应该在内核中执行此操作的方式。但如果你必须这样做。 看看您是否正在对标志进行阻塞检查?如果是这种情况,请将其更改为非阻塞等待,只需检查在大多数情况下应该足够的标志和时间表。调度算法将确保为所有进程获得公平的 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)
    }
    

    您不必显式调用计划。

    【讨论】:

    • @Hamed 你的问题是你的任务睡得太多了。这意味着,由于您是无条件地调度,任务将在下次定期调度程序启动时唤醒。设置条件后,您应该有一些方法可以唤醒您的进程。这只能通过设置/取消设置标志的其他任务来完成。我已经编辑了我的答案,添加了一些伪代码。
    • 非常感谢您所做的一切。正如你所说,我已经编辑了我的代码并使用了这个 makelinux.net/ldd3/chp-6-sect-2 。但是现在我的输出中什么都没有!您认为原因可能是因为我在更改标志时已经处于中断状态?
    • 你所说的“没有输出”是什么意思?预期的 o/p 是多少?你是怎么处理的?在所有这些之前,你能从生产者线程中唤醒休眠的进程吗?
    • 输出只是你提到的 的 printk。没有这个编辑,我有 printk 工作。所以我假设只有 wake_up_interruptible 和 wait_event_interruptible 不起作用。正如我所说,我也关注了链接。有什么提示吗?
    • 好的,所以这意味着唤醒不是唤醒睡着的人,对吧?这是一个简单的逻辑,我看不出它不应该起作用的任何理由。确保您正确执行所有 wq 初始化。并确保您在醒来之前/之后从两个地方正确设置/取消设置标志。 wait_event 将检查条件,如果它没有被评估为真,线程将不会唤醒。
    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2014-02-03
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2021-09-11
    相关资源
    最近更新 更多