ユーザプロセスがシステムコールを実行すると、カーネルプロセスが呼び出されます。今すぐどうすればはになりますか?カーネルプロセスは、ユーザプロセスと異なるです。あるいは、私は、カーネルルーチン(システムコールによって呼び出される)とユーザープロセスが同じプロセスに属していると誤っていますか?ユーザプロセスはコンテキスト切り替えを行わずにシステムコールをどのように実行しますか?
1
A
答えて
2
'ユーザプロセスがシステムコールを実行すると、カーネルプロセスが呼び出されます。実際には、カーネルコードが呼び出されることはありません。どのシステムコールでも、必然的に保護コンテキストの変更(リングサイクル)が発生します。これがどれだけ深くなるかは、コールに依存します。コールがリング0に到達した場合、そこにあるカーネルコードはすべてのユーザースレッドとカーネルスレッドにアクセスできるため、カーネルコードは一般に「プロセス」として記述することはできません。保護。典型的には、リング0からリング0へのリングサイクルは2000+ cpuサイクルを要する(ドイツオペラでは3日かかる)。このオーバーヘッドは、システムコールがスレッドコンテキストスイッチおよび/またはプロセスコンテキストスイッチになるかどうかにかかわらず、絶対に必要とされます。
システムコールによって実行中のスレッドセットが変更される場合は、特に変更に別のプロセッサで実行されているスレッドのプリエンプションが必要な場合は、スレッドコンテキストスイッチのオーバーヘッドが発生します。
新しく実行されているスレッドが、先取りされたスレッドとは異なるプロセスに属している場合は、プロセスコンテキストスイッチのオーバーヘッドがさらに大きくなります。
ユーザプロセスのバイナリ/実行可能イメージのカーネルコード部分も同様ですか?カーネルコードはリンク中にユーザープロセスのバイナリファイルの一部になりますか? –
OSのリンクの詳細は、OSに依存します。通常、実行時にOSアクセスを提供するビルド時ライブラリがリンクされています。 DLLとの動的リンクによって。したがって、カーネルにアクセスするコードはバイナリ実行可能ファイルの一部となり、実際のカーネルコードはすべてのプロセスで共有されます。 –
クール..これは私が知る必要があったものです! :)ありがとう:) –