割り込みについて勉強していました。したがって、ほとんどのアーキテクチャは割り込み駆動型であり、すべてが割り込み駆動型である場合、プロセッサがそれらすべてをどれだけ高速に処理できるかということです。たとえば、キーボードのキーを押している間、カーネルに新しい文字のバッファを探すように要求する割り込みを作成します。その場合、プロセッサがどれだけ速くサービスを提供できるか、また割り込みが置かれたときに、プロセッサは次のように切り替える必要があります。カーネルスペースと、コンテキストスイッチに関して多くのコストがかかります。ですから、これらすべての後でも、プロセッサのパフォーマンスが優れている場合でも、2 つのキーストローク間の時間は、コンピューターの速度の点で多くの時間であると想定することしかできないと思いますか? 平均して、1 分間に何回のコンテキスト スイッチが発生しますか? そうすれば、私が実際に何を勉強しているのか、そして実際の生活を感じることができるようになると思います....ありがとう....
2 に答える
速度は複数の要因に依存します:
- CPU のハードウェアと割り込みコントローラー (存在する場合) のレイテンシー
- CPU クロック レート (多くの場合、イベント (またはそれらへの応答) はそれより速く発生しません)
- CPU が必要なメモリ (システム テーブル (割り込みベクトル テーブルなど。ただし、セグメント テーブルやページ テーブルなどがある場合もあります)) にアクセスできる速度、スタック (割り込みコード命令ポインターは通常、スタックに保存されます。そのため、ISR はそれに戻ることができます)、ISR コード自体とそれが使用するすべてのデータ)。明らかに、コード、データ、および TLB キャッシュがここに貢献します。
- ISR がその作業を行うのに必要な時間。特に ISR が互いにプリエンプトできないため、同時割り込みをシリアル化する必要がある場合。
- 割り込み優先度。多くの場合、異なる割り込みソースには異なる優先度が割り当てられます。たとえば、マスク不可能な割り込み、マシン チェック割り込み (基本的に、重大なハードウェアの問題を報告する割り込み)、およびタイマー割り込みを、たとえばキーボード割り込みよりも高い優先度にする必要があります。優先度ベースの割り込み処理では、現在処理されている割り込みより優先度が低いすべての割り込みは、「待機」する必要があります。そのため、優先度の高い割り込みが多数ある場合、優先度の低い割り込みは、顕著なさまざまな遅延で処理される可能性があります。極端なケースは、優先度の高い割り込みが際限なく発生し続ける場合です。これは、不適切な設計またはハードウェアの誤動作が原因である可能性があります。
- 他の CPU との通信と相互作用。MP システムでは、割り込みハンドラーがスピンロックを取得して、複数の CPU 間で共有されるリソースへの排他的アクセスを取得する場合があります。競合がある場合、ISR は待機し、現在の ISR がその作業を完了するまで、他のすべての割り込み (または優先度の低いすべての割り込み) は処理されません。
一般的な質問に対する一般的な回答です。
編集:もう1つ言及するのを忘れていました。一部の奇妙な CPU では、特定の命令が反復可能で (x86 を考えてくださいrep movsb
)、反復された命令が完全に終了するまで割り込みの処理を開始できません。これには、1000 回またはそれ以上の単純な個々の命令を実行するのに相当する時間がかかる場合があります。そのため、割り込みが有効になっているにもかかわらず、ISR の実行を開始できない CPU の異常が発生している可能性があります。そのような CPU の 1 つが TI の TMS320C54xx です。これを使用すると、FIR フィルター コードに注意する必要があります。フィルタが長く、繰り返される MAC 命令として実装されている場合、割り込みサービスでレイテンシが発生します。
通常の Linux システムにはナイス値があり、より低いナイス値は典型的な 800 ミリ秒のクォンタ値を持ち、より高いナイス値は 5 ミリ秒のクォンタ値を持ちます。
Linux システムはヒューリスティックを使用して、プロセスがインタラクティブかどうかを判断します。このメモをよく読んでください。
https://www.cs.columbia.edu/~smb/classes/s06-4118/l13.pdf
スケジューラに関しては、Linux が IO バウンドで待機する対話型プロセスの数を追跡するなど、いくつかのデータ構造があります。
プリエンプティブ マルチタスキング以上の Windows では、アプリケーション プログラムは GetMessage() API 呼び出しを介してカーネルをサポートします [Windows GUI プログラムの場合]。システムキューで処理されます。