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.

パフォーマンスの低下に関する詳細: スケジュールを含む 2 番目の while(1) を使用しないと、コードのデータ転送速度は 35MB/秒ですが、この小さな行では 5MB/秒に低下します。

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 に答える