カーネルが割り込みを処理する方法を学んでいます。
読むシチャオのメモevents/n
、スレッドがジョブキューを処理していることがわかりました。
同時に、インターネット上のいくつかの文書(例:この投稿)、そう言う
「kworker」は、特に割り込み、タイマー、I / Oなどがある場合にカーネルの実際の処理の大部分を実行するカーネルワーカースレッドのプレースホルダプロセスです。
彼らは私と似ていて少し混乱しています。events/n
スレッドとkworker
スレッドは同じですか?では、名前がevents/n
変更されましたか?そうでない場合とkworker
の違いは何ですか?events/n
kworker
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);
...
}
だから私が得ることができるのはそれがすべてだ。もしもっと正確な意見や修正された意見がある方は聞きたいです。
ジョブキューに関する正確な情報は、次の場所にあります。このカーネル文書