kworker/nとevents/nの違い

kworker/nとevents/nの違い

カーネルが割り込みを処理する方法を学んでいます。
読むシチャオのメモevents/n、スレッドがジョブキューを処理していることがわかりました。
同時に、インターネット上のいくつかの文書(例:この投稿)、そう言う

「kworker」は、特に割り込み、タイマー、I / Oなどがある場合にカーネルの実際の処理の大部分を実行するカーネルワーカースレッドのプレースホルダプロセスです。

彼らは私と似ていて少し混乱しています。events/nスレッドとkworkerスレッドは同じですか?では、名前がevents/n変更されましたか?そうでない場合とkworkerの違いは何ですか?events/nkworker

kworkerで(はい、kworker/1:0)を見つけることができますが、htop表示できませんevents/n

ベストアンサー1

これに対する答えが得られるようです。要約すると、名前が変更されたようですが、それに関する文書は見つかりませんでした。

詳細:

Shichaoのノートは本に基づいていました。Linux カーネル開発者: Robert Love。この本はカーネルバージョン2.6.34に基づいています。コメントのコードスニペットはファイルのコードと一致します。カーネル/workqueue.cこのバージョンの場合:

/*
 * The per-CPU workqueue (if single thread, we always use the first
 * possible cpu).
 */
struct cpu_workqueue_struct {

        spinlock_t lock;

        struct list_head worklist;
        wait_queue_head_t more_work;
        struct work_struct *current_work;

        struct workqueue_struct *wq;
        struct task_struct *thread;
} ____cacheline_aligned;

/*
 * The externally visible workqueue abstraction is an array of
 * per-CPU workqueues:
 */
struct workqueue_struct {
        struct cpu_workqueue_struct *cpu_wq;
        struct list_head list;
        const char *name;
        int singlethread;
        int freezeable;         /* Freeze threads during suspend */
        int rt;
#ifdef CONFIG_LOCKDEP
        struct lockdep_map lockdep_map;
#endif
};

Linuxのバージョンは、以下を使用しているようです。ジョブキューの初期化ジョブキューを作成する機能:

void __init init_workqueues(void)
{
        ...
        keventd_wq = create_workqueue("events");
}

Robert Loveの著書「Creating a Queue」(154ページ)では、次のように述べています。

単純な関数を使用すると、新しいジョブキューと関連ワーカースレッドを作成できます。 struct workqueue_struct *create_workqueue(const char *name) パラメーター名は、カーネル・スレッドの名前を指定するために使用されます。

したがって、上記のコードは、ワーカースレッドの名前が「イベント」である理由を説明しているようです。

最新のコード(4.19を参照)にはいくつかの違いがあります。まず、ジョブキュー構造はるかに広く、CPU_workqueue_structもう存在しません。プールがあり、ジョブキューワーカースレッドの作成は、次の関数によって実行されます。ワーカーの作成プールで。関数内では、次のコードスニペットのように「kworker / % s」kthreadが生成されます。

/**
 * create_worker - create a new workqueue worker
 * @pool: pool the new worker will belong to
 *
 * Create and start a new worker which is attached to @pool.
 *
 * CONTEXT:
 * Might sleep.  Does GFP_KERNEL allocations.
 *
 * Return:
 * Pointer to the newly created worker.
 */
static struct worker *create_worker(struct worker_pool *pool)
{
        ...
        worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
                                              "kworker/%s", id_buf);
        ...
}

だから私が得ることができるのはそれがすべてだ。もしもっと正確な意見や修正された意見がある方は聞きたいです。

ジョブキューに関する正確な情報は、次の場所にあります。このカーネル文書

おすすめ記事