web-dev-qa-db-ja.com

カーネルスレッドとは何ですか?

デバイスドライバーのコーディングを始めたばかりで、スレッディングが初めてです。まだ疑問があります。

  1. カーネルスレッドとは.
  2. ユーザースレッドとどう違うの?.
  3. 2つのスレッド間の関係は何ですか?.
  4. カーネルスレッドを実装するにはどうすればよいですか?.
  5. 実装の出力はどこで確認できますか?.

誰かが私を助けてくれますか?ありがとう。

25
tijin

カーネルスレッドは、カーネルモードでのみ実行されるカーネルタスクです。通常、fork()またはclone()システムコールによって作成されていません。例はkworkerまたはkswapdです。

カーネルスレッドが何であるかがわからない場合は、カーネルスレッドを実装しないでください。

Googleは、カーネルスレッドに関する多くのページを提供しています。 フレイのページ

10
  1. カーネルスレッドはtask_structユーザー空間コンポーネントなし。
  2. ユーザースペースがないことの他に、祖先が異なり(kthreaddプロセスではなくinitカーネルスレッド)、cloneのシーケンスではなくカーネル専用APIによって作成されますfork/execシステムコール。
  3. 2つのカーネルスレッドには、親としてkthreaddがあります。それとは別に、カーネルスレッドはユーザー空間プロセスと同じ「独立」を享受します。
  4. 使用 kthread_run function/macro from the kthread.h header この関数を呼び出すには、おそらくカーネルモジュールを作成する必要があるので、 a look a Linuxデバイスドライバー
  5. printk呼び出しを介して)実装のテキスト出力を参照している場合は、dmesgコマンドを使用してカーネルログでこの出力を確認できます。
19
Mircea

ユーザースレッドとスタック:

各スレッドには独自のスタックがあり、独自のローカル変数を使用できるようになっています。スレッドの共有グローバル変数は、Linux実行可能ファイルの.dataまたは.bssセクションの一部です。スレッドはグローバル変数を共有するため、マルチスレッドアプリケーションでグローバル変数にアクセス/変更する場合は、mutexなどの同期メカニズムを使用します。ローカル変数はスレッドの個々のスタックの一部なので、同期する必要はありません。

カーネルスレッドカーネルスレッドは、プロセスコンテキストでカーネルコードを実行する必要から生まれました。カーネルスレッドは、ワークキューメカニズムの基盤です。基本的に、スレッドカーネルはカーネルモードでのみ実行されるスレッドであり、ユーザーアドレス空間やその他のユーザー属性はありません。

スレッドカーネルを作成するには、kthread_create()を使用します。

#include <linux/kthread.h>

structure task_struct *kthread_create(int (*threadfn)(void *data),
                                      void *data, const char namefmt[], ...);

カーネルスレッドとスタック:カーネルスレッドは、pdfフラッシュスレッド、workqスレッドなどのカーネルの後処理タスクを実行するために使用されます。カーネルスレッドは基本的に新しいプロセスのみですアドレス空間なし(必要なフラグを指定したclone()呼び出しを使用して作成可能)は、ユーザー空間に切り替えることができないことを意味します。カーネルスレッドは、通常のプロセスと同様に、スケジュール可能でプリエンプト可能です。

カーネルスレッドには、ローカル情報を管理するために使用する独自のスタックがあります。

カーネルスタックの詳細:- https://www.kernel.org/doc/Documentation/x86/kernel-stacks

4
Varun Sharma

カーネルスレッドとuser [land]スレッドを比較しているので、次のようなものだと思います。

現在、スレッドを実装する通常の方法は、カーネルで実行することです。そのため、これらは「通常の」スレッドと見なすことができます。ただし、SIGALRMなどのシグナルを使用して、ユーザーランドでそれを行うこともできます。そのハンドラーは、現在のプロセス状態(ほとんどはレジスター)を保存し、以前に保存された別のプロセス状態に変更します。いくつかのOSは、適切なカーネルスレッドサポートを取得する前にスレッドを実装する方法としてこれを使用しました。カーネルモードに入る必要がないので、速度は速くなりますが、実際には消えていきました。

協調的なユーザーランドスレッドもあり、1つのスレッドが特別な関数(通常はyieldと呼ばれる)を呼び出すまで実行され、その後、上記のSIGALRMと同様の方法で別のスレッドに切り替わります。ここでの利点は、プログラムが完全に制御できることです。これは、タイミングの問題がある場合(ゲームなど)に役立ちます。また、スレッドの安全性についてあまり気にする必要はありません。大きな欠点は、一度に1つのスレッドしか実行できないことです。そのため、プロセッサに複数のコアがあるため、この方法も一般的ではありません。

カーネルスレッドはカーネルに実装されます。多分あなたはそれらをどのように使うかを意味しましたか?最も一般的な方法は、pthread_createを呼び出すことです。

2
Per Johansson