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