Unixのプロセス、カーネルスレッド、軽量プロセス、ユーザースレッドの関係は何ですか?[閉まっている]


12

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. プロセスは、基礎となる軽量プロセスのスケジューリングを介して間接的にのみスケジューリングされますか?

図3-4。 軽量プロセス

図3-5。 ユーザースレッドの実装


更新:

Linuxについても同様の質問をしました。Linux のカーネルスレッドに軽量プロセスが接続されていますか? 「オペレーティングシステムの概念」という本が暗黙的にUnixを使用する概念を紹介し、UnixとLinuxが異なる可能性があるため、Unixカーネルについて読んだためだと思います。

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


なぜそのような質問はあまりにもボードとしてマークされますか?実際、Linuxの概念については良い質問です。ドキュメントは通常、十分に詳細ではないため、説明が優れた答えになります
炸鱼薯条德里克

再司会者:それは質問の純粋な数ではなく、質問の性質が重要です。私は、いくつかの密接に関連した混乱を招く概念間の関係を求めています。理解していない人は、質問の数が重要だと思うかもしれません。
ティム

回答:


12

参照:Linuxカーネルの理解、第3版、ダニエルP.ボベット、マルコセサティ

  • 出版社:オライリー
  • 発行日:2005年11月
  • ISBN:0-596-00565-2
  • ページ:942

ダニエル・P・ボベットとマルコ・チェサティは、その紹介で次のように述べています。

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

次の段落では、「Linuxカーネルを理解する」に示されている事実に対する理解に基づいて、あなたの視点に取り組んでみます。

プロセスとはどういう意味ですか?

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

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

プロセスの仕組み

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

マルチプロセッシングシステムの仕組みには、軽量プロセスと重量プロセスが含まれます。

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

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

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

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

ここに画像の説明を入力してください

スレッドとプロセス

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

参照:

Linux Kernel、第3版を理解する

もっと1 2 3 4 5

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

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

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

ユーザースペースのスレッドは、カーネルを回避し、タスク自体を管理します。多くの場合、これは「協調的マルチタスク」と呼ばれ、実際には上肢および下肢のようであり、私たち自身の制御下にあり、すべて一緒に動作して作業(エクササイズまたは...)を達成し、脳。一方、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つのモデルのいずれかを使用して実装できます。これらのモデルはすべて、ユーザーレベルのスレッドをカーネルレベルのスレッドにマップします。

  3. カーネルスレッドだけがスケジュール可能なエンティティですか?

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

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

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

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

    それは、重いプロセスであるか軽量なプロセスであるかに依存します。重いプロセスは、カーネル自体によってスケジュールされます。ライトプロセスは、カーネルレベルおよびユーザーレベルで管理できます。


ありがとう。(1)unix.stackexchange.com/questions/472354/… (2)LInuxではなくUnixについて具体的に質問しましたが、特にLinuxに非常に役立つ返信をいただければ幸いです。
ティム

1
あなたが参照、五郎を精巧または提供することができます- 「カーネル自身のスレッドの目的は、システムの保守業務を行うために、主である」
iruvar

@iruva「メンテナンス義務」は正確な用語ではないと思います。たとえば、電源管理はカーネルスレッドによって制御され、メンテナンス義務とは関係ありません。実際、この投稿とともに提供されるリファレンスには、カーネルスレッドに関する豊富な情報が含まれています。カーネルスレッドとその機能/タイプ/作成方法などについて、新しい質問を投稿してください。など、喜んで説明します。この回答は十分な長さであり、追加情報を受け入れることはできません!

@Tim:どのバージョンのUnixについて尋ねましたか?具体的には、本で説明されているようにあなたが言及した古代のシステムは何ですか?最新のBSDは含まれていますか?Solaris 11は含まれていますか?MacOS X Leopard(認定UNIX)は含まれていますか?
user1686

@grawity私は本について尋ねました。他のバージョンを知っているなら、それも知っておくと良いでしょう。
ティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.