workqueue

読み:ワークキュー
外語:workqueue 英語
品詞:名詞

Linuxカーネルで使用されている遅延処理の方法の一つ。

目次

workqueueはtaskletの問題を改善するもので、専用のカーネルスレッドを作って実行する。また、指定した時間経過後に処理を呼び出すことが可能である。

予め用意されているシステム共有のカーネルスレッドとキューを用いても良いし、create_workqueue()関数で独自のカーネルスレッドとキューを作成し使用することもできる。

ワークキュー内でsleepした場合などは、その影響はそのワークキューが持つ全てのワークに及ぶ。

オブジェクト

workqueueでは、遅延処理をオブジェクト(work_struct)として管理する。

必要な遅延処理ごとにwork_structを用意し、これをキューに格納して順次実行することになる。

カーネルスレッド

workqueueはカーネルスレッドを作って処理するため、他のカーネルスレッドへの影響がない。

独自に作る方法と、システム共有のものを使う方法とがある。

なお、このカーネルスレッドは、キューに遅延処理がプッシュされてくるまではスリープしている。

独自のworkqueueを使う

次のような関数が用意されている。

  • create_workqueue() … 独自のworkqueueを作成する(CPU数ぶんのスレッド)
  • create_singlethread_workqueue() … 独自のworkqueueを作成する(一つだけ)
  • queue_work() … キューにオブジェクト(work_struct)をプッシュ
  • destroy_workqueue() … workqueueを削除

システム共有のworkqueueを使う

  • schedule_work() … キューにオブジェクト(work_struct)をプッシュ

遅延付き

すぐに実行するのではなく、暫く経ってから実行することも可能。これら関数にはdelayedと付けられている。

よう使うもの。

  • schedule_delayed_work() … キューにオブジェクト(work_struct)をプッシュ
  • cancel_delayed_work_sync() … オブジェクト(work_struct)を取り消す

ここでは簡潔に済ませるために、システム共有のworkqueueを使う。

schedule_work

定義

DECLARE_WORKは、struct work_structを作り、初期値を代入するマクロ。

static void test_workqueue_cb(struct work_struct *);
static DECLARE_WORK(test_workqueue, test_workqueue_cb);

定義より前に関数があれば良いが、通常はないので、ここではプロトタイプ宣言の例も併せて紹介する。

呼び出し

schedule_work(&test_workqueue);

コールバック関数

static void test_workqueue_cb(struct work_struct *work)
{
    /* hogehoge */
}

schedule_delayed_work

delayed付きも同様だが、時間指定が可能である。

#define DELAY_TIME 2000  /* ms */
schedule_delayed_work(&work, msecs_to_jiffies(DELAY_TIME));

単位がjiffiesなので、ここではミリ秒をjiffiesに変換するinline関数を用いている。

取り消し方法は次の通り。

cancel_delayed_work_sync(&work);
用語の所属
Linux
Linuxカーネル
関連する用語
遅延処理

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club