web-dev-qa-db-ja.com

Unixのプロセス、カーネルスレッド、軽量プロセス、ユーザースレッドの関係は何ですか?

VahaliaによるUnix Internalには、プロセス、カーネルスレッド、軽量プロセス、およびユーザースレッドの関係を示す図があります。この本は、SVR4.2に最も注意を向けており、4.4BSD、Solaris 2.x、Mach、およびDigital UNIXについても詳しく説明しています。 Linuxについては尋ねていません。

  1. プロセスごとに、プロセスの基礎となる1つ以上の軽量プロセスが常にありますか?図3.4は「はい」と言っているようです。

    図3.5(a)は、CPUの上に直接プロセスを表示し、間に軽量プロセスがないのはなぜですか?

  2. 軽量プロセスごとに、軽量プロセスの基礎となるカーネルスレッドは常に1つだけですか?図3.4は「はい」と言っているようです。

    なぜ図3.5(b)は、カーネルスレッドを介さずに、プロセスの上に直接軽量プロセスを表示するのですか?

  3. カーネルスレッドは、スケジュールできる唯一のエンティティですか?

  4. 軽量プロセスは、基になるカーネルスレッドをスケジュールすることによって間接的にのみスケジュールされますか?

  5. プロセスは、基礎となる軽量プロセスのスケジュールを介して間接的にのみスケジュールされますか?

Figure 3-4. Lightweight processes

Figure 3-5. User thread implementations


更新:

Linuxについても同様の質問をしました Linuxのカーネルスレッドに軽量プロセスがアタッチされていますか? 本のオペレーティングシステムの概念ではUnixを暗黙的に使用する概念が紹介されているため、おそらくUnixとLinux違うので、Unixカーネルについて読みました。

現在の返信に感謝しますが、他の返信を受け入れることができるように、投稿を再開したいと思っています。

12
Tim

参照:Understanding the Linux Kernel、3rd Edition by Daniel P. Bovet、Marco Cesati

  • パブリッシャー:O'Reilly
  • 公開日:2005年11月
  • ISBN:0-596-00565-2
  • ページ:942

彼らの紹介で、ダニエルP.ボベットとマルコチェザーティは言った:

技術的に言えば、Linuxは完全なUnixオペレーティングシステムではありませんが、真のUnixカーネルです。これには、ファイルシステムユーティリティ、ウィンドウシステム、グラフィカルデスクトップ、システム管理者などのすべてのアプリケーションが含まれていないためですコマンド、テキストエディター、コンパイラーなど。したがって、この本で読んだりLinuxカーネルで見たりすることは、他のUnixバリアントも理解するのに役立つかもしれません。

次の段落では、「Linuxカーネルの理解」で提示されている事実の大部分はUnixのものと類似しているという事実を理解した上で、あなたの見解に取り組みます。

プロセスの意味は何ですか?

プロセスは人間のようなものであり、生成され、多かれ少なかれ重要な寿命を持ち、オプションで1つ以上の子プロセスを生成し、最終的には死にます。プロセスには5つの基本的な部分があります。コード(「テキスト」)、データ(VM)、スタック、ファイルI/O、およびシグナルテーブルです。

カーネル内のプロセスの目的は、システムリソース(CPU時間、メモリなど)が割り当てられるエンティティとして機能することです。プロセスが作成されるとき、それはその親とほとんど同じです。親のアドレス空間の(論理)コピーを受け取り、親と同じコードを実行します。プロセス作成システムコールに続く次の命令から開始します。親と子はプログラムコード(テキスト)を含むページを共有できますが、データ(スタックとヒープ)の個別のコピーがあるため、子によるメモリ位置への変更は親には見えません(逆も同様) 。

プロセスはどのように機能しますか?

実行中のプログラムには、コンピュータに何をすべきかを指示するバイナリコード以上のものが必要です。プログラムを実行するには、メモリとさまざまなオペレーティングシステムリソースが必要です。 「プロセス」とは、メモリにロードされたプログラムと呼ばれるもので、操作に必要なすべてのリソースを備えています。スレッドは、プロセス内の実行の単位です。プロセスは、1つのスレッドから多数のスレッドまでの範囲を持つことができます。プロセスが開始すると、メモリとリソースが割り当てられます。プロセス内の各スレッドは、そのメモリとリソースを共有します。シングルスレッドプロセスでは、プロセスには1つのスレッドが含まれます。プロセスとスレッドは同じであり、起こっていることは1つだけです。マルチスレッドプロセスでは、プロセスに複数のスレッドが含まれ、プロセスは同時に多くのことを実行します。

マルチプロセッシングシステムのメカニズムには、軽量プロセスと重量プロセスが含まれます。

ヘビーウェイトプロセスでは、複数のプロセスが並行して同時に実行されます。並列処理される各ヘビーウェイトプロセスには、独自のメモリアドレス空間があります。プロセスのメモリアドレスが異なるため、プロセス間通信が遅くなります。プロセス間のコンテキスト切り替えは、よりコストがかかります。プロセスは他のプロセスとメモリを共有しません。これらのプロセス間の通信には、ソケットやパイプなどの追加の通信メカニズムが含まれます。

軽量プロセスでは、スレッドとも呼ばれます。スレッドは、ワークロードを共有および分割するために使用されます。スレッドは、それらが属するプロセスのメモリを使用します。同じプロセスのスレッドは、所属するプロセスとメモリを共有するため、スレッド間通信はプロセス間通信よりも高速です。その結果、スレッド間の通信は非常にシンプルで効率的です。同じプロセスのスレッド間のコンテキスト切り替えは、より安価です。スレッドは同じプロセスの他のスレッドとメモリを共有します

スレッドには、ユーザーレベルのスレッドとカーネルレベルのスレッドの2種類があります。ユーザーレベルのスレッドはカーネルを回避し、作業を独自に管理します。ユーザーレベルのスレッドには、単一のスレッドがタイムスライスを独占するため、タスク内の他のスレッドが不足するという問題があります。ユーザーレベルのスレッドは通常、カーネルの上のユーザー空間でサポートされ、カーネルのサポートなしで管理されます。カーネルはユーザーレベルのスレッドについて何も知らず、シングルスレッドプロセスであるかのようにそれらを管理します。そのため、ユーザーレベルのスレッドは非常に高速であり、カーネルスレッドよりも100倍速く動作します。

カーネルレベルのスレッドは、多くの場合、いくつかのタスクを使用してカーネルに実装されます。この場合、カーネルは、各プロセスのタイムスライス内で各スレッドをスケジュールします。ここでは、クロックティックがスイッチング時間を決定するため、タスクがタスク内の他のスレッドからタイムスライスを占有する可能性は低くなります。カーネルレベルのスレッドは、オペレーティングシステムによって直接サポートおよび管理されます。ユーザーレベルのスレッドとカーネルレベルのスレッドの関係は完全に独立しているわけではなく、実際にはこれら2つのレベルの間に相互作用があります。一般に、ユーザーレベルのスレッドは、多対1、1対1、多対多、2レベルの4つのモデルのいずれかを使用して実装できます。これらすべてのモデルは、ユーザーレベルのスレッドをカーネルレベルのスレッドにマップし、両方のレベル間で異なる程度の相互作用を引き起こします。

enter image description here

スレッド対プロセス

  1. プログラムは、プログラミングコードのテキストファイルとして始まります。
  2. プログラムはバイナリ形式にコンパイルまたは解釈され、
  3. プログラムがメモリに読み込まれ、
  4. プログラムは、1つ以上の実行中のプロセスになります。
  5. プロセスは通常、互いに独立しています。
  6. スレッドはプロセスのサブセットとして存在します。
  7. スレッドは、プロセスよりも簡単に相互に通信できます。
  8. ただし、スレッドは、同じプロセス内の他のスレッドによって引き起こされる問題に対してより脆弱です。

参照:

Linuxカーネル、第3版について

詳細 1245

...............................................

今、これらすべての用語を簡略化しましょう(この段落は私の観点からです)。カーネルはソフトウェアとハ​​ードウェア間のインターフェースです。つまり、カーネルは脳のように機能します。遺伝物質(コードとその派生ソフトウェア)と身体システム(ハードウェアまたは筋肉)の関係を操作します。

この脳(つまりカーネル)は、それに応じて動作するプロセスに信号を送信します。これらのプロセスの一部はマッスル(スレッドなど)に似ており、各マッスルには独自の機能とタスクがありますが、それらはすべて連携してワークロードを完了します。これらのスレッド(筋肉など)間の通信は非常に効率的でシンプルなため、スムーズかつ迅速かつ効果的に仕事を遂行できます。一部のスレッド(筋肉など)は、ユーザーの制御下にあります(手や足の筋肉など)。他の人は脳の制御下にあります(私たちが制御できない胃、目、心臓の筋肉など)。

ユーザー空間スレッドはカーネルを回避し、タスク自体を管理します。多くの場合、これは「協調マルチタスク」と呼ばれ、実際には上肢や下肢のようであり、私たち自身の制御下にあり、すべて一緒に動作して作業(つまり、エクササイズなど)を達成し、脳。一方、Kernel-Spaceスレッドは、カーネルとそのスケジューラによって完全に制御されます。

...............................................

ご質問への回答:

  1. プロセスは常に1つ以上の軽量プロセスに基づいて実装されていますか?図3.4は「はい」と言っているようです。図3.5(a)がCPUの上に直接プロセスを表示するのはなぜですか?

    はい、スレッドと呼ばれる軽量プロセスと重量プロセスがあります。

    重いプロセス(シグナルスレッドプロセスと呼ぶことができます)では、プロセッサ自体がその実行を順序付けるためにより多くの作業を行う必要があります。そのため、図3.5(a)はCPUの上に直接プロセスを示しています。

  2. 軽量プロセスは常にカーネルスレッドに基づいて実装されますか?図3.4は「はい」と言っているようです。図3.5(b)がプロセスの上に直接軽量プロセスを表示するのはなぜですか?

    いいえ、軽量プロセスは、上記のように、ユーザーレベルとカーネルレベルの2つのカテゴリに分類されます。ユーザーレベルのプロセスは、タスクを処理するために独自のライブラリに依存しています。カーネル自体がカーネルレベルのプロセスをスケジュールします。ユーザーレベルのスレッドは、多対1、1対1、多対多、および2レベルの4つのモデル化されたものの1つを使用して実装できます。これらのモデルはすべて、ユーザーレベルのスレッドをカーネルレベルのスレッドにマッピングします。

  3. スケジュールできるエンティティはカーネルスレッドだけですか?

    いいえ、カーネルレベルのスレッドはカーネル自体によって作成されます。これらは、カーネルレベルのスレッドに制限されたアドレス空間がないという点で、ユーザーレベルのスレッドとは異なります。それらはカーネル空間にのみ住んでおり、ユーザーランドの領域に決して切り替えません。ただし、これらは通常のプロセスと同様に、完全にスケジュール可能でプリエンプティブルなエンティティです(注:重要なカーネルアクションのほとんどすべての割り込みを無効にすることができます)。カーネル独自のスレッドの目的は、主にシステムの保守作業を実行することです。カーネルのみがカーネルスレッドを開始または停止できます。一方、ユーザーレベルのプロセスは、それ自体のライブラリに基づいて自分自身をスケジュールでき、同時に2レベルおよび多対多モデル(上記)に基づいてカーネルによってスケジュールできます。これにより、特定のユーザーレベルのスレッドを単一のカーネルレベルのスレッドにバインドするため。

  4. 軽量のプロセスは、基になるカーネルスレッドのスケジュールを介して間接的にのみスケジュールされますか?

    カーネルスレッドは、カーネルスケジューラ自体によって制御されます。ユーザーレベルでスレッドをサポートするということは、アプリケーションにリンクされているユーザーレベルのライブラリがあり、このライブラリ(CPUではない)が実行時のスレッドのすべての管理を提供することを意味します。スレッドの抽象化を実装するために必要なデータ構造をサポートし、これらのスレッドのリソース管理の決定を行うために必要なすべてのスケジューリング同期およびその他のメカニズムを提供します。現在、一部のユーザーレベルのスレッドプロセスは、基盤となるカーネルレベルのスレッドにマップできます。これには、1対1、1対多、および多対多のマッピングが含まれます。

  5. プロセスは、基礎となる軽量プロセスのスケジュールを介して間接的にのみスケジュールされますか?

    それがヘビーウェイトプロセスかライトウェイトプロセスかによって異なります。重いは、カーネル自体によってスケジュールされたプロセスです。ライトプロセスは、カーネルレベルとユーザーレベルで管理できます。

12
user88036