参照: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つ以上の実行中のプロセスになります。
- 通常、プロセスは互いに独立しています。
- 一方、スレッドはプロセスのサブセットとして存在します。
- スレッドはプロセスよりも簡単に相互に通信できますが、
- しかし、スレッドは同じプロセス内の他のスレッドによって引き起こされる問題に対してより脆弱です
参照:
Linux Kernel、第3版を理解する
もっと1 2 3 4 5
...............................................
さて、これらすべての用語を単純化しましょう(この段落は私の観点からです)。カーネルは、ソフトウェアとハードウェア間のインターフェースです。つまり、カーネルは脳のように機能します。遺伝物質(コードとその派生ソフトウェア)と身体システム(ハードウェアまたは筋肉)の関係を操作します。
この脳(つまりカーネル)は、それに応じて動作するプロセスに信号を送信します。これらのプロセスの一部は筋肉(つまり、スレッド)に似ており、各筋肉には独自の機能とタスクがありますが、すべてが連携して作業負荷を完了します。これらのスレッド(つまり筋肉)間の通信は非常に効率的でシンプルであるため、スムーズに、すばやく、効果的に仕事を達成します。スレッドの一部(つまり、筋肉)はユーザーの制御下にあります(手足の筋肉など)。他の人は脳の制御下にあります(私たちが制御しない胃、目、心臓の筋肉など)。
ユーザースペースのスレッドは、カーネルを回避し、タスク自体を管理します。多くの場合、これは「協調的マルチタスク」と呼ばれ、実際には上肢および下肢のようであり、私たち自身の制御下にあり、すべて一緒に動作して作業(エクササイズまたは...)を達成し、脳。一方、Kernel-Spaceスレッドは、カーネルとそのスケジューラによって完全に制御されます。
...............................................
ご質問への回答:
プロセスは常に1つ以上の軽量プロセスに基づいて実装されていますか?図3.4はイエスと言っているようです。図3.5(a)にCPUの上に直接プロセスが表示されるのはなぜですか?
はい、スレッドと呼ばれる軽量のプロセスと、重量のあるプロセスがあります。
重いプロセス(シグナルスレッドプロセスと呼ぶことができます)では、プロセッサ自体が実行を命令するためにより多くの作業を行う必要があるため、図3.5(a)はCPUの上に直接プロセスを示しています。
軽量プロセスは常にカーネルスレッドに基づいて実装されていますか?図3.4はイエスと言っているようです。図3.5(b)がプロセスの上に軽量プロセスを直接表示するのはなぜですか?
いいえ、軽量プロセスは、前述のように、ユーザーレベルとカーネルレベルの2つのカテゴリに分類されます。ユーザーレベルのプロセスは、独自のライブラリに依存してタスクを処理します。カーネル自体がカーネルレベルのプロセスをスケジュールします。ユーザーレベルのスレッドは、多対1、1対1、多対多、2レベルの4つのモデルのいずれかを使用して実装できます。これらのモデルはすべて、ユーザーレベルのスレッドをカーネルレベルのスレッドにマップします。
カーネルスレッドだけがスケジュール可能なエンティティですか?
いいえ、カーネルレベルのスレッドは、カーネル自体によって作成されます。これらは、カーネルレベルのスレッドに制限されたアドレス空間がないという点で、ユーザーレベルのスレッドとは異なります。それらはカーネル空間のみに住んでおり、ユーザーランドの領域に切り替えることはありません。ただし、通常のプロセスと同様に、これらは完全にスケジュール可能でプリエンプティブなエンティティです(注:重要なカーネルアクションのほぼすべての割り込みを無効にすることができます)。カーネル自体のスレッドの目的は、主にシステムの保守業務を実行することです。カーネルのみがカーネルスレッドを開始または停止できます。一方、ユーザーレベルのプロセスは、独自のライブラリに基づいて自身をスケジュールでき、同時に2レベルおよび多対多モデル(上記)に基づいてカーネルによってスケジュールできます。
軽量プロセスは、基礎となるカーネルスレッドのスケジューリングを介して間接的にのみスケジューリングされますか?
カーネルスレッドは、カーネルスケジューラ自体によって制御されます。ユーザーレベルでスレッドをサポートするということは、アプリケーションにリンクされているユーザーレベルのライブラリがあり、このライブラリ(CPUではなく)がスレッドのランタイムサポートですべての管理を提供することを意味します。スレッドの抽象化を実装するために必要なデータ構造をサポートし、これらのスレッドのリソース管理を決定するために必要なすべてのスケジューリング同期およびその他のメカニズムを提供します。現在、ユーザーレベルのスレッドプロセスの一部は、基礎となるカーネルレベルのスレッドにマップできます。これには、1対1、1対多、および多対多のマッピングが含まれます。
プロセスは、基礎となる軽量プロセスのスケジューリングを介して間接的にのみスケジューリングされますか?
それは、重いプロセスであるか軽量なプロセスであるかに依存します。重いプロセスは、カーネル自体によってスケジュールされます。ライトプロセスは、カーネルレベルおよびユーザーレベルで管理できます。