2012-04-23 18 views
1

x86_64の割り込みコストはいくらですか?たとえば、ページフォルトによる割り込み?カーネルが割り込みを処理してからユーザー空間に戻るのにどれくらいのサイクルが必要ですか?私は、割込みによるコストだけを知り、中断されたユーザレベルのスレッドのスケジューリングをスケジューリングすることに興味があるので、ここで割込みハンドラの内部で何が起こっているのかを無視することができます。x86_64の割り込みコストはどれくらいですか

+6

これは、ハードウェアに依存になります。したがって、GCC、C、またはLinuxにタグが付けられている理由はわかりません。 –

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええりあー。もしそうなら、私はその部分がどのように無視できるのか理解していません。なぜなら、メモリ内容が適切に配置される前にユーザ空間コードを実行させることが不可能に見えるからです。 – unwind

+0

u r right unwind、しかし、この時点では、割り込みとユーザー空間割込みスレッドのスケジューリングによるオーバーヘッドしか知りません。すべてのページがRAMにあるとします。 – pythonic

答えて

0

これは複雑な質問であり、簡単には答えられません。

割り込みで使用されているすべての(使用された)レジスタ(スカラー、sse、fpu-state、avxなど)を保存する必要があります。

仮想アドレススペースのコンテキストを変更する必要があるかもしれません。

完了したら、保存したコンテキストをリセットする必要があります。

キャッシュ/ RAM負荷の影響はすべて、必要なサイクル数を変更します。

(NB:割り込みは、ページアウトするべきではありませんが、ないアイデアは、Linuxはこれをサポートしない場合、またはそれがすべてで可能な場合)

+0

カーネルは整数命令以外のものの使用を一般的に禁止しています。また、一般的には、プロセスのアドレス空間にマップされ、アクセスからのみ保護される(LinuxとWin)。 – zvrba

+0

@zvrba:カーネルは通常浮動小数点などを使用しませんが、状態を保存する必要があります(通常、プロセスがFPUを使用していない場合は保存しないでください)。 FPU/SSE /何でも使用する別のプロセスに切り替えることができます... – ninjalj

+0

@zvrbaそうです、割り込みハンドラはすべてのレジスタを保存する必要はありませんが、 memcpyによるSSE。そして、あなたは正しいです。ウィンドウの下ではプロセスのアドレス空間にすでにマップされていますが、これがLinuxの場合であるかどうかはわかりませんでした。要は、いくつかのレジスタを救済する必要があるということです。メモリにマッピングされた特定のものを持っていなければなりませんが、一般的に数値化するのが難しいキャッシング効果のために、それらは重いものであってはなりません。 – Christopher

1

odrinary割り込み(ハードウェアのIRQまたはゼロによる除算のような通常の例外)のためにそれがありますおそらく上限を与えることが可能です。

ページ違反を処理する時間は、CPUがページテーブルを歩かなければならないためにディスクIOが関与していなくても評価するのが難しくなります。ページ違反は、ページが存在しないだけでなく、アクセス違反(たとえば、読み取り専用ページに書き込もうとするなど)によっても発生します。いずれにしても、ページマッピングがTLBにまだ存在しない場合(欠落したマッピングは決してキャッシュされない)、ページフォールトハンドラを起動する前に、CPUはまず複数のレベルのページテーブルを歩かなければならない。ページテーブルエントリにアクセスする時間(アドレスがTLBにまだキャッシュされていない場合)は、一部のエントリがすでにデータキャッシュ内にあるかどうかによっても異なります。

したがって、呼び出されるPFハンドラにリニアアドレスにアクセスするまでの時間は〜200サイクル(最良の場合、間違ったアクセスタイプのため例外 - リングスイッチのみ)から〜2000サイクルTLBエントリが存在し、データキャッシュ内のページテーブルエントリがない)。これは、1)障害が発生したユーザ・モード命令を実行することと、2)ページ・フォルト・ハンドラの最初の命令を実行することとの間の時間に過ぎない。

[サイドコメント:私はそれがページングを使用するハードリアルタイムシステムを構築することが可能だだろうか、という与えられた]

関連する問題