ユーザー プロセスが「システム コール」を呼び出し、CPU がスーパーバイザー モードに切り替わった場合、どのシステム プロセスがシステム コールの実行を担当しますか?
システム コールはスレッド スケジューラによってスケジュールされていますか (CPU は、割り込みを取得した後に別のシステム コールの実行に切り替えることができますか)?
ユーザー プロセスが「システム コール」を呼び出し、CPU がスーパーバイザー モードに切り替わった場合、どのシステム プロセスがシステム コールの実行を担当しますか?
システム コールはスレッド スケジューラによってスケジュールされていますか (CPU は、割り込みを取得した後に別のシステム コールの実行に切り替えることができますか)?
システムコールの実行を担当するシステムプロセスは?
システムコールラッパー(システムコールを実行するために呼び出す関数、実際のシステムコールではなく単なるラッパーです)はパラメーターを受け取り、それらを適切なレジスター(またはスタック上、実装に依存)に渡します。要求しているシステムコール番号をeax
(x86を想定して)入れ、最後にINT 0x80
アセンブリ命令を呼び出します。これは、基本的にOSに割り込みを受信したことを伝えます。この割り込みは、処理する必要があるシステムコールであり、どのシステムコールにserve は で使用できeax
、パラメーターはレジスターにあります。
INT
(最近の実装では、パフォーマンスが高いため使用を中止し、現在はSYSENTER
and を使用してSYSEXIT
います。ただし、上記はほとんど同じです)
スケジューラの観点からは、システム コールを実行するかどうかに違いはありません。つまり、OS にサービスを要求すると (x86 命令INT
またはSYSENTER
andを介してSYSEXIT
)、CPU モード フラグが特権セットに変更され、カーネルがプロセスに代わって要求されたタスクを実行し、完了したら、フラグを元に戻し、実行を次の命令に戻します。
したがって、スケジューラの観点からは、システム コールなどを実行しても、OS は違いを認識しません。
いくつかのメモ:
-上記は一般的な説明です。Windows がこれを適用するかどうかはわかりませんが、適用しない場合は、同様の方法で何かを行う必要があります。
- 多くのシステム コールは、ブロッキング タスク (I/O 処理など) を実行します。プロセスがブロッキング システム コールを要求した場合に CPU 使用率を向上させるために、スケジューラは、プロセスが要求したものの準備が整うまでプロセスを待機キューで待機させますが、CPU で実行される他のプロセスはこれを何かと混同しません。 OS は「システム コールをスケジュール」しませんでした。
スケジューラのタスクはタスクを整理することであり、その観点からは、システム コールはプロセスが実行するルーチンにすぎません。
最後の注意として、一部のシステム コールはアトミックです。つまり、実行を中断することなく実行する必要があります。これらのシステム コールは、中断された場合、中断の原因が終了すると実行を再開するよう求められます。それでも、これはスケジューリングの概念とはかけ離れています。
最初の質問: それは場合によります。一部のシステム コールは、既に実行されているサービス (ネットワーク コールなど) にプロセスとして送信されます。一部のシステム コールでは、新しいプロセスが作成され、実行のスケジュールが設定されます。
最後の質問: はい、windows はマルチプロセッシング システムです。プロセス スケジューラは、スレッドがいつ、どのくらい実行されるかを処理し、ハードウェア割り込みにより、実行中のプロセスが CPU を解放したり、ハードウェアが CPU を取得する準備が整ったアイドル プロセスを引き起こしたりする可能性があります。
Windows(少なくとも> Win 7ですが、過去にもそうだったと思います)では、多くのシステムサービスがsvchostと呼ばれるプロセスで実行されます。何が実行されているかを確認するための優れたアプリケーションは、sys internals の Process Explorer です。ステロイドのタスク マネージャーのようなもので、特定のプロセスが所有するすべてのスレッドを表示します。より詳細な「この dos コマンドで何が起こったのか」の詳細については、呼び出しをステップ実行できるデバッグ ツールを使用することをお勧めします。通常、これらのことを気にする必要はありませんが、その要求を処理しているプロセスが返されるまで、処理を続行する準備ができていないことをシステムが認識しているシステム コールを作成します。プロセスがCPUを解放した直後に、リクエストがCPUを取得する可能性があります。