割り込みは、ハードウェアまたはソフトウェアによって IRQ (割り込み要求ライン) を介して送信される信号です。
割り込みにより、キーボード、シリアル カード、パラレル ポートなどのデバイスは、CPU の注意が必要であることを示すことができます。
CPU が割り込み要求を受信すると、CPU は実行中のプログラムの実行を一時的に停止し、割り込みハンドラーまたは ISR (割り込みサービス ルーチン) と呼ばれる特別なプログラムを呼び出します。
割り込みサービスまたは割り込みハンドラー ルーチンを見つけることができます。メモリ内の固定アドレスに配置されている割り込みベクタ テーブル内。割り込みが処理された後、CPU は割り込まれたプログラムを再開します。
起動時に、システムはすべてのデバイスを識別し、適切な割り込みハンドラが割り込みテーブルにロードされます。
以下は、CPU の注意を要求する 2 つの方法です:
<オール>すべての Linux ベースの OS は割り込み駆動型です。
キーボードのキーを押すと、キーボードはキーが押されたことを CPU に伝えます。ただし、CPU は、RAM、システム クロック、NIC カード、ビデオまたは PCI バスからの処理でビジー状態になることがあります。その場合、キーボードはそのハードウェアに割り当てられた IRQ ラインに電圧をかけます。この場合は [キーボード] です。この電圧の変化は、デバイスに処理が必要な要求があることを示すデバイスからの要求として機能します。
/proc/interrupts ファイル
Linux マシンでは、ファイル /proc/interrupts には、使用中の割り込みに関する情報と、プロセッサーが割り込まれた回数に関する情報が含まれています
# 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-APIC-edge floppy 7: 0 0 0 0 IO-APIC-edge parport0 8: 0 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 240 0 0 0 IO-APIC-edge i8042 14: 11200026 0 0 0 IO-APIC-edge ide0 51: 61281329 0 0 0 IO-APIC-level ioc0 59: 1 0 0 0 IO-APIC-level vmci 67: 19386473 0 0 0 IO-APIC-level eth0 75: 94595340 0 0 0 IO-APIC-level eth1 NMI: 0 0 0 0 LOC: 3737150067 3737142382 3737145101 3737144204 ERR: 0 MIS: 0
上記のファイル内:
- 最初の列は IRQ 番号です。
- 2 番目の列は、CPU コアが中断された回数を示します。上記の例では、timer は割り込み名 [System clock] であり、3710374484 は CPU0 が割り込まれた回数です。 I8042 は、PC の PS/2 キーボードとマウスを制御するキーボード コントローラーです。
- rtc のような割り込みの場合 [リアルタイム クロック] CPU は割り込みを受けていません。 RTC は、時間を追跡するために電子機器に搭載されています。
- NMI と LOC は、システムで使用されるドライバーであり、ユーザーがアクセス/構成することはできません。
IRQ 番号は、CPU が処理する必要がある割り込みの優先順位を決定します。
IRQ 数値が小さいほど、優先順位が高くなります。
たとえば、CPU がキーボードとシステム クロックから同時に割り込みを受信した場合です。 IRQ 番号が 0 であるため、CPU は最初にシステム クロックを提供します。
- IRQ 0 — システムタイマー (変更不可);
- IRQ 1 — キーボード コントローラー (変更不可)
- IRQ 3 — シリアル ポート 2 用のシリアル ポート コントローラ (存在する場合、シリアル ポート 4 と共有);
- IRQ 4 — シリアル ポート 1 用のシリアル ポート コントローラ (存在する場合、シリアル ポート 3 と共有);
- IRQ 5 — パラレルポート 2 および 3 またはサウンドカード;
- IRQ 6 — フロッピー ディスク コントローラ;
- IRQ 7 — パラレル ポート 1。プリンタまたはプリンタが存在しない場合は任意のパラレル ポートに使用されます。
ジョイスティックのようなデバイスの場合、CPU はデバイスが割り込みを送信するのを待ちません。ゲームに使用されるジョイスティックとジョイスティックの動きは速いため、ポーリングを使用してデバイスに注意が必要かどうかを確認するのが理想的です。この方法の欠点は、CPU がデバイスを何度もチェックしてビジー状態になる可能性があることです。
関連して、Linux でシグナルを適切に処理することも不可欠です。
ハードウェア割り込み
上記のシナリオはすべて、ハードウェア割り込みの例です。
ハードウェア割り込みはさらに 2 つの主要なカテゴリに分類されます。
<オール>ソフトウェア割り込み
これらの割り込みは、CPU [ALU ユニット] 自体で例外条件を引き起こす可能性のある命令を CPU が実行するときに生成されます。
たとえば、数値をゼロで割ることは不可能です。ゼロ除算の例外が発生し、コンピューターが計算を中止したり、エラー メッセージを表示したりします。
ファイル /proc/stat は /proc ファイルシステムのファイル部分でもあり、システム カーネル統計に関する情報があり、いくつかの割り込み情報も保持しています。
# cat /proc/stat cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0 cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0 cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0 cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0 cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0 intr 417756956 --- Output Truncated
行 intr は、起動時以降に処理された割り込みの数を示します。最初の列は、処理されたすべての割り込みの合計です。後続の各列は、特定の割り込みの合計です。
SMP_AFFINITY
対称型マルチプロセッシングは、複数のプロセッサによるプログラムの処理です。
smp_affinity ファイルは、IRQ 番号の割り込みアフィニティ値を保持します。各 IRQ 番号に関連付けられた smp_affinity ファイルは、/proc/irq/IRQ_NUMBER/smp_affinity ファイルに保存されます。ファイル内の値は、システム内のすべての CPU コアを表す 16 進数のビットマスクで保存されます。 smp_affinity は、IO-APIC が有効なデバイス ドライバーを持つデバイスで機能します。
たとえば、イーサネット ドライバーの smp_affinity エントリは次のとおりです。
grep eth0 /proc/interrupts 67: 23834931 0 0 0 IO-APIC-level eth0
eth0 の IRQ 番号は 67 で、対応する smp_affinity ファイルは次の場所にあります:
cat /proc/irq/67/smp_affinity 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
値「000000001」に相当する 10 進数は「1」です。つまり、イーサネット ドライバに関連するすべての割り込みは、CPU0 によって処理されます。
特定のコントローラの smp_affinity ファイルの値を変更するか、irqbalance を使用して、プロセッサ アフィニティを手動で変更できます。
IRQバランス
Irqbalance は、コンピュータ システムのプロセッサ コアに割り込みを分散する Linux ユーティリティで、パフォーマンスの向上に役立ちます。
Irqbalance の目標は、省電力と最適なパフォーマンスのバランスを見つけることです。
システムに irqbalance がインストールされていない場合は、以下に示すように yum を使用してインストールしてください。
# rpm -qa | grep irqbalance irqbalance-0.55-15.el5 # yum search irqbalance # yum install irqbalance.x86_64
irqbalance サービスを開始します:
service irqbalance start
以下は、irqbalance がインストールされている Linux マシンからの出力例です。割り込みが CPU 間で分散されていることがわかりました。
# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 950901695 0 0 0 IO-APIC-edge timer 1: 13 0 0 0 IO-APIC-edge i8042 6: 96 10989 470 0 IO-APIC-edge floppy 7: 0 0 0 0 IO-APIC-edge parport0 8: 1 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 109 1787 0 0 IO-APIC-edge i8042 15: 99 84813914 0 0 IO-APIC-edge ide1 51: 17371 0 46689970 0 IO-APIC-level ioc0 67: 1741 0 0 225409160 PCI-MSI eth0 83: 0 0 0 0 PCI-MSI vmci NMI: 0 0 0 0 LOC: 950902917 950903742 950901202 950901400 ERR: 0 MIS: 0
通常、割り込みは最初のコアによってのみ処理されるため、Irqbalance はマルチコア プロセッサを搭載したシステムで特に役立ちます。