VahaliaのUnix Internalには、プロセス、カーネルスレッド、軽量プロセス、ユーザースレッド間の関係を示す図があります。この本はSVR4.2に最も焦点を当てていますが、4.4BSD、Solaris 2.x、Mach、およびDigital UNIXについても詳しく説明します。私はLinuxについて尋ねるのではないことに注意してください。
各プロセスには、プロセスの下に常に1つ以上の軽量プロセスがありますか?図3.4はそうだと答えているようです。
図3.5(a)では、途中で軽量プロセスなしでCPUから直接プロセスを表示するのはなぜですか?
各軽量プロセスに対して、軽量プロセスの基盤となるカーネルスレッドは常に1つしかありませんか?図3.4はそうだと答えているようです。
図3.5(b)では、途中でカーネルスレッドなしでプロセスのすぐ上に軽量プロセスが表示されるのはなぜですか?
カーネルスレッドが予約できる唯一のエンティティですか?
軽量プロセスは、デフォルトのカーネルスレッドを予約することによって間接的にのみ予約されますか?
基本的な軽量プロセスをスケジュールして、プロセスを間接的にのみスケジュールしますか?
修正する:
Linuxについても同様の質問をしました。Linuxの軽量プロセスはカーネルスレッドに接続されていますか? 「オペレーティングシステムの概念」という本では、概念を導入するために暗黙的にUnixを使用しており、UnixとLinuxは異なる可能性があるため、Unixカーネルについて読みました。
現在の回答ありがとうございます。しかし、他の答えを受け取るためにスレッドを再開したいと思います。
ベストアンサー1
望むより:Linuxカーネルについて学ぶ、第3版、著者:Daniel P. Bovet、Marco Cesati
- 出版社:オライリー
- 発売日:2005年11月
- ISBN:0-596-00565-2
- ページ数:942
Daniel P. BovetとMarco Cesatiは、紹介では次のように述べています。
技術的には、Linuxは真のUnixカーネルですが、ファイルシステムユーティリティ、ウィンドウシステムとグラフィックデスクトップ、システム管理者コマンド、テキスト編集コンバータ、コンパイラなどのすべてのアプリケーションが含まれていないため、完全なUnixオペレーティングシステムではありません。したがって、この本で読んでLinuxカーネルで見ることは、他のUnixのバリエーションを理解するのにも役立ちます。
次の段落では、Unixのカーネルとほぼ同様のLinuxカーネルの理解に示されている事実の私の理解に基づいて、あなたのポイントを説明しようとします。
プロセスはどういう意味ですか?:
プロセスは人間に似ており、生成され、やや重要な寿命を持ち、1つ以上のサブプロセスを選択的に生成し、最終的に終了します。プロセスは、コード(「テキスト」)、データ(VM)、スタック、ファイルI / O、およびシグナルテーブルの5つの基本部分で構成されています。
カーネル内のプロセスの目的は、システムリソース(CPU時間、メモリなど)を割り当てるエンティティとして機能することです。プロセスが作成されると、親プロセスとほぼ同じです。これは、親アドレス空間の(論理)コピーを受け取り、プロセス生成システムコールの後に次の命令から始まり、親と同じコードを実行します。親と子はプログラムコード(テキスト)を含むページを共有できますが、別々のデータコピー(スタックとヒープ)を持つため、子がメモリの場所を変更したことは親に表示されません(その逆も同様)。
プロセスはどのように進行しますか?
プログラムを実行するには、コンピュータに何をすべきかを知らせるバイナリコード以上が必要です。このプログラムを実行するには、メモリとさまざまなオペレーティングシステムリソースが必要です。 「プロセス」は私たちがプログラムと呼び、実行に必要なすべてのリソースとともにメモリにロードされます。スレッドはプロセス内の実行単位です。プロセスには1つのスレッドから複数のスレッドまで含めることができます。プロセスが開始されると、メモリとリソースが割り当てられます。プロセスの各スレッドはこのメモリとリソースを共有します。シングルスレッドプロセスでは、プロセスに1つのスレッドが含まれます。プロセスとスレッドは同じで、1つのことだけが発生します。マルチスレッドプロセスでは、プロセスに複数のスレッドが含まれており、同時に多くのタスクを実行します。
多重処理システムのメカニズムには、軽量プロセスと重量プロセスが含まれます。
重量級プロセスでは、複数のプロセスが並列に実行されます。各並列ヘビー級プロセスには独自のメモリアドレス空間があります。プロセスはメモリアドレスが異なるため、プロセス間の通信が遅くなります。プロセス間のコンテキスト切り替えはコストが高くなります。プロセスは他のプロセスとメモリを共有しません。これらのプロセス間の通信には、ソケットやパイプなどの追加の通信メカニズムが含まれます。
軽量プロセスではスレッドとも呼ばれます。スレッドはワークロードを共有および分割するために使用されます。スレッドは、自分が属するプロセスのメモリを使用します。スレッド間通信は、同じプロセスのスレッドが自分が属するプロセスとメモリを共有するため、プロセス間通信よりも高速です。したがって、スレッド間の通信は非常に簡単で効率的です。同じプロセスのスレッド間のコンテキスト切り替えはコストが安くなります。スレッドは同じプロセス内の他のスレッドとメモリを共有します。
スレッドには、ユーザーレベルスレッドとカーネルレベルスレッドの2種類があります。ユーザーレベルのスレッドはカーネルを回避し、独自の操作を管理します。単一スレッドがタイムスライスを排他的にして他のスレッドを枯渇させる可能性があるユーザーレベルのスレッドには問題があります。ユーザーレベルのスレッドは通常、ユーザースペースのカーネルの上でサポートされ、カーネルサポートなしで管理されます。カーネルはユーザーレベルのスレッドについて何も知らず、シングルスレッドプロセスのように管理します。したがって、ユーザーレベルのスレッドは非常に高速で、カーネルスレッドよりも最大100倍速く実行されます。
カーネルレベルのスレッドは通常、複数のタスクを使用してカーネルに実装されます。この場合、カーネルは各プロセスのタイムスライス内で各スレッドを予約します。ここでは、クロックティックが遷移時間を決定するので、タスクがタスク内の他のスレッドから時間を取る可能性はありません。カーネルレベルのスレッドは、オペレーティングシステムによって直接サポートおよび管理されます。ユーザーレベルスレッドとカーネルレベルスレッドの関係は完全に独立していません。実際、2つのレベルの間に相互作用があります。一般に、ユーザーレベルのスレッドは、多対一、一対一、多対多、および2レベルモデルの4つのモデルのうちの1つを使用して実装できます。これらのモデルはすべて、ユーザーレベルのスレッドをカーネルレベルのスレッドにマップし、2つのレベル間の相互作用のレベルが異なります。
スレッドとプロセス
- プログラムはプログラミングコードのテキストファイルで始まります。
- プログラムはバイナリ形式でコンパイルまたは解釈されます。
- プログラムがメモリにロードされ、
- プログラムは1つ以上の実行プロセスになります。
- プロセスは通常互いに独立しています。
- スレッドはプロセスのサブセットとして存在します。
- スレッド間の通信はプロセスよりも簡単で、
- ただし、スレッドは同じプロセス内の他のスレッドによって引き起こされる問題に対してより脆弱です。
引用:
................................................. . ..............
それでは、これらすべての用語を単純化してみましょう(この段落は私の観点から来たものです。)。カーネルはソフトウェアとハードウェアの間のインタフェースです。つまり、核心は脳のようなものです。これは、遺伝物質(コードや派生ソフトウェアなど)と身体システム(ハードウェアや筋肉など)との関係を操作します。
この脳(つまりカーネル)はプロセスに信号を送り、プロセスはそれに応じて動作します。これらのプロセスのいくつかは筋肉(例えば糸)に似ており、各筋肉は独自の機能とミッションを持っていますが、すべて一緒に働いて作業量を完了します。これらの糸間(すなわち筋肉)間のコミュニケーションは非常に効率的で簡単で、スムーズで迅速かつ効果的に作業を行います。一部のスレッド(例えば、筋肉)は、ユーザー(例えば、手や足の筋肉)の制御を受けます。他のものは脳によって制御されます(例えば、私たちが制御できない胃、目、心臓の筋肉)。
ユーザー空間スレッドはカーネルを避け、タスク自体を管理します。多くの場合、これは「コラボレーションマルチタスク」と呼ばれ、実際には上肢と下肢のようです。これは私たち自身の管理下にあり、一緒に働いて作業を完了します(例:練習や...)。脳に直接の命令は必要ありません。一方、カーネル空間スレッドは、カーネルとそのスケジューラによって完全に制御されます。
................................................. . ..............
あなたの質問に対する答え:
プロセスは常に1つ以上の軽量プロセスに基づいて実装されていますか?図3.4はそうだと答えているようです。図3.5(a)がCPUに直接配置されているプロセスを示す理由は何ですか?
はい、スレッドという軽いプロセスと重いプロセスがあります。
重量級プロセス(シグナルスレッドプロセスと呼ぶことができます)は、実行命令を発行するためにプロセッサ自体でより多くの作業を必要とします。これが、図3.5(a)がCPUに直接配置されているプロセスを示す理由です。
軽量プロセスは常にカーネルスレッドに基づいて実装されていますか?図3.4はそうだと答えているようです。図3.5(b)がプロセスのすぐ上に軽量プロセスを表示するのはなぜですか?
いいえ、軽量プロセスは、上記のように、ユーザーレベルプロセスとカーネルレベルプロセスの2つのカテゴリに分けられます。ユーザーレベルのプロセスは、独自のライブラリを使用してタスクを処理します。カーネル自体はカーネルレベルのプロセスを予約します。ユーザーレベルのスレッドは、多対一、一対一、多対多、および2レベルの4つのモデルのうちの1つを使用して実装できます。これらのモデルはすべて、ユーザーレベルのスレッドをカーネルレベルのスレッドにマップします。
カーネルスレッドが予約できる唯一のエンティティですか?
いいえ、カーネルレベルのスレッドはカーネル自体から生成されます。カーネルレベルのスレッドには限られたアドレス空間がないという点で、ユーザーレベルのスレッドとは異なります。カーネル空間にのみ存在し、ユーザ空間領域に切り替えられません。ただし、これは通常のプロセスと同様に、完全に予約可能でプリエンプティブなエンティティです。カーネルセルフスレッドの目的は、主にシステムでメンテナンスタスクを実行することです。カーネルだけがカーネルスレッドを開始または停止できます。一方、ユーザーレベルのプロセスは独自のライブラリに基づいて独自に予約できますが、2レベルモデルと多対多モデル(上記)に基づいてカーネルで予約できるため、特定のユーザーをバインドできます。 - レベルスレッドを単一のカーネルレベルスレッドに。
軽量プロセスは、デフォルトのカーネルスレッドを予約することによって間接的にのみ予約されますか?
カーネルスレッドはカーネルスケジューラ自体によって制御される。ユーザーレベルでスレッドをサポートすることは、アプリケーションに関連付けられたユーザーレベルのライブラリがあり、そのライブラリ(CPUではなく)がスレッドのランタイムサポートのすべての管理を提供することを意味します。これは、スレッド抽象化を実装するために必要なデータ構造をサポートし、これらのスレッドのリソース管理決定を行うために必要なすべての予約同期およびその他のメカニズムを提供します。これで、1対1、1対多、および多対多のマッピングなど、一部のユーザーレベルのスレッドプロセスをデフォルトのカーネルレベルのスレッドにマッピングできるようになりました。
基本的な軽量プロセスをスケジュールして、プロセスを間接的にのみスケジュールしますか?
重量級プロセスか軽量プロセスかによって異なります。重いプロセスは、カーネル自体によって予約されたプロセスです。軽いプロセスはカーネルレベルとユーザーレベルで管理できます。