割り込みとは、実際にはハードウェアまたはソフトウェアによって送信されるIRQ(割り込み要求)と呼ばれる信号です。
割り込みを使用すると、キーボード、シリアル カード、パラレル ポートなどのデバイスが CPU を必要としていることを示すことができます。
CPUが割り込み要求を受信すると、CPUは実行中のプログラムの実行を一時的に停止し、割り込みハンドラーまたは割り込みサービスルーチンと呼ばれる特定のプログラムを呼び出します。
割り込みサービス ルーチンまたは割り込みハンドラーは割り込みベクタ テーブルで見つけることができ、この割り込みベクタ テーブルはメモリ内の固定アドレスに配置されます。割り込みが CPU によって処理された後、以前に中断されたプログラムの実行が再開されます。
実際、マシンが起動すると、システムはすでにすべてのデバイスを識別し、対応する割り込みハンドラーを割り込みテーブルにロードしています。
CPU アテンションを要求するには次の 2 つの方法があります:
1. 割り込みに基づく
2. ポーリングに基づく
すべての Linux オペレーティング システムは割り込みドライバーに基づいています。
キーボードのキーを押すと、キーボードはキーが押されたことを CPU に伝えます。この場合、キーボードの IRQ ラインの電圧が 1 回変化します。この電圧変化はデバイスからのリクエストであり、デバイスが処理する必要のあるリクエストを持っていると言うのと同じです。
/proc/interrupts ファイル
Linux マシンの場合、/proc/interrupts ファイルには、どの割り込みが使用されているか、および各プロセッサが何回割り込まれたかに関する情報が含まれています。 R# CAT /Proc /Interrupts
CPU0 CPU1 CPU2 CPU3
0: 3710374484 0 0 0 IO-APIC-EDGE TIMER
1: 20 0 0 0 IO-APIC-EDGE I8042
6: 5 0 0 0 IO-EDGEGe フロッピー 7 : 0 0 0 IO-APIC エッジ parport0 8: 0 0 0 IO-APIC エッジ rtc 9: 0 0 0 0 IO-APIC レベル acpi
12: 240 0 0 0 IO-APIC エッジ i8042
14: 11200026 0 0 0 IO-APIC エッジ ide0
51: 61281329 0 0 0 IO-APIC レベル ioc0
59: 1 0 0 0 0 IO-APIC レベル vmci
67: 19386473 0 0 0 IO -APIC レベル eth0
75: 94595340 0 0 0 IO-APIC レベル eth1
NMI: 0 0 0 0
LOC: 3737150067 3737142382 3 737145101 3737144204
ERR: 0
MIS: 0
上記のファイルの出力は次のように説明されます:
● 1列目はIRQ番号を示します
● 2列目、3列目、4列目は対応するCPUコアの割り込み回数を示します。上記の例では、timer は割り込み名 (システム クロック) を表します。 3710374484 は、CPU0 が 3710374484 回割り込まれたことを意味します。 i8042 は、キーボードとマウスを制御するキーボード コントローラーを表します。
● NMI と LOC はシステムによって使用されるドライバーであり、ユーザーがアクセスして構成することはできません。
IRQ 番号は、CPU によって処理される必要がある優先度を決定します。 IRQ 番号が小さいほど優先度が高くなります。
たとえば、CPU がキーボードとシステム クロックから同時に割り込みを受信した場合、CPU は IRQ 番号が 0 であるため、最初にシステム クロックを処理します。
● IRQ0: システムクロック (変更不可)
● IRQ3: シリアルポート 2 のシリアルポートコントローラー (シリアルポート 4 がある場合は、この割り込みも使用します)
● IRQ4 : シリアル ポート 1 シリアル ポート コントローラー (シリアル ポート 3 がある場合は、この割り込みも使用します)
● IRQ5: パラレル ポート 2 および 3 またはサウンド カード
● IRQ6: フロッピー ディスク コントローラー
● IRQ7: パラレル ポート 1。プリンターで使用されます。プリンターがない場合は、任意のパラレル ポートで使用できます。
ジョイスティック (またはゲームパッド) の CPU の場合、デバイスが割り込みを送信するのを待ちません。ジョイスティックは主にゲームに使用されるため、ジョイスティックの動きは非常に高速である必要があるため、ポーリングを使用してデバイスが CPU の注意を必要としているかどうかを検出するのが理想的です。ポーリング方式を使用する場合の欠点は、CPU がデバイスを複数回チェックするため、CPU がビジー待機状態になることです。ただし、Linux では、この信号処理方法も不可欠であることに注意してください。
ハード割り込み
上記で説明したシナリオはすべて、ハード割り込みの例です。ハード割り込みは主に 2 つのカテゴリに分類されます:
1. ノンマスカブル割り込み (NMI): この割り込みタイプの文字通りの意味と同様に、この割り込みは CPU によって無視またはキャンセルされません。 NMI は別の割り込みラインで送信され、通常、メモリ エラー、ファン障害、温度センサー障害などの重大なハードウェア エラーに使用されます。
2. マスカブル割り込み: これらの割り込みは CPU によって無視または遅延される可能性があります。このタイプの割り込みは、キャッシュ コントローラーの外部ピンがトリガーされると生成され、割り込みマスク レジスタはそのような割り込みをマスクします。ビットを 0 に設定して、このピンでトリガーされる割り込みを無効にすることができます。
ソフト割り込み
これらの割り込みは、CPU が命令を実行するとき (つまり、プロセスが実行されているとき) に生成されます。これは、命令を実行するときに CPU (正確には、CPU 内の演算ユニット) 自体が例外を生成するためです (ここでの例外はソフト割り込みとしても理解できます)。
たとえば、数値を 0 で除算すると (もちろんこれは不可能です)、ゼロ除算例外が発生し、コンピューターが計算をキャンセルするか、エラー メッセージを表示します。
ファイル /proc/stat には、システム カーネルに関する統計情報と割り込み情報が含まれています。
# cat /proc/stat
cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39 406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 56981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated
intr 行には、システムの起動以降に生成された割り込みの数が表示されます。最初の列は、処理されたすべての割り込みの数を表します。後続の各列は、特定の割り込みの割り込みの合計数を表します。
SMP_AFFINITY
SMP は対称型マルチプロセッサを指します。 smp_affinity ファイルは主に、特定の IRQ がどの CPU コアにバインドされているかを決定するために使用されます。 /proc/irq/IRQ_NUMBER/ ディレクトリに smp_affinity ファイルがあり、このファイルでは CPU コアが 16 進数で表されます。たとえば、ネットワーク カードの割り込み番号は次のとおりです:
grep eth0 /proc/interrupts
67: 23834931 0 0 0 IO-APIC-level eth0
cat /proc/irq/67/smp_afフィニティ
00000000,00000000, 00000000,00000000,00000000 ,00000000,00000000,00000001
上記の 16 進数に対応する 10 進数は 1 です。これは、ネットワーク カード ドライバーに関連するすべての割り込みが CPU0 によって処理されることを意味します。
smp_affinity ファイルの値を手動で変更することで、IRQ を指定した CPU コアにバインドすることも、irqbalance サービスを有効にして IRQ を CPU コアに自動的にバインドすることもできます。
IRQ Balance
Irqbalance は、主に CPU コアに割り込み要求を分散するために使用され、パフォーマンスの向上に役立ちます。その目的は、省電力とパフォーマンスの最適化の間のバランスを追求することです。 yum を使用してインストールできます:
# rpm -qa | grep irqbalance
irqbalance-0.55-15.el5
# yum search irqbalance
# yum install irqbalance.x86_64
B IRQBARANCE サービスの開始後、CPU 上の割り込みの分布は次のようになります。
# Cat /ProC /Interrupts
CPU0 CPU1 CPU2 CPU3
0: 950901695 0 0 IO-Edge Timer
1: 13 0 0 0 IO-APIC - エッジ i8042
6: 96 10989 470 IO-APIC エッジ フロッピー 7: 0 0 0 IO-APIC エッジ parport0
8: 1 1 0 0 IO-APIC エッジ rtc 9: 0 0 0 0 IO-APIC レベルacpi
12: 109 1787 0 0 IO-APIC エッジ i8042 15: 99 84813914 IO-API C エッジ ide1
51: 17371 0 46689970 IO-APIC レベル ioc0 67: 1741 0 0 225409160 PC I-MSI eth0
83: 0 0 0 PCI-MSI vmci
NMI: 0 0 LOC 0
: 950902917 950903742 950901202 950901400
ERR: 0
MIS: 0
Irqbalance は、複数のコアを含むシステム用です。非常に便利です。通常、割り込みは最初の CPU コアによってのみ処理されるためです。
以上がLinux オペレーティング システムでの CPU 割り込みの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。