プロセス管理 に関するWikipediaの記事を読んでいます。私の焦点はLinuxです。システムコール、メッセージパッシング、割り込みの関係と違いを、その概念と目的で理解することはできません。これらはすべて、プロセスがリソースやサービスをカーネルに要求するためのものですか?
記事からの引用やその他の引用:
OSが割り当て解除または割り当てを実行するために、プログラムの実行中にOSがプロセッサの制御を取り戻すには、2つの可能な方法があります。
- プロセスはシステムコール(ソフトウェア割り込みと呼ばれることもあります)を発行します。たとえば、ハードディスク上のファイルへのアクセスを要求するI/O要求が発生します。
- ハードウェア割り込みが発生します。たとえば、キーボードのキーが押された、またはタイマーが切れた(プリエンプティブマルチタスクで使用された)。
ユーザーモードで実行されているプログラムがカーネルのサービスを要求できる2つのテクニックがあります:
* System call * Message passing
割り込みは、注意の必要性を示す非同期信号、または実行の変更の必要性を示すソフトウェアの同期イベントです。
ハードウェア割り込みにより、プロセッサは実行状態を保存し、割り込みハンドラの実行を開始します。ソフトウェア割り込みは通常、命令セット内の命令として実装されます。これにより、ハードウェア割り込みと同様の割り込みハンドラーにコンテキストが切り替えられます。
最新のオペレーティングシステムはすべてマルチタスクをサポートしています。これは、システムが複数のプロセスを同時に実行できることを意味します。疑似並列(CPUが1つしかない場合)、または最近ではマルチコアCPUが並列で共通(1つのタスク/コア)になっています。
使用可能なCPUが1つだけの、より単純なケースを考えてみましょう。つまり、2つの異なるプロセス(Webブラウザと音楽プレーヤーなど)を同時に実行した場合、システムはそれらを同時に実行することはできません。何が起こるかというと、CPUは常に1つのプロセスから別のプロセスに切り替わっています。しかし、これは非常に速く発生しているため、気付くことはありません。
次に、これら2つのプロセスの実行中に、リセットボタンを押したとしましょう(不良少年)。 CPUは実行中の処理を直ちに停止し、システムを再起動します。おめでとうございます。割り込みを生成しました。
プログラミング中の場合で、CPUにサービスを要求する場合も同様です。違いは、この場合、ソフトウェアコードを実行することです。通常は、システムコールを実行しているライブラリプロシージャ(たとえば、ファイルを開くためのfopen
)です。
したがって、1はCPUから注目を集める2つの異なる方法を説明します。
最近のほとんどのオペレーティングシステムは、ユーザーモードとカーネルモードの2つの実行モードをサポートしています。デフォルトでは、オペレーティングシステムはユーザーモードで実行されます。ユーザーモードは非常に制限されています。たとえば、すべてのI/Oは禁止されています。したがって、ハードディスクからファイルを開くことはできません。もちろん、これは実際には決して起こりません。なぜなら、ファイルを開くと、オペレーティングシステムはユーザーからカーネルモードに透過的に切り替わるからです。カーネルモードでは、ハードウェアを完全に制御できます。
なぜこれら2つのモードが存在するのか疑問に思っている場合、最も簡単な答えは保護です。マイクロカーネルベースのオペレーティングシステム(たとえば、MINIX 3)では、ほとんどのサービスがユーザーモードで実行されるため、害が少なくなります。モノリシックカーネル(Linuxなど)では、ほとんどすべてのサービスがカーネルモードで実行されています。したがって、MINIX 3でクラッシュするドライバーがシステム全体をダウンさせることはまずありませんが、これはLinuxでは珍しいことではありません。
システムコールは、モノリシックカーネル(共有データモデル)でユーザーからカーネルモードに切り替えるために使用されるプリミティブです。メッセージパッシングは、マイクロカーネル(クライアント/サーバーモデル)で使用されるプリミティブです。より正確には、メッセージパッシングシステムでは、プログラマはシステムコールを使用してCPUから注意を引きます。メッセージパッシングは、オペレーティングシステムの開発者にのみ表示されます。システムコールを使用するモノリシックカーネルは高速ですが信頼性は低くなりますが、メッセージパッシングを使用するマイクロカーネルは低速ですが、障害分離が向上します。
したがって、2は、ユーザーモードからカーネルモードに切り替える2つの異なる方法に言及しています。
修正するには、ソフトウェア割り込み、別名トラップを作成する最も一般的な方法は、システムコールを実行することです。一方、割り込みは純粋にハードウェアによって生成されます。
CPUに(ソフトウェアまたはハードウェアのいずれかで)割り込みをかけると、現在の状態(CPUが実行するプロセスとその時点で停止したプロセス)をどこかに保存する必要があります。そうしないと、スイッチバック時にプロセスを再開できません。 。これはコンテキストスイッチと呼ばれ、理にかなっています。別のことを行うためにコンピュータの電源を切る前に、すべてのプログラム/ドキュメントなどを保存したことを確認して、停止したところから再開できるようにする必要があります。次回はオンにします:)
したがって、3は、トラップまたは割り込みの実行後に何を行う必要があるか、および2つのケースがどの程度類似しているかを説明します。
システムコール、メッセージングの受け渡し(Wikipediaの記事で説明)、および割り込みは、コンテキストスイッチまたはユーザーからカーネルモードへの切り替えを引き起こすすべてのものです。 。ご存知のとおり:
カーネルモード:プログラムはメモリのフラットビューまたはリアルビューを備えており、プログラムはすべてのメモリとすべてのハードウェアデバイスに対して制限なしに直接自由に読み書きできます。
ユーザーモード:プログラムにはメモリの仮想化ビューがあり、プログラムはすべてのメモリを自由に読み書きできず、ハードウェアデバイスを直接読み書きできません。より多くのメモリを取得したり、ハードウェアデバイスにアクセスしたりするには、ユーザーモードプログラムがカーネルをcallする必要があります。システムコールとメッセージパッシングは、これを行う2つの方法です。
システムコールには、特定のCPU命令または命令セットの実行が含まれます。これにより、CPUが(スタック上の戻りアドレスを最初に保存する)事前定義されたアドレス(ユーザーモードでは書き込み不可)にジャンプし、CPUをユーザーモードからカーネルモード(リング)に移動します。 3(Intelアーキテクチャでは0を呼び出す)。
ハードウェア割り込みは、ほとんど同じことを実行します。これらは、CPUジャンプ(スタック上の戻りアドレスを最初に保存)を事前定義アドレスにして、CPUをユーザーモードからカーネルモードに移動します。そのため、多くのCPUでは、同じメカニズムをソフトウェア(「ソフトウェア割り込み」と呼ばれます)から呼び出すことができ、CPU呼び出しに使用できます。
メッセージパッシングは、(少なくとも私にとって)カーネルがメッセージのストリームを受信する「実行中のプロセス」であり、そのようなメッセージを送信するユーザーモードのアクセス可能な関数が存在することを意味します。または、「送信」関数がスタックに値を表示するだけで、次にカーネルが制御を持っているときに(プロセスがブロックするか、割り込みが発生した場合)、メッセージをスタックからポップし、それに応じて内部ルーチンにディスパッチします。
実際の「カーネル」が非常に最小限であり、カーネルが提供する機能のほとんどが「サーバー」プロセスに移動するマイクロカーネルアーキテクチャでは、すべてがマルチCPUシステムで同時に実行されている可能性があります。単純な古いシステムコールアプローチよりも便利です。 「メッセージ」を解釈して適切なカーネル「サーバー」にルーティングすることは、マイクロカーネルの数少ない仕事の1つです。
メッセージパッシングとは、あるプロセスが別のプロセスにメッセージを送信するという上位レベルの概念です。これは、システム(カーネル)呼び出しによって実装され、他のプロセスにメッセージを渡すようカーネルに要求します。システムコールは、プロセスにさまざまなサービスを実行するようカーネルに要求します。これらは、ソフトウェア割り込み/システムトラップによって実装されます。これにより、CPUはスタックにいくつかの状態を保存し、後で戻ってカーネルモードに切り替えて、カーネルハンドラーにジャンプできるようにします。
ハードウェアとソフトウェアの両方の割り込みにより、CPUは状態を保存し、カーネルモードに切り替え、その割り込みに定義されたハンドラーにジャンプします。違いは、キーボードがキーが押されたことを示すなど、何らかの注意が必要なときにハードウェア割り込みが外部ハードウェアによって生成されることです。キーボードハンドラーは、キーボードIOポートを読み取ってどのキーが押されたかを確認し、適切なアクションを実行してから、中断されたプログラムに戻ることができます。